Implement the Opaque PRF Input TLS extension
[openssl.git] / ssl / s3_clnt.c
1 /* ssl/s3_clnt.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  * 
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  * 
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  * 
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from 
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  * 
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  * 
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 /* ====================================================================
59  * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
60  *
61  * Redistribution and use in source and binary forms, with or without
62  * modification, are permitted provided that the following conditions
63  * are met:
64  *
65  * 1. Redistributions of source code must retain the above copyright
66  *    notice, this list of conditions and the following disclaimer. 
67  *
68  * 2. Redistributions in binary form must reproduce the above copyright
69  *    notice, this list of conditions and the following disclaimer in
70  *    the documentation and/or other materials provided with the
71  *    distribution.
72  *
73  * 3. All advertising materials mentioning features or use of this
74  *    software must display the following acknowledgment:
75  *    "This product includes software developed by the OpenSSL Project
76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77  *
78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79  *    endorse or promote products derived from this software without
80  *    prior written permission. For written permission, please contact
81  *    openssl-core@openssl.org.
82  *
83  * 5. Products derived from this software may not be called "OpenSSL"
84  *    nor may "OpenSSL" appear in their names without prior written
85  *    permission of the OpenSSL Project.
86  *
87  * 6. Redistributions of any form whatsoever must retain the following
88  *    acknowledgment:
89  *    "This product includes software developed by the OpenSSL Project
90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91  *
92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103  * OF THE POSSIBILITY OF SUCH DAMAGE.
104  * ====================================================================
105  *
106  * This product includes cryptographic software written by Eric Young
107  * (eay@cryptsoft.com).  This product includes software written by Tim
108  * Hudson (tjh@cryptsoft.com).
109  *
110  */
111 /* ====================================================================
112  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
113  *
114  * Portions of the attached software ("Contribution") are developed by 
115  * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
116  *
117  * The Contribution is licensed pursuant to the OpenSSL open source
118  * license provided above.
119  *
120  * ECC cipher suite support in OpenSSL originally written by
121  * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories.
122  *
123  */
124 /* ====================================================================
125  * Copyright 2005 Nokia. All rights reserved.
126  *
127  * The portions of the attached software ("Contribution") is developed by
128  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
129  * license.
130  *
131  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
132  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
133  * support (see RFC 4279) to OpenSSL.
134  *
135  * No patent licenses or other rights except those expressly stated in
136  * the OpenSSL open source license shall be deemed granted or received
137  * expressly, by implication, estoppel, or otherwise.
138  *
139  * No assurances are provided by Nokia that the Contribution does not
140  * infringe the patent or other intellectual property rights of any third
141  * party or that the license provides you with all the necessary rights
142  * to make use of the Contribution.
143  *
144  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
145  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
146  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
147  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
148  * OTHERWISE.
149  */
150
151 #include <stdio.h>
152 #include "ssl_locl.h"
153 #include "kssl_lcl.h"
154 #include <openssl/buffer.h>
155 #include <openssl/rand.h>
156 #include <openssl/objects.h>
157 #include <openssl/evp.h>
158 #include <openssl/md5.h>
159 #ifndef OPENSSL_NO_DH
160 #include <openssl/dh.h>
161 #endif
162 #include <openssl/bn.h>
163
164 static const SSL_METHOD *ssl3_get_client_method(int ver);
165 static int ca_dn_cmp(const X509_NAME * const *a,const X509_NAME * const *b);
166 #ifndef OPENSSL_NO_TLSEXT
167 static int ssl3_check_finished(SSL *s);
168 #endif
169
170 static const SSL_METHOD *ssl3_get_client_method(int ver)
171         {
172         if (ver == SSL3_VERSION)
173                 return(SSLv3_client_method());
174         else
175                 return(NULL);
176         }
177
178 IMPLEMENT_ssl3_meth_func(SSLv3_client_method,
179                         ssl_undefined_function,
180                         ssl3_connect,
181                         ssl3_get_client_method)
182
183 int ssl3_connect(SSL *s)
184         {
185         BUF_MEM *buf=NULL;
186         unsigned long Time=(unsigned long)time(NULL);
187         long num1;
188         void (*cb)(const SSL *ssl,int type,int val)=NULL;
189         int ret= -1;
190         int new_state,state,skip=0;;
191
192         RAND_add(&Time,sizeof(Time),0);
193         ERR_clear_error();
194         clear_sys_error();
195
196         if (s->info_callback != NULL)
197                 cb=s->info_callback;
198         else if (s->ctx->info_callback != NULL)
199                 cb=s->ctx->info_callback;
200         
201         s->in_handshake++;
202         if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); 
203
204         for (;;)
205                 {
206                 state=s->state;
207
208                 switch(s->state)
209                         {
210                 case SSL_ST_RENEGOTIATE:
211                         s->new_session=1;
212                         s->state=SSL_ST_CONNECT;
213                         s->ctx->stats.sess_connect_renegotiate++;
214                         /* break */
215                 case SSL_ST_BEFORE:
216                 case SSL_ST_CONNECT:
217                 case SSL_ST_BEFORE|SSL_ST_CONNECT:
218                 case SSL_ST_OK|SSL_ST_CONNECT:
219
220                         s->server=0;
221                         if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
222
223                         if ((s->version & 0xff00 ) != 0x0300)
224                                 {
225                                 SSLerr(SSL_F_SSL3_CONNECT, ERR_R_INTERNAL_ERROR);
226                                 ret = -1;
227                                 goto end;
228                                 }
229                                 
230                         /* s->version=SSL3_VERSION; */
231                         s->type=SSL_ST_CONNECT;
232
233                         if (s->init_buf == NULL)
234                                 {
235                                 if ((buf=BUF_MEM_new()) == NULL)
236                                         {
237                                         ret= -1;
238                                         goto end;
239                                         }
240                                 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
241                                         {
242                                         ret= -1;
243                                         goto end;
244                                         }
245                                 s->init_buf=buf;
246                                 buf=NULL;
247                                 }
248
249                         if (!ssl3_setup_buffers(s)) { ret= -1; goto end; }
250
251                         /* setup buffing BIO */
252                         if (!ssl_init_wbio_buffer(s,0)) { ret= -1; goto end; }
253
254                         /* don't push the buffering BIO quite yet */
255
256                         ssl3_init_finished_mac(s);
257
258                         s->state=SSL3_ST_CW_CLNT_HELLO_A;
259                         s->ctx->stats.sess_connect++;
260                         s->init_num=0;
261                         break;
262
263                 case SSL3_ST_CW_CLNT_HELLO_A:
264                 case SSL3_ST_CW_CLNT_HELLO_B:
265
266                         s->shutdown=0;
267                         ret=ssl3_client_hello(s);
268                         if (ret <= 0) goto end;
269                         s->state=SSL3_ST_CR_SRVR_HELLO_A;
270                         s->init_num=0;
271
272                         /* turn on buffering for the next lot of output */
273                         if (s->bbio != s->wbio)
274                                 s->wbio=BIO_push(s->bbio,s->wbio);
275
276                         break;
277
278                 case SSL3_ST_CR_SRVR_HELLO_A:
279                 case SSL3_ST_CR_SRVR_HELLO_B:
280                         ret=ssl3_get_server_hello(s);
281                         if (ret <= 0) goto end;
282
283                         if (s->hit)
284                                 s->state=SSL3_ST_CR_FINISHED_A;
285                         else
286                                 s->state=SSL3_ST_CR_CERT_A;
287                         s->init_num=0;
288                         break;
289
290                 case SSL3_ST_CR_CERT_A:
291                 case SSL3_ST_CR_CERT_B:
292 #ifndef OPENSSL_NO_TLSEXT
293                         ret=ssl3_check_finished(s);
294                         if (ret <= 0) goto end;
295                         if (ret == 2)
296                                 {
297                                 s->hit = 1;
298                                 s->state=SSL3_ST_CR_FINISHED_A;
299                                 s->init_num=0;
300                                 break;
301                                 }
302 #endif
303                         /* Check if it is anon DH/ECDH */
304                         /* or PSK */
305                         if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
306                             !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
307                                 {
308                                 ret=ssl3_get_server_certificate(s);
309                                 if (ret <= 0) goto end;
310                                 }
311                         else
312                                 skip=1;
313                         s->state=SSL3_ST_CR_KEY_EXCH_A;
314                         s->init_num=0;
315                         break;
316
317                 case SSL3_ST_CR_KEY_EXCH_A:
318                 case SSL3_ST_CR_KEY_EXCH_B:
319                         ret=ssl3_get_key_exchange(s);
320                         if (ret <= 0) goto end;
321                         s->state=SSL3_ST_CR_CERT_REQ_A;
322                         s->init_num=0;
323
324                         /* at this point we check that we have the
325                          * required stuff from the server */
326                         if (!ssl3_check_cert_and_algorithm(s))
327                                 {
328                                 ret= -1;
329                                 goto end;
330                                 }
331                         break;
332
333                 case SSL3_ST_CR_CERT_REQ_A:
334                 case SSL3_ST_CR_CERT_REQ_B:
335                         ret=ssl3_get_certificate_request(s);
336                         if (ret <= 0) goto end;
337                         s->state=SSL3_ST_CR_SRVR_DONE_A;
338                         s->init_num=0;
339                         break;
340
341                 case SSL3_ST_CR_SRVR_DONE_A:
342                 case SSL3_ST_CR_SRVR_DONE_B:
343                         ret=ssl3_get_server_done(s);
344                         if (ret <= 0) goto end;
345                         if (s->s3->tmp.cert_req)
346                                 s->state=SSL3_ST_CW_CERT_A;
347                         else
348                                 s->state=SSL3_ST_CW_KEY_EXCH_A;
349                         s->init_num=0;
350
351                         break;
352
353                 case SSL3_ST_CW_CERT_A:
354                 case SSL3_ST_CW_CERT_B:
355                 case SSL3_ST_CW_CERT_C:
356                 case SSL3_ST_CW_CERT_D:
357                         ret=ssl3_send_client_certificate(s);
358                         if (ret <= 0) goto end;
359                         s->state=SSL3_ST_CW_KEY_EXCH_A;
360                         s->init_num=0;
361                         break;
362
363                 case SSL3_ST_CW_KEY_EXCH_A:
364                 case SSL3_ST_CW_KEY_EXCH_B:
365                         ret=ssl3_send_client_key_exchange(s);
366                         if (ret <= 0) goto end;
367                         /* EAY EAY EAY need to check for DH fix cert
368                          * sent back */
369                         /* For TLS, cert_req is set to 2, so a cert chain
370                          * of nothing is sent, but no verify packet is sent */
371                         /* XXX: For now, we do not support client 
372                          * authentication in ECDH cipher suites with
373                          * ECDH (rather than ECDSA) certificates.
374                          * We need to skip the certificate verify 
375                          * message when client's ECDH public key is sent 
376                          * inside the client certificate.
377                          */
378                         if (s->s3->tmp.cert_req == 1)
379                                 {
380                                 s->state=SSL3_ST_CW_CERT_VRFY_A;
381                                 }
382                         else
383                                 {
384                                 s->state=SSL3_ST_CW_CHANGE_A;
385                                 s->s3->change_cipher_spec=0;
386                                 }
387
388                         s->init_num=0;
389                         break;
390
391                 case SSL3_ST_CW_CERT_VRFY_A:
392                 case SSL3_ST_CW_CERT_VRFY_B:
393                         ret=ssl3_send_client_verify(s);
394                         if (ret <= 0) goto end;
395                         s->state=SSL3_ST_CW_CHANGE_A;
396                         s->init_num=0;
397                         s->s3->change_cipher_spec=0;
398                         break;
399
400                 case SSL3_ST_CW_CHANGE_A:
401                 case SSL3_ST_CW_CHANGE_B:
402                         ret=ssl3_send_change_cipher_spec(s,
403                                 SSL3_ST_CW_CHANGE_A,SSL3_ST_CW_CHANGE_B);
404                         if (ret <= 0) goto end;
405                         s->state=SSL3_ST_CW_FINISHED_A;
406                         s->init_num=0;
407
408                         s->session->cipher=s->s3->tmp.new_cipher;
409 #ifdef OPENSSL_NO_COMP
410                         s->session->compress_meth=0;
411 #else
412                         if (s->s3->tmp.new_compression == NULL)
413                                 s->session->compress_meth=0;
414                         else
415                                 s->session->compress_meth=
416                                         s->s3->tmp.new_compression->id;
417 #endif
418                         if (!s->method->ssl3_enc->setup_key_block(s))
419                                 {
420                                 ret= -1;
421                                 goto end;
422                                 }
423
424                         if (!s->method->ssl3_enc->change_cipher_state(s,
425                                 SSL3_CHANGE_CIPHER_CLIENT_WRITE))
426                                 {
427                                 ret= -1;
428                                 goto end;
429                                 }
430
431                         break;
432
433                 case SSL3_ST_CW_FINISHED_A:
434                 case SSL3_ST_CW_FINISHED_B:
435                         ret=ssl3_send_finished(s,
436                                 SSL3_ST_CW_FINISHED_A,SSL3_ST_CW_FINISHED_B,
437                                 s->method->ssl3_enc->client_finished_label,
438                                 s->method->ssl3_enc->client_finished_label_len);
439                         if (ret <= 0) goto end;
440                         s->state=SSL3_ST_CW_FLUSH;
441
442                         /* clear flags */
443                         s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
444                         if (s->hit)
445                                 {
446                                 s->s3->tmp.next_state=SSL_ST_OK;
447                                 if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED)
448                                         {
449                                         s->state=SSL_ST_OK;
450                                         s->s3->flags|=SSL3_FLAGS_POP_BUFFER;
451                                         s->s3->delay_buf_pop_ret=0;
452                                         }
453                                 }
454                         else
455                                 {
456 #ifndef OPENSSL_NO_TLSEXT
457                                 /* Allow NewSessionTicket if ticket expected */
458                                 if (s->tlsext_ticket_expected)
459                                         s->s3->tmp.next_state=SSL3_ST_CR_SESSION_TICKET_A;
460                                 else
461 #endif
462                                 
463                                 s->s3->tmp.next_state=SSL3_ST_CR_FINISHED_A;
464                                 }
465                         s->init_num=0;
466                         break;
467
468 #ifndef OPENSSL_NO_TLSEXT
469                 case SSL3_ST_CR_SESSION_TICKET_A:
470                 case SSL3_ST_CR_SESSION_TICKET_B:
471                         ret=ssl3_get_new_session_ticket(s);
472                         if (ret <= 0) goto end;
473                         s->state=SSL3_ST_CR_FINISHED_A;
474                         s->init_num=0;
475                 break;
476 #endif
477
478                 case SSL3_ST_CR_FINISHED_A:
479                 case SSL3_ST_CR_FINISHED_B:
480
481                         ret=ssl3_get_finished(s,SSL3_ST_CR_FINISHED_A,
482                                 SSL3_ST_CR_FINISHED_B);
483                         if (ret <= 0) goto end;
484
485                         if (s->hit)
486                                 s->state=SSL3_ST_CW_CHANGE_A;
487                         else
488                                 s->state=SSL_ST_OK;
489                         s->init_num=0;
490                         break;
491
492                 case SSL3_ST_CW_FLUSH:
493                         /* number of bytes to be flushed */
494                         num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
495                         if (num1 > 0)
496                                 {
497                                 s->rwstate=SSL_WRITING;
498                                 num1=BIO_flush(s->wbio);
499                                 if (num1 <= 0) { ret= -1; goto end; }
500                                 s->rwstate=SSL_NOTHING;
501                                 }
502
503                         s->state=s->s3->tmp.next_state;
504                         break;
505
506                 case SSL_ST_OK:
507                         /* clean a few things up */
508                         ssl3_cleanup_key_block(s);
509
510                         if (s->init_buf != NULL)
511                                 {
512                                 BUF_MEM_free(s->init_buf);
513                                 s->init_buf=NULL;
514                                 }
515
516                         /* If we are not 'joining' the last two packets,
517                          * remove the buffering now */
518                         if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER))
519                                 ssl_free_wbio_buffer(s);
520                         /* else do it later in ssl3_write */
521
522                         s->init_num=0;
523                         s->new_session=0;
524
525                         ssl_update_cache(s,SSL_SESS_CACHE_CLIENT);
526                         if (s->hit) s->ctx->stats.sess_hit++;
527
528                         ret=1;
529                         /* s->server=0; */
530                         s->handshake_func=ssl3_connect;
531                         s->ctx->stats.sess_connect_good++;
532
533                         if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
534
535                         goto end;
536                         /* break; */
537                         
538                 default:
539                         SSLerr(SSL_F_SSL3_CONNECT,SSL_R_UNKNOWN_STATE);
540                         ret= -1;
541                         goto end;
542                         /* break; */
543                         }
544
545                 /* did we do anything */
546                 if (!s->s3->tmp.reuse_message && !skip)
547                         {
548                         if (s->debug)
549                                 {
550                                 if ((ret=BIO_flush(s->wbio)) <= 0)
551                                         goto end;
552                                 }
553
554                         if ((cb != NULL) && (s->state != state))
555                                 {
556                                 new_state=s->state;
557                                 s->state=state;
558                                 cb(s,SSL_CB_CONNECT_LOOP,1);
559                                 s->state=new_state;
560                                 }
561                         }
562                 skip=0;
563                 }
564 end:
565         s->in_handshake--;
566         if (buf != NULL)
567                 BUF_MEM_free(buf);
568         if (cb != NULL)
569                 cb(s,SSL_CB_CONNECT_EXIT,ret);
570         return(ret);
571         }
572
573
574 int ssl3_client_hello(SSL *s)
575         {
576         unsigned char *buf;
577         unsigned char *p,*d;
578         int i;
579         unsigned long Time,l;
580 #ifndef OPENSSL_NO_COMP
581         int j;
582         SSL_COMP *comp;
583 #endif
584
585         buf=(unsigned char *)s->init_buf->data;
586         if (s->state == SSL3_ST_CW_CLNT_HELLO_A)
587                 {
588                 if ((s->session == NULL) ||
589                         (s->session->ssl_version != s->version) ||
590                         (s->session->not_resumable))
591                         {
592                         if (!ssl_get_new_session(s,0))
593                                 goto err;
594                         }
595                 /* else use the pre-loaded session */
596
597                 p=s->s3->client_random;
598                 Time=(unsigned long)time(NULL);                 /* Time */
599                 l2n(Time,p);
600                 if (RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-4) <= 0)
601                         goto err;
602
603                 /* Do the message type and length last */
604                 d=p= &(buf[4]);
605
606                 *(p++)=s->version>>8;
607                 *(p++)=s->version&0xff;
608                 s->client_version=s->version;
609
610                 /* Random stuff */
611                 memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
612                 p+=SSL3_RANDOM_SIZE;
613
614                 /* Session ID */
615                 if (s->new_session)
616                         i=0;
617                 else
618                         i=s->session->session_id_length;
619                 *(p++)=i;
620                 if (i != 0)
621                         {
622                         if (i > (int)sizeof(s->session->session_id))
623                                 {
624                                 SSLerr(SSL_F_SSL3_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
625                                 goto err;
626                                 }
627                         memcpy(p,s->session->session_id,i);
628                         p+=i;
629                         }
630                 
631                 /* Ciphers supported */
632                 i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),0);
633                 if (i == 0)
634                         {
635                         SSLerr(SSL_F_SSL3_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
636                         goto err;
637                         }
638                 s2n(i,p);
639                 p+=i;
640
641                 /* COMPRESSION */
642 #ifdef OPENSSL_NO_COMP
643                 *(p++)=1;
644 #else
645
646                 if ((s->options & SSL_OP_NO_COMPRESSION)
647                                         || !s->ctx->comp_methods)
648                         j=0;
649                 else
650                         j=sk_SSL_COMP_num(s->ctx->comp_methods);
651                 *(p++)=1+j;
652                 for (i=0; i<j; i++)
653                         {
654                         comp=sk_SSL_COMP_value(s->ctx->comp_methods,i);
655                         *(p++)=comp->id;
656                         }
657 #endif
658                 *(p++)=0; /* Add the NULL method */
659
660 #ifndef OPENSSL_NO_TLSEXT
661                 /* TLS extensions*/
662                 if (ssl_prepare_clienthello_tlsext(s) <= 0)
663                         {
664                         SSLerr(SSL_F_SSL3_CLIENT_HELLO,SSL_R_CLIENTHELLO_TLSEXT);
665                         goto err;
666                         }
667                 if ((p = ssl_add_clienthello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL)
668                         {
669                         SSLerr(SSL_F_SSL3_CLIENT_HELLO,ERR_R_INTERNAL_ERROR);
670                         goto err;
671                         }
672 #endif
673                 
674                 l=(p-d);
675                 d=buf;
676                 *(d++)=SSL3_MT_CLIENT_HELLO;
677                 l2n3(l,d);
678
679                 s->state=SSL3_ST_CW_CLNT_HELLO_B;
680                 /* number of bytes to write */
681                 s->init_num=p-buf;
682                 s->init_off=0;
683                 }
684
685         /* SSL3_ST_CW_CLNT_HELLO_B */
686         return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
687 err:
688         return(-1);
689         }
690
691 int ssl3_get_server_hello(SSL *s)
692         {
693         STACK_OF(SSL_CIPHER) *sk;
694         SSL_CIPHER *c;
695         unsigned char *p,*d;
696         int i,al,ok;
697         unsigned int j;
698         long n;
699 #ifndef OPENSSL_NO_COMP
700         SSL_COMP *comp;
701 #endif
702
703         n=s->method->ssl_get_message(s,
704                 SSL3_ST_CR_SRVR_HELLO_A,
705                 SSL3_ST_CR_SRVR_HELLO_B,
706                 -1,
707                 20000, /* ?? */
708                 &ok);
709
710         if (!ok) return((int)n);
711
712         if ( SSL_version(s) == DTLS1_VERSION)
713                 {
714                 if ( s->s3->tmp.message_type == DTLS1_MT_HELLO_VERIFY_REQUEST)
715                         {
716                         if ( s->d1->send_cookie == 0)
717                                 {
718                                 s->s3->tmp.reuse_message = 1;
719                                 return 1;
720                                 }
721                         else /* already sent a cookie */
722                                 {
723                                 al=SSL_AD_UNEXPECTED_MESSAGE;
724                                 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_MESSAGE_TYPE);
725                                 goto f_err;
726                                 }
727                         }
728                 }
729         
730         if ( s->s3->tmp.message_type != SSL3_MT_SERVER_HELLO)
731                 {
732                 al=SSL_AD_UNEXPECTED_MESSAGE;
733                 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_MESSAGE_TYPE);
734                 goto f_err;
735                 }
736
737         d=p=(unsigned char *)s->init_msg;
738
739         if ((p[0] != (s->version>>8)) || (p[1] != (s->version&0xff)))
740                 {
741                 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_SSL_VERSION);
742                 s->version=(s->version&0xff00)|p[1];
743                 al=SSL_AD_PROTOCOL_VERSION;
744                 goto f_err;
745                 }
746         p+=2;
747
748         /* load the server hello data */
749         /* load the server random */
750         memcpy(s->s3->server_random,p,SSL3_RANDOM_SIZE);
751         p+=SSL3_RANDOM_SIZE;
752
753         /* get the session-id */
754         j= *(p++);
755
756         if ((j > sizeof s->session->session_id) || (j > SSL3_SESSION_ID_SIZE))
757                 {
758                 al=SSL_AD_ILLEGAL_PARAMETER;
759                 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SSL3_SESSION_ID_TOO_LONG);
760                 goto f_err;
761                 }
762
763         if (j != 0 && j == s->session->session_id_length
764             && memcmp(p,s->session->session_id,j) == 0)
765             {
766             if(s->sid_ctx_length != s->session->sid_ctx_length
767                || memcmp(s->session->sid_ctx,s->sid_ctx,s->sid_ctx_length))
768                 {
769                 /* actually a client application bug */
770                 al=SSL_AD_ILLEGAL_PARAMETER;
771                 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
772                 goto f_err;
773                 }
774             s->hit=1;
775             }
776         else    /* a miss or crap from the other end */
777                 {
778                 /* If we were trying for session-id reuse, make a new
779                  * SSL_SESSION so we don't stuff up other people */
780                 s->hit=0;
781                 if (s->session->session_id_length > 0)
782                         {
783                         if (!ssl_get_new_session(s,0))
784                                 {
785                                 al=SSL_AD_INTERNAL_ERROR;
786                                 goto f_err;
787                                 }
788                         }
789                 s->session->session_id_length=j;
790                 memcpy(s->session->session_id,p,j); /* j could be 0 */
791                 }
792         p+=j;
793         c=ssl_get_cipher_by_char(s,p);
794         if (c == NULL)
795                 {
796                 /* unknown cipher */
797                 al=SSL_AD_ILLEGAL_PARAMETER;
798                 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNKNOWN_CIPHER_RETURNED);
799                 goto f_err;
800                 }
801         p+=ssl_put_cipher_by_char(s,NULL,NULL);
802
803         sk=ssl_get_ciphers_by_id(s);
804         i=sk_SSL_CIPHER_find(sk,c);
805         if (i < 0)
806                 {
807                 /* we did not say we would use this cipher */
808                 al=SSL_AD_ILLEGAL_PARAMETER;
809                 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_CIPHER_RETURNED);
810                 goto f_err;
811                 }
812
813         /* Depending on the session caching (internal/external), the cipher
814            and/or cipher_id values may not be set. Make sure that
815            cipher_id is set and use it for comparison. */
816         if (s->session->cipher)
817                 s->session->cipher_id = s->session->cipher->id;
818         if (s->hit && (s->session->cipher_id != c->id))
819                 {
820                 if (!(s->options &
821                         SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG))
822                         {
823                         al=SSL_AD_ILLEGAL_PARAMETER;
824                         SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED);
825                         goto f_err;
826                         }
827                 }
828         s->s3->tmp.new_cipher=c;
829         ssl3_digest_cached_records(s);
830
831         /* lets get the compression algorithm */
832         /* COMPRESSION */
833 #ifdef OPENSSL_NO_COMP
834         if (*(p++) != 0)
835                 {
836                 al=SSL_AD_ILLEGAL_PARAMETER;
837                 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
838                 goto f_err;
839                 }
840 #else
841         j= *(p++);
842         if ((j == 0) || (s->options & SSL_OP_NO_COMPRESSION))
843                 comp=NULL;
844         else
845                 comp=ssl3_comp_find(s->ctx->comp_methods,j);
846         
847         if ((j != 0) && (comp == NULL))
848                 {
849                 al=SSL_AD_ILLEGAL_PARAMETER;
850                 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
851                 goto f_err;
852                 }
853         else
854                 {
855                 s->s3->tmp.new_compression=comp;
856                 }
857 #endif
858
859 #ifndef OPENSSL_NO_TLSEXT
860         /* TLS extensions*/
861         if (s->version > SSL3_VERSION)
862                 {
863                 if (!ssl_parse_serverhello_tlsext(s,&p,d,n, &al))
864                         {
865                         /* 'al' set by ssl_parse_serverhello_tlsext */
866                         SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_PARSE_TLSEXT);
867                         goto f_err; 
868                         }
869                 if (ssl_check_serverhello_tlsext(s) <= 0)
870                         {
871                         SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SERVERHELLO_TLSEXT);
872                                 goto err;
873                         }
874                 }
875 #endif
876
877         if (p != (d+n))
878                 {
879                 /* wrong packet length */
880                 al=SSL_AD_DECODE_ERROR;
881                 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_PACKET_LENGTH);
882                 goto err;
883                 }
884
885         return(1);
886 f_err:
887         ssl3_send_alert(s,SSL3_AL_FATAL,al);
888 err:
889         return(-1);
890         }
891
892 int ssl3_get_server_certificate(SSL *s)
893         {
894         int al,i,ok,ret= -1;
895         unsigned long n,nc,llen,l;
896         X509 *x=NULL;
897         const unsigned char *q,*p;
898         unsigned char *d;
899         STACK_OF(X509) *sk=NULL;
900         SESS_CERT *sc;
901         EVP_PKEY *pkey=NULL;
902         int need_cert = 1; /* VRS: 0=> will allow null cert if auth == KRB5 */
903
904         n=s->method->ssl_get_message(s,
905                 SSL3_ST_CR_CERT_A,
906                 SSL3_ST_CR_CERT_B,
907                 -1,
908                 s->max_cert_list,
909                 &ok);
910
911         if (!ok) return((int)n);
912
913         if (s->s3->tmp.message_type == SSL3_MT_SERVER_KEY_EXCHANGE)
914                 {
915                 s->s3->tmp.reuse_message=1;
916                 return(1);
917                 }
918
919         if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
920                 {
921                 al=SSL_AD_UNEXPECTED_MESSAGE;
922                 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_BAD_MESSAGE_TYPE);
923                 goto f_err;
924                 }
925         p=d=(unsigned char *)s->init_msg;
926
927         if ((sk=sk_X509_new_null()) == NULL)
928                 {
929                 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
930                 goto err;
931                 }
932
933         n2l3(p,llen);
934         if (llen+3 != n)
935                 {
936                 al=SSL_AD_DECODE_ERROR;
937                 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_LENGTH_MISMATCH);
938                 goto f_err;
939                 }
940         for (nc=0; nc<llen; )
941                 {
942                 n2l3(p,l);
943                 if ((l+nc+3) > llen)
944                         {
945                         al=SSL_AD_DECODE_ERROR;
946                         SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
947                         goto f_err;
948                         }
949
950                 q=p;
951                 x=d2i_X509(NULL,&q,l);
952                 if (x == NULL)
953                         {
954                         al=SSL_AD_BAD_CERTIFICATE;
955                         SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_ASN1_LIB);
956                         goto f_err;
957                         }
958                 if (q != (p+l))
959                         {
960                         al=SSL_AD_DECODE_ERROR;
961                         SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
962                         goto f_err;
963                         }
964                 if (!sk_X509_push(sk,x))
965                         {
966                         SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
967                         goto err;
968                         }
969                 x=NULL;
970                 nc+=l+3;
971                 p=q;
972                 }
973
974         i=ssl_verify_cert_chain(s,sk);
975         if ((s->verify_mode != SSL_VERIFY_NONE) && (!i)
976 #ifndef OPENSSL_NO_KRB5
977             && !((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kKRB5) &&
978                  (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5))
979 #endif /* OPENSSL_NO_KRB5 */
980                 )
981                 {
982                 al=ssl_verify_alarm_type(s->verify_result);
983                 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
984                 goto f_err; 
985                 }
986         ERR_clear_error(); /* but we keep s->verify_result */
987
988         sc=ssl_sess_cert_new();
989         if (sc == NULL) goto err;
990
991         if (s->session->sess_cert) ssl_sess_cert_free(s->session->sess_cert);
992         s->session->sess_cert=sc;
993
994         sc->cert_chain=sk;
995         /* Inconsistency alert: cert_chain does include the peer's
996          * certificate, which we don't include in s3_srvr.c */
997         x=sk_X509_value(sk,0);
998         sk=NULL;
999         /* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/
1000
1001         pkey=X509_get_pubkey(x);
1002
1003         /* VRS: allow null cert if auth == KRB5 */
1004         need_cert = ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kKRB5) &&
1005                     (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5))
1006                     ? 0 : 1;
1007
1008 #ifdef KSSL_DEBUG
1009         printf("pkey,x = %p, %p\n", pkey,x);
1010         printf("ssl_cert_type(x,pkey) = %d\n", ssl_cert_type(x,pkey));
1011         printf("cipher, alg, nc = %s, %lx, %lx, %d\n", s->s3->tmp.new_cipher->name,
1012                 s->s3->tmp.new_cipher->algorithm_mkey, s->s3->tmp.new_cipher->algorithm_auth, need_cert);
1013 #endif    /* KSSL_DEBUG */
1014
1015         if (need_cert && ((pkey == NULL) || EVP_PKEY_missing_parameters(pkey)))
1016                 {
1017                 x=NULL;
1018                 al=SSL3_AL_FATAL;
1019                 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
1020                         SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS);
1021                 goto f_err;
1022                 }
1023
1024         i=ssl_cert_type(x,pkey);
1025         if (need_cert && i < 0)
1026                 {
1027                 x=NULL;
1028                 al=SSL3_AL_FATAL;
1029                 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
1030                         SSL_R_UNKNOWN_CERTIFICATE_TYPE);
1031                 goto f_err;
1032                 }
1033
1034         if (need_cert)
1035                 {
1036                 sc->peer_cert_type=i;
1037                 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
1038                 /* Why would the following ever happen?
1039                  * We just created sc a couple of lines ago. */
1040                 if (sc->peer_pkeys[i].x509 != NULL)
1041                         X509_free(sc->peer_pkeys[i].x509);
1042                 sc->peer_pkeys[i].x509=x;
1043                 sc->peer_key= &(sc->peer_pkeys[i]);
1044
1045                 if (s->session->peer != NULL)
1046                         X509_free(s->session->peer);
1047                 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
1048                 s->session->peer=x;
1049                 }
1050         else
1051                 {
1052                 sc->peer_cert_type=i;
1053                 sc->peer_key= NULL;
1054
1055                 if (s->session->peer != NULL)
1056                         X509_free(s->session->peer);
1057                 s->session->peer=NULL;
1058                 }
1059         s->session->verify_result = s->verify_result;
1060
1061         x=NULL;
1062         ret=1;
1063
1064         if (0)
1065                 {
1066 f_err:
1067                 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1068                 }
1069 err:
1070         EVP_PKEY_free(pkey);
1071         X509_free(x);
1072         sk_X509_pop_free(sk,X509_free);
1073         return(ret);
1074         }
1075
1076 int ssl3_get_key_exchange(SSL *s)
1077         {
1078 #ifndef OPENSSL_NO_RSA
1079         unsigned char *q,md_buf[EVP_MAX_MD_SIZE*2];
1080 #endif
1081         EVP_MD_CTX md_ctx;
1082         unsigned char *param,*p;
1083         int al,i,j,param_len,ok;
1084         long n,alg_k,alg_a;
1085         EVP_PKEY *pkey=NULL;
1086 #ifndef OPENSSL_NO_RSA
1087         RSA *rsa=NULL;
1088 #endif
1089 #ifndef OPENSSL_NO_DH
1090         DH *dh=NULL;
1091 #endif
1092 #ifndef OPENSSL_NO_ECDH
1093         EC_KEY *ecdh = NULL;
1094         BN_CTX *bn_ctx = NULL;
1095         EC_POINT *srvr_ecpoint = NULL;
1096         int curve_nid = 0;
1097         int encoded_pt_len = 0;
1098 #endif
1099
1100         /* use same message size as in ssl3_get_certificate_request()
1101          * as ServerKeyExchange message may be skipped */
1102         n=s->method->ssl_get_message(s,
1103                 SSL3_ST_CR_KEY_EXCH_A,
1104                 SSL3_ST_CR_KEY_EXCH_B,
1105                 -1,
1106                 s->max_cert_list,
1107                 &ok);
1108         if (!ok) return((int)n);
1109
1110         if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE)
1111                 {
1112 #ifndef OPENSSL_NO_PSK
1113                 /* In plain PSK ciphersuite, ServerKeyExchange can be
1114                    omitted if no identity hint is sent. Set
1115                    session->sess_cert anyway to avoid problems
1116                    later.*/
1117                 if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)
1118                         {
1119                         s->session->sess_cert=ssl_sess_cert_new();
1120                         if (s->ctx->psk_identity_hint)
1121                                 OPENSSL_free(s->ctx->psk_identity_hint);
1122                         s->ctx->psk_identity_hint = NULL;
1123                         }
1124 #endif
1125                 s->s3->tmp.reuse_message=1;
1126                 return(1);
1127                 }
1128
1129         param=p=(unsigned char *)s->init_msg;
1130         if (s->session->sess_cert != NULL)
1131                 {
1132 #ifndef OPENSSL_NO_RSA
1133                 if (s->session->sess_cert->peer_rsa_tmp != NULL)
1134                         {
1135                         RSA_free(s->session->sess_cert->peer_rsa_tmp);
1136                         s->session->sess_cert->peer_rsa_tmp=NULL;
1137                         }
1138 #endif
1139 #ifndef OPENSSL_NO_DH
1140                 if (s->session->sess_cert->peer_dh_tmp)
1141                         {
1142                         DH_free(s->session->sess_cert->peer_dh_tmp);
1143                         s->session->sess_cert->peer_dh_tmp=NULL;
1144                         }
1145 #endif
1146 #ifndef OPENSSL_NO_ECDH
1147                 if (s->session->sess_cert->peer_ecdh_tmp)
1148                         {
1149                         EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp);
1150                         s->session->sess_cert->peer_ecdh_tmp=NULL;
1151                         }
1152 #endif
1153                 }
1154         else
1155                 {
1156                 s->session->sess_cert=ssl_sess_cert_new();
1157                 }
1158
1159         param_len=0;
1160         alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
1161         alg_a=s->s3->tmp.new_cipher->algorithm_auth;
1162         EVP_MD_CTX_init(&md_ctx);
1163
1164 #ifndef OPENSSL_NO_PSK
1165         if (alg_k & SSL_kPSK)
1166                 {
1167                 char tmp_id_hint[PSK_MAX_IDENTITY_LEN+1];
1168
1169                 al=SSL_AD_HANDSHAKE_FAILURE;
1170                 n2s(p,i);
1171                 param_len=i+2;
1172                 /* Store PSK identity hint for later use, hint is used
1173                  * in ssl3_send_client_key_exchange.  Assume that the
1174                  * maximum length of a PSK identity hint can be as
1175                  * long as the maximum length of a PSK identity. */
1176                 if (i > PSK_MAX_IDENTITY_LEN)
1177                         {
1178                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1179                                 SSL_R_DATA_LENGTH_TOO_LONG);
1180                         goto f_err;
1181                         }
1182                 if (param_len > n)
1183                         {
1184                         al=SSL_AD_DECODE_ERROR;
1185                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1186                                 SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH);
1187                         goto f_err;
1188                         }
1189                 /* If received PSK identity hint contains NULL
1190                  * characters, the hint is truncated from the first
1191                  * NULL. p may not be ending with NULL, so create a
1192                  * NULL-terminated string. */
1193                 memcpy(tmp_id_hint, p, i);
1194                 memset(tmp_id_hint+i, 0, PSK_MAX_IDENTITY_LEN+1-i);
1195                 if (s->ctx->psk_identity_hint != NULL)
1196                         OPENSSL_free(s->ctx->psk_identity_hint);
1197                 s->ctx->psk_identity_hint = BUF_strdup(tmp_id_hint);
1198                 if (s->ctx->psk_identity_hint == NULL)
1199                         {
1200                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE);
1201                         goto f_err;
1202                         }          
1203
1204                 p+=i;
1205                 n-=param_len;
1206                 }
1207         else
1208 #endif /* !OPENSSL_NO_PSK */
1209 #ifndef OPENSSL_NO_RSA
1210         if (alg_k & SSL_kRSA)
1211                 {
1212                 if ((rsa=RSA_new()) == NULL)
1213                         {
1214                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1215                         goto err;
1216                         }
1217                 n2s(p,i);
1218                 param_len=i+2;
1219                 if (param_len > n)
1220                         {
1221                         al=SSL_AD_DECODE_ERROR;
1222                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_MODULUS_LENGTH);
1223                         goto f_err;
1224                         }
1225                 if (!(rsa->n=BN_bin2bn(p,i,rsa->n)))
1226                         {
1227                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1228                         goto err;
1229                         }
1230                 p+=i;
1231
1232                 n2s(p,i);
1233                 param_len+=i+2;
1234                 if (param_len > n)
1235                         {
1236                         al=SSL_AD_DECODE_ERROR;
1237                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_E_LENGTH);
1238                         goto f_err;
1239                         }
1240                 if (!(rsa->e=BN_bin2bn(p,i,rsa->e)))
1241                         {
1242                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1243                         goto err;
1244                         }
1245                 p+=i;
1246                 n-=param_len;
1247
1248                 /* this should be because we are using an export cipher */
1249                 if (alg_a & SSL_aRSA)
1250                         pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1251                 else
1252                         {
1253                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1254                         goto err;
1255                         }
1256                 s->session->sess_cert->peer_rsa_tmp=rsa;
1257                 rsa=NULL;
1258                 }
1259 #else /* OPENSSL_NO_RSA */
1260         if (0)
1261                 ;
1262 #endif
1263 #ifndef OPENSSL_NO_DH
1264         else if (alg_k & SSL_kEDH)
1265                 {
1266                 if ((dh=DH_new()) == NULL)
1267                         {
1268                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_DH_LIB);
1269                         goto err;
1270                         }
1271                 n2s(p,i);
1272                 param_len=i+2;
1273                 if (param_len > n)
1274                         {
1275                         al=SSL_AD_DECODE_ERROR;
1276                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_P_LENGTH);
1277                         goto f_err;
1278                         }
1279                 if (!(dh->p=BN_bin2bn(p,i,NULL)))
1280                         {
1281                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1282                         goto err;
1283                         }
1284                 p+=i;
1285
1286                 n2s(p,i);
1287                 param_len+=i+2;
1288                 if (param_len > n)
1289                         {
1290                         al=SSL_AD_DECODE_ERROR;
1291                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_G_LENGTH);
1292                         goto f_err;
1293                         }
1294                 if (!(dh->g=BN_bin2bn(p,i,NULL)))
1295                         {
1296                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1297                         goto err;
1298                         }
1299                 p+=i;
1300
1301                 n2s(p,i);
1302                 param_len+=i+2;
1303                 if (param_len > n)
1304                         {
1305                         al=SSL_AD_DECODE_ERROR;
1306                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_PUB_KEY_LENGTH);
1307                         goto f_err;
1308                         }
1309                 if (!(dh->pub_key=BN_bin2bn(p,i,NULL)))
1310                         {
1311                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1312                         goto err;
1313                         }
1314                 p+=i;
1315                 n-=param_len;
1316
1317 #ifndef OPENSSL_NO_RSA
1318                 if (alg_a & SSL_aRSA)
1319                         pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1320 #else
1321                 if (0)
1322                         ;
1323 #endif
1324 #ifndef OPENSSL_NO_DSA
1325                 else if (alg_a & SSL_aDSS)
1326                         pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509);
1327 #endif
1328                 /* else anonymous DH, so no certificate or pkey. */
1329
1330                 s->session->sess_cert->peer_dh_tmp=dh;
1331                 dh=NULL;
1332                 }
1333         else if ((alg_k & SSL_kDHr) || (alg_k & SSL_kDHd))
1334                 {
1335                 al=SSL_AD_ILLEGAL_PARAMETER;
1336                 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
1337                 goto f_err;
1338                 }
1339 #endif /* !OPENSSL_NO_DH */
1340
1341 #ifndef OPENSSL_NO_ECDH
1342         else if (alg_k & SSL_kEECDH)
1343                 {
1344                 EC_GROUP *ngroup;
1345                 const EC_GROUP *group;
1346
1347                 if ((ecdh=EC_KEY_new()) == NULL)
1348                         {
1349                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1350                         goto err;
1351                         }
1352
1353                 /* Extract elliptic curve parameters and the
1354                  * server's ephemeral ECDH public key.
1355                  * Keep accumulating lengths of various components in
1356                  * param_len and make sure it never exceeds n.
1357                  */
1358
1359                 /* XXX: For now we only support named (not generic) curves
1360                  * and the ECParameters in this case is just three bytes.
1361                  */
1362                 param_len=3;
1363                 if ((param_len > n) ||
1364                     (*p != NAMED_CURVE_TYPE) || 
1365                     ((curve_nid = tls1_ec_curve_id2nid(*(p + 2))) == 0)) 
1366                         {
1367                         al=SSL_AD_INTERNAL_ERROR;
1368                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS);
1369                         goto f_err;
1370                         }
1371
1372                 ngroup = EC_GROUP_new_by_curve_name(curve_nid);
1373                 if (ngroup == NULL)
1374                         {
1375                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_EC_LIB);
1376                         goto err;
1377                         }
1378                 if (EC_KEY_set_group(ecdh, ngroup) == 0)
1379                         {
1380                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_EC_LIB);
1381                         goto err;
1382                         }
1383                 EC_GROUP_free(ngroup);
1384
1385                 group = EC_KEY_get0_group(ecdh);
1386
1387                 if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) &&
1388                     (EC_GROUP_get_degree(group) > 163))
1389                         {
1390                         al=SSL_AD_EXPORT_RESTRICTION;
1391                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER);
1392                         goto f_err;
1393                         }
1394
1395                 p+=3;
1396
1397                 /* Next, get the encoded ECPoint */
1398                 if (((srvr_ecpoint = EC_POINT_new(group)) == NULL) ||
1399                     ((bn_ctx = BN_CTX_new()) == NULL))
1400                         {
1401                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1402                         goto err;
1403                         }
1404
1405                 encoded_pt_len = *p;  /* length of encoded point */
1406                 p+=1;
1407                 param_len += (1 + encoded_pt_len);
1408                 if ((param_len > n) ||
1409                     (EC_POINT_oct2point(group, srvr_ecpoint, 
1410                         p, encoded_pt_len, bn_ctx) == 0))
1411                         {
1412                         al=SSL_AD_DECODE_ERROR;
1413                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_ECPOINT);
1414                         goto f_err;
1415                         }
1416
1417                 n-=param_len;
1418                 p+=encoded_pt_len;
1419
1420                 /* The ECC/TLS specification does not mention
1421                  * the use of DSA to sign ECParameters in the server
1422                  * key exchange message. We do support RSA and ECDSA.
1423                  */
1424                 if (0) ;
1425 #ifndef OPENSSL_NO_RSA
1426                 else if (alg_a & SSL_aRSA)
1427                         pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1428 #endif
1429 #ifndef OPENSSL_NO_ECDSA
1430                 else if (alg_a & SSL_aECDSA)
1431                         pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
1432 #endif
1433                 /* else anonymous ECDH, so no certificate or pkey. */
1434                 EC_KEY_set_public_key(ecdh, srvr_ecpoint);
1435                 s->session->sess_cert->peer_ecdh_tmp=ecdh;
1436                 ecdh=NULL;
1437                 BN_CTX_free(bn_ctx);
1438                 EC_POINT_free(srvr_ecpoint);
1439                 srvr_ecpoint = NULL;
1440                 }
1441         else if (alg_k)
1442                 {
1443                 al=SSL_AD_UNEXPECTED_MESSAGE;
1444                 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
1445                 goto f_err;
1446                 }
1447 #endif /* !OPENSSL_NO_ECDH */
1448
1449
1450         /* p points to the next byte, there are 'n' bytes left */
1451
1452         /* if it was signed, check the signature */
1453         if (pkey != NULL)
1454                 {
1455                 n2s(p,i);
1456                 n-=2;
1457                 j=EVP_PKEY_size(pkey);
1458
1459                 if ((i != n) || (n > j) || (n <= 0))
1460                         {
1461                         /* wrong packet length */
1462                         al=SSL_AD_DECODE_ERROR;
1463                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_WRONG_SIGNATURE_LENGTH);
1464                         goto f_err;
1465                         }
1466
1467 #ifndef OPENSSL_NO_RSA
1468                 if (pkey->type == EVP_PKEY_RSA)
1469                         {
1470                         int num;
1471
1472                         j=0;
1473                         q=md_buf;
1474                         for (num=2; num > 0; num--)
1475                                 {
1476                                 EVP_DigestInit_ex(&md_ctx,(num == 2)
1477                                         ?s->ctx->md5:s->ctx->sha1, NULL);
1478                                 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1479                                 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1480                                 EVP_DigestUpdate(&md_ctx,param,param_len);
1481                                 EVP_DigestFinal_ex(&md_ctx,q,(unsigned int *)&i);
1482                                 q+=i;
1483                                 j+=i;
1484                                 }
1485                         i=RSA_verify(NID_md5_sha1, md_buf, j, p, n,
1486                                                                 pkey->pkey.rsa);
1487                         if (i < 0)
1488                                 {
1489                                 al=SSL_AD_DECRYPT_ERROR;
1490                                 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
1491                                 goto f_err;
1492                                 }
1493                         if (i == 0)
1494                                 {
1495                                 /* bad signature */
1496                                 al=SSL_AD_DECRYPT_ERROR;
1497                                 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);
1498                                 goto f_err;
1499                                 }
1500                         }
1501                 else
1502 #endif
1503 #ifndef OPENSSL_NO_DSA
1504                         if (pkey->type == EVP_PKEY_DSA)
1505                         {
1506                         /* lets do DSS */
1507                         EVP_VerifyInit_ex(&md_ctx,EVP_dss1(), NULL);
1508                         EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1509                         EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1510                         EVP_VerifyUpdate(&md_ctx,param,param_len);
1511                         if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
1512                                 {
1513                                 /* bad signature */
1514                                 al=SSL_AD_DECRYPT_ERROR;
1515                                 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);
1516                                 goto f_err;
1517                                 }
1518                         }
1519                 else
1520 #endif
1521 #ifndef OPENSSL_NO_ECDSA
1522                         if (pkey->type == EVP_PKEY_EC)
1523                         {
1524                         /* let's do ECDSA */
1525                         EVP_VerifyInit_ex(&md_ctx,EVP_ecdsa(), NULL);
1526                         EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1527                         EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1528                         EVP_VerifyUpdate(&md_ctx,param,param_len);
1529                         if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
1530                                 {
1531                                 /* bad signature */
1532                                 al=SSL_AD_DECRYPT_ERROR;
1533                                 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);
1534                                 goto f_err;
1535                                 }
1536                         }
1537                 else
1538 #endif
1539                         {
1540                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1541                         goto err;
1542                         }
1543                 }
1544         else
1545                 {
1546                 if (!(alg_a & SSL_aNULL) && !(alg_k & SSL_kPSK))
1547                         /* aNULL or kPSK do not need public keys */
1548                         {
1549                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1550                         goto err;
1551                         }
1552                 /* still data left over */
1553                 if (n != 0)
1554                         {
1555                         al=SSL_AD_DECODE_ERROR;
1556                         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_EXTRA_DATA_IN_MESSAGE);
1557                         goto f_err;
1558                         }
1559                 }
1560         EVP_PKEY_free(pkey);
1561         EVP_MD_CTX_cleanup(&md_ctx);
1562         return(1);
1563 f_err:
1564         ssl3_send_alert(s,SSL3_AL_FATAL,al);
1565 err:
1566         EVP_PKEY_free(pkey);
1567 #ifndef OPENSSL_NO_RSA
1568         if (rsa != NULL)
1569                 RSA_free(rsa);
1570 #endif
1571 #ifndef OPENSSL_NO_DH
1572         if (dh != NULL)
1573                 DH_free(dh);
1574 #endif
1575 #ifndef OPENSSL_NO_ECDH
1576         BN_CTX_free(bn_ctx);
1577         EC_POINT_free(srvr_ecpoint);
1578         if (ecdh != NULL)
1579                 EC_KEY_free(ecdh);
1580 #endif
1581         EVP_MD_CTX_cleanup(&md_ctx);
1582         return(-1);
1583         }
1584
1585 int ssl3_get_certificate_request(SSL *s)
1586         {
1587         int ok,ret=0;
1588         unsigned long n,nc,l;
1589         unsigned int llen,ctype_num,i;
1590         X509_NAME *xn=NULL;
1591         const unsigned char *p,*q;
1592         unsigned char *d;
1593         STACK_OF(X509_NAME) *ca_sk=NULL;
1594
1595         n=s->method->ssl_get_message(s,
1596                 SSL3_ST_CR_CERT_REQ_A,
1597                 SSL3_ST_CR_CERT_REQ_B,
1598                 -1,
1599                 s->max_cert_list,
1600                 &ok);
1601
1602         if (!ok) return((int)n);
1603
1604         s->s3->tmp.cert_req=0;
1605
1606         if (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE)
1607                 {
1608                 s->s3->tmp.reuse_message=1;
1609                 return(1);
1610                 }
1611
1612         if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST)
1613                 {
1614                 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
1615                 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_WRONG_MESSAGE_TYPE);
1616                 goto err;
1617                 }
1618
1619         /* TLS does not like anon-DH with client cert */
1620         if (s->version > SSL3_VERSION)
1621                 {
1622                 if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)
1623                         {
1624                         ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
1625                         SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER);
1626                         goto err;
1627                         }
1628                 }
1629
1630         p=d=(unsigned char *)s->init_msg;
1631
1632         if ((ca_sk=sk_X509_NAME_new(ca_dn_cmp)) == NULL)
1633                 {
1634                 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
1635                 goto err;
1636                 }
1637
1638         /* get the certificate types */
1639         ctype_num= *(p++);
1640         if (ctype_num > SSL3_CT_NUMBER)
1641                 ctype_num=SSL3_CT_NUMBER;
1642         for (i=0; i<ctype_num; i++)
1643                 s->s3->tmp.ctype[i]= p[i];
1644         p+=ctype_num;
1645
1646         /* get the CA RDNs */
1647         n2s(p,llen);
1648 #if 0
1649 {
1650 FILE *out;
1651 out=fopen("/tmp/vsign.der","w");
1652 fwrite(p,1,llen,out);
1653 fclose(out);
1654 }
1655 #endif
1656
1657         if ((llen+ctype_num+2+1) != n)
1658                 {
1659                 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1660                 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_LENGTH_MISMATCH);
1661                 goto err;
1662                 }
1663
1664         for (nc=0; nc<llen; )
1665                 {
1666                 n2s(p,l);
1667                 if ((l+nc+2) > llen)
1668                         {
1669                         if ((s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
1670                                 goto cont; /* netscape bugs */
1671                         ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1672                         SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_TOO_LONG);
1673                         goto err;
1674                         }
1675
1676                 q=p;
1677
1678                 if ((xn=d2i_X509_NAME(NULL,&q,l)) == NULL)
1679                         {
1680                         /* If netscape tolerance is on, ignore errors */
1681                         if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG)
1682                                 goto cont;
1683                         else
1684                                 {
1685                                 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1686                                 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_ASN1_LIB);
1687                                 goto err;
1688                                 }
1689                         }
1690
1691                 if (q != (p+l))
1692                         {
1693                         ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1694                         SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_LENGTH_MISMATCH);
1695                         goto err;
1696                         }
1697                 if (!sk_X509_NAME_push(ca_sk,xn))
1698                         {
1699                         SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
1700                         goto err;
1701                         }
1702
1703                 p+=l;
1704                 nc+=l+2;
1705                 }
1706
1707         if (0)
1708                 {
1709 cont:
1710                 ERR_clear_error();
1711                 }
1712
1713         /* we should setup a certificate to return.... */
1714         s->s3->tmp.cert_req=1;
1715         s->s3->tmp.ctype_num=ctype_num;
1716         if (s->s3->tmp.ca_names != NULL)
1717                 sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
1718         s->s3->tmp.ca_names=ca_sk;
1719         ca_sk=NULL;
1720
1721         ret=1;
1722 err:
1723         if (ca_sk != NULL) sk_X509_NAME_pop_free(ca_sk,X509_NAME_free);
1724         return(ret);
1725         }
1726
1727 static int ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b)
1728         {
1729         return(X509_NAME_cmp(*a,*b));
1730         }
1731 #ifndef OPENSSL_NO_TLSEXT
1732 int ssl3_get_new_session_ticket(SSL *s)
1733         {
1734         int ok,al,ret=0, ticklen;
1735         long n;
1736         const unsigned char *p;
1737         unsigned char *d;
1738
1739         n=s->method->ssl_get_message(s,
1740                 SSL3_ST_CR_SESSION_TICKET_A,
1741                 SSL3_ST_CR_SESSION_TICKET_B,
1742                 -1,
1743                 16384,
1744                 &ok);
1745
1746         if (!ok)
1747                 return((int)n);
1748
1749         if (s->s3->tmp.message_type == SSL3_MT_FINISHED)
1750                 {
1751                 s->s3->tmp.reuse_message=1;
1752                 return(1);
1753                 }
1754         if (s->s3->tmp.message_type != SSL3_MT_NEWSESSION_TICKET)
1755                 {
1756                 al=SSL_AD_UNEXPECTED_MESSAGE;
1757                 SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_BAD_MESSAGE_TYPE);
1758                 goto f_err;
1759                 }
1760         if (n < 6)
1761                 {
1762                 /* need at least ticket_lifetime_hint + ticket length */
1763                 al = SSL3_AL_FATAL,SSL_AD_DECODE_ERROR;
1764                 SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_LENGTH_MISMATCH);
1765                 goto f_err;
1766                 }
1767         p=d=(unsigned char *)s->init_msg;
1768         n2l(p, s->session->tlsext_tick_lifetime_hint);
1769         n2s(p, ticklen);
1770         /* ticket_lifetime_hint + ticket_length + ticket */
1771         if (ticklen + 6 != n)
1772                 {
1773                 al = SSL3_AL_FATAL,SSL_AD_DECODE_ERROR;
1774                 SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_LENGTH_MISMATCH);
1775                 goto f_err;
1776                 }
1777         if (s->session->tlsext_tick)
1778                 {
1779                 OPENSSL_free(s->session->tlsext_tick);
1780                 s->session->tlsext_ticklen = 0;
1781                 }
1782         s->session->tlsext_tick = OPENSSL_malloc(ticklen);
1783         if (!s->session->tlsext_tick)
1784                 {
1785                 SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,ERR_R_MALLOC_FAILURE);
1786                 goto err;
1787                 }
1788         memcpy(s->session->tlsext_tick, p, ticklen);
1789         s->session->tlsext_ticklen = ticklen;
1790         
1791         ret=1;
1792         return(ret);
1793 f_err:
1794         ssl3_send_alert(s,SSL3_AL_FATAL,al);
1795 err:
1796         return(-1);
1797         }
1798 #endif
1799
1800 int ssl3_get_server_done(SSL *s)
1801         {
1802         int ok,ret=0;
1803         long n;
1804
1805         n=s->method->ssl_get_message(s,
1806                 SSL3_ST_CR_SRVR_DONE_A,
1807                 SSL3_ST_CR_SRVR_DONE_B,
1808                 SSL3_MT_SERVER_DONE,
1809                 30, /* should be very small, like 0 :-) */
1810                 &ok);
1811
1812         if (!ok) return((int)n);
1813         if (n > 0)
1814                 {
1815                 /* should contain no data */
1816                 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
1817                 SSLerr(SSL_F_SSL3_GET_SERVER_DONE,SSL_R_LENGTH_MISMATCH);
1818                 return -1;
1819                 }
1820         ret=1;
1821         return(ret);
1822         }
1823
1824
1825 int ssl3_send_client_key_exchange(SSL *s)
1826         {
1827         unsigned char *p,*d;
1828         int n;
1829         unsigned long alg_k;
1830 #ifndef OPENSSL_NO_RSA
1831         unsigned char *q;
1832         EVP_PKEY *pkey=NULL;
1833 #endif
1834 #ifndef OPENSSL_NO_KRB5
1835         KSSL_ERR kssl_err;
1836 #endif /* OPENSSL_NO_KRB5 */
1837 #ifndef OPENSSL_NO_ECDH
1838         EC_KEY *clnt_ecdh = NULL;
1839         const EC_POINT *srvr_ecpoint = NULL;
1840         EVP_PKEY *srvr_pub_pkey = NULL;
1841         unsigned char *encodedPoint = NULL;
1842         int encoded_pt_len = 0;
1843         BN_CTX * bn_ctx = NULL;
1844 #endif
1845
1846         if (s->state == SSL3_ST_CW_KEY_EXCH_A)
1847                 {
1848                 d=(unsigned char *)s->init_buf->data;
1849                 p= &(d[4]);
1850
1851                 alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
1852
1853                 /* Fool emacs indentation */
1854                 if (0) {}
1855 #ifndef OPENSSL_NO_RSA
1856                 else if (alg_k & SSL_kRSA)
1857                         {
1858                         RSA *rsa;
1859                         unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1860
1861                         if (s->session->sess_cert->peer_rsa_tmp != NULL)
1862                                 rsa=s->session->sess_cert->peer_rsa_tmp;
1863                         else
1864                                 {
1865                                 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1866                                 if ((pkey == NULL) ||
1867                                         (pkey->type != EVP_PKEY_RSA) ||
1868                                         (pkey->pkey.rsa == NULL))
1869                                         {
1870                                         SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1871                                         goto err;
1872                                         }
1873                                 rsa=pkey->pkey.rsa;
1874                                 EVP_PKEY_free(pkey);
1875                                 }
1876                                 
1877                         tmp_buf[0]=s->client_version>>8;
1878                         tmp_buf[1]=s->client_version&0xff;
1879                         if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)
1880                                         goto err;
1881
1882                         s->session->master_key_length=sizeof tmp_buf;
1883
1884                         q=p;
1885                         /* Fix buf for TLS and beyond */
1886                         if (s->version > SSL3_VERSION)
1887                                 p+=2;
1888                         n=RSA_public_encrypt(sizeof tmp_buf,
1889                                 tmp_buf,p,rsa,RSA_PKCS1_PADDING);
1890 #ifdef PKCS1_CHECK
1891                         if (s->options & SSL_OP_PKCS1_CHECK_1) p[1]++;
1892                         if (s->options & SSL_OP_PKCS1_CHECK_2) tmp_buf[0]=0x70;
1893 #endif
1894                         if (n <= 0)
1895                                 {
1896                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT);
1897                                 goto err;
1898                                 }
1899
1900                         /* Fix buf for TLS and beyond */
1901                         if (s->version > SSL3_VERSION)
1902                                 {
1903                                 s2n(n,q);
1904                                 n+=2;
1905                                 }
1906
1907                         s->session->master_key_length=
1908                                 s->method->ssl3_enc->generate_master_secret(s,
1909                                         s->session->master_key,
1910                                         tmp_buf,sizeof tmp_buf);
1911                         OPENSSL_cleanse(tmp_buf,sizeof tmp_buf);
1912                         }
1913 #endif
1914 #ifndef OPENSSL_NO_KRB5
1915                 else if (alg_k & SSL_kKRB5)
1916                         {
1917                         krb5_error_code krb5rc;
1918                         KSSL_CTX        *kssl_ctx = s->kssl_ctx;
1919                         /*  krb5_data   krb5_ap_req;  */
1920                         krb5_data       *enc_ticket;
1921                         krb5_data       authenticator, *authp = NULL;
1922                         EVP_CIPHER_CTX  ciph_ctx;
1923                         EVP_CIPHER      *enc = NULL;
1924                         unsigned char   iv[EVP_MAX_IV_LENGTH];
1925                         unsigned char   tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1926                         unsigned char   epms[SSL_MAX_MASTER_KEY_LENGTH 
1927                                                 + EVP_MAX_IV_LENGTH];
1928                         int             padl, outl = sizeof(epms);
1929
1930                         EVP_CIPHER_CTX_init(&ciph_ctx);
1931
1932 #ifdef KSSL_DEBUG
1933                         printf("ssl3_send_client_key_exchange(%lx & %lx)\n",
1934                                 alg_k, SSL_kKRB5);
1935 #endif  /* KSSL_DEBUG */
1936
1937                         authp = NULL;
1938 #ifdef KRB5SENDAUTH
1939                         if (KRB5SENDAUTH)  authp = &authenticator;
1940 #endif  /* KRB5SENDAUTH */
1941
1942                         krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp,
1943                                 &kssl_err);
1944                         enc = kssl_map_enc(kssl_ctx->enctype);
1945                         if (enc == NULL)
1946                             goto err;
1947 #ifdef KSSL_DEBUG
1948                         {
1949                         printf("kssl_cget_tkt rtn %d\n", krb5rc);
1950                         if (krb5rc && kssl_err.text)
1951                           printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text);
1952                         }
1953 #endif  /* KSSL_DEBUG */
1954
1955                         if (krb5rc)
1956                                 {
1957                                 ssl3_send_alert(s,SSL3_AL_FATAL,
1958                                                 SSL_AD_HANDSHAKE_FAILURE);
1959                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1960                                                 kssl_err.reason);
1961                                 goto err;
1962                                 }
1963
1964                         /*  20010406 VRS - Earlier versions used KRB5 AP_REQ
1965                         **  in place of RFC 2712 KerberosWrapper, as in:
1966                         **
1967                         **  Send ticket (copy to *p, set n = length)
1968                         **  n = krb5_ap_req.length;
1969                         **  memcpy(p, krb5_ap_req.data, krb5_ap_req.length);
1970                         **  if (krb5_ap_req.data)  
1971                         **    kssl_krb5_free_data_contents(NULL,&krb5_ap_req);
1972                         **
1973                         **  Now using real RFC 2712 KerberosWrapper
1974                         **  (Thanks to Simon Wilkinson <sxw@sxw.org.uk>)
1975                         **  Note: 2712 "opaque" types are here replaced
1976                         **  with a 2-byte length followed by the value.
1977                         **  Example:
1978                         **  KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms
1979                         **  Where "xx xx" = length bytes.  Shown here with
1980                         **  optional authenticator omitted.
1981                         */
1982
1983                         /*  KerberosWrapper.Ticket              */
1984                         s2n(enc_ticket->length,p);
1985                         memcpy(p, enc_ticket->data, enc_ticket->length);
1986                         p+= enc_ticket->length;
1987                         n = enc_ticket->length + 2;
1988
1989                         /*  KerberosWrapper.Authenticator       */
1990                         if (authp  &&  authp->length)  
1991                                 {
1992                                 s2n(authp->length,p);
1993                                 memcpy(p, authp->data, authp->length);
1994                                 p+= authp->length;
1995                                 n+= authp->length + 2;
1996                                 
1997                                 free(authp->data);
1998                                 authp->data = NULL;
1999                                 authp->length = 0;
2000                                 }
2001                         else
2002                                 {
2003                                 s2n(0,p);/*  null authenticator length  */
2004                                 n+=2;
2005                                 }
2006  
2007                             tmp_buf[0]=s->client_version>>8;
2008                             tmp_buf[1]=s->client_version&0xff;
2009                             if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)
2010                                 goto err;
2011
2012                         /*  20010420 VRS.  Tried it this way; failed.
2013                         **      EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL);
2014                         **      EVP_CIPHER_CTX_set_key_length(&ciph_ctx,
2015                         **                              kssl_ctx->length);
2016                         **      EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv);
2017                         */
2018
2019                         memset(iv, 0, sizeof iv);  /* per RFC 1510 */
2020                         EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,
2021                                 kssl_ctx->key,iv);
2022                         EVP_EncryptUpdate(&ciph_ctx,epms,&outl,tmp_buf,
2023                                 sizeof tmp_buf);
2024                         EVP_EncryptFinal_ex(&ciph_ctx,&(epms[outl]),&padl);
2025                         outl += padl;
2026                         if (outl > sizeof epms)
2027                                 {
2028                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
2029                                 goto err;
2030                                 }
2031                         EVP_CIPHER_CTX_cleanup(&ciph_ctx);
2032
2033                         /*  KerberosWrapper.EncryptedPreMasterSecret    */
2034                         s2n(outl,p);
2035                         memcpy(p, epms, outl);
2036                         p+=outl;
2037                         n+=outl + 2;
2038
2039                         s->session->master_key_length=
2040                                 s->method->ssl3_enc->generate_master_secret(s,
2041                                         s->session->master_key,
2042                                         tmp_buf, sizeof tmp_buf);
2043
2044                         OPENSSL_cleanse(tmp_buf, sizeof tmp_buf);
2045                         OPENSSL_cleanse(epms, outl);
2046                         }
2047 #endif
2048 #ifndef OPENSSL_NO_DH
2049                 else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
2050                         {
2051                         DH *dh_srvr,*dh_clnt;
2052
2053                         if (s->session->sess_cert->peer_dh_tmp != NULL)
2054                                 dh_srvr=s->session->sess_cert->peer_dh_tmp;
2055                         else
2056                                 {
2057                                 /* we get them from the cert */
2058                                 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
2059                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_FIND_DH_PARAMETERS);
2060                                 goto err;
2061                                 }
2062                         
2063                         /* generate a new random key */
2064                         if ((dh_clnt=DHparams_dup(dh_srvr)) == NULL)
2065                                 {
2066                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
2067                                 goto err;
2068                                 }
2069                         if (!DH_generate_key(dh_clnt))
2070                                 {
2071                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
2072                                 goto err;
2073                                 }
2074
2075                         /* use the 'p' output buffer for the DH key, but
2076                          * make sure to clear it out afterwards */
2077
2078                         n=DH_compute_key(p,dh_srvr->pub_key,dh_clnt);
2079
2080                         if (n <= 0)
2081                                 {
2082                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
2083                                 goto err;
2084                                 }
2085
2086                         /* generate master key from the result */
2087                         s->session->master_key_length=
2088                                 s->method->ssl3_enc->generate_master_secret(s,
2089                                         s->session->master_key,p,n);
2090                         /* clean up */
2091                         memset(p,0,n);
2092
2093                         /* send off the data */
2094                         n=BN_num_bytes(dh_clnt->pub_key);
2095                         s2n(n,p);
2096                         BN_bn2bin(dh_clnt->pub_key,p);
2097                         n+=2;
2098
2099                         DH_free(dh_clnt);
2100
2101                         /* perhaps clean things up a bit EAY EAY EAY EAY*/
2102                         }
2103 #endif
2104
2105 #ifndef OPENSSL_NO_ECDH 
2106                 else if (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe))
2107                         {
2108                         const EC_GROUP *srvr_group = NULL;
2109                         EC_KEY *tkey;
2110                         int ecdh_clnt_cert = 0;
2111                         int field_size = 0;
2112
2113                         /* Did we send out the client's
2114                          * ECDH share for use in premaster
2115                          * computation as part of client certificate?
2116                          * If so, set ecdh_clnt_cert to 1.
2117                          */
2118                         if ((alg_k & (SSL_kECDHr|SSL_kECDHe)) && (s->cert != NULL)) 
2119                                 {
2120                                 /* XXX: For now, we do not support client
2121                                  * authentication using ECDH certificates.
2122                                  * To add such support, one needs to add
2123                                  * code that checks for appropriate 
2124                                  * conditions and sets ecdh_clnt_cert to 1.
2125                                  * For example, the cert have an ECC
2126                                  * key on the same curve as the server's
2127                                  * and the key should be authorized for
2128                                  * key agreement.
2129                                  *
2130                                  * One also needs to add code in ssl3_connect
2131                                  * to skip sending the certificate verify
2132                                  * message.
2133                                  *
2134                                  * if ((s->cert->key->privatekey != NULL) &&
2135                                  *     (s->cert->key->privatekey->type ==
2136                                  *      EVP_PKEY_EC) && ...)
2137                                  * ecdh_clnt_cert = 1;
2138                                  */
2139                                 }
2140
2141                         if (s->session->sess_cert->peer_ecdh_tmp != NULL)
2142                                 {
2143                                 tkey = s->session->sess_cert->peer_ecdh_tmp;
2144                                 }
2145                         else
2146                                 {
2147                                 /* Get the Server Public Key from Cert */
2148                                 srvr_pub_pkey = X509_get_pubkey(s->session-> \
2149                                     sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
2150                                 if ((srvr_pub_pkey == NULL) ||
2151                                     (srvr_pub_pkey->type != EVP_PKEY_EC) ||
2152                                     (srvr_pub_pkey->pkey.ec == NULL))
2153                                         {
2154                                         SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2155                                             ERR_R_INTERNAL_ERROR);
2156                                         goto err;
2157                                         }
2158
2159                                 tkey = srvr_pub_pkey->pkey.ec;
2160                                 }
2161
2162                         srvr_group   = EC_KEY_get0_group(tkey);
2163                         srvr_ecpoint = EC_KEY_get0_public_key(tkey);
2164
2165                         if ((srvr_group == NULL) || (srvr_ecpoint == NULL))
2166                                 {
2167                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2168                                     ERR_R_INTERNAL_ERROR);
2169                                 goto err;
2170                                 }
2171
2172                         if ((clnt_ecdh=EC_KEY_new()) == NULL) 
2173                                 {
2174                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
2175                                 goto err;
2176                                 }
2177
2178                         if (!EC_KEY_set_group(clnt_ecdh, srvr_group))
2179                                 {
2180                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_EC_LIB);
2181                                 goto err;
2182                                 }
2183                         if (ecdh_clnt_cert) 
2184                                 { 
2185                                 /* Reuse key info from our certificate
2186                                  * We only need our private key to perform
2187                                  * the ECDH computation.
2188                                  */
2189                                 const BIGNUM *priv_key;
2190                                 tkey = s->cert->key->privatekey->pkey.ec;
2191                                 priv_key = EC_KEY_get0_private_key(tkey);
2192                                 if (priv_key == NULL)
2193                                         {
2194                                         SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
2195                                         goto err;
2196                                         }
2197                                 if (!EC_KEY_set_private_key(clnt_ecdh, priv_key))
2198                                         {
2199                                         SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_EC_LIB);
2200                                         goto err;
2201                                         }
2202                                 }
2203                         else 
2204                                 {
2205                                 /* Generate a new ECDH key pair */
2206                                 if (!(EC_KEY_generate_key(clnt_ecdh)))
2207                                         {
2208                                         SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB);
2209                                         goto err;
2210                                         }
2211                                 }
2212
2213                         /* use the 'p' output buffer for the ECDH key, but
2214                          * make sure to clear it out afterwards
2215                          */
2216
2217                         field_size = EC_GROUP_get_degree(srvr_group);
2218                         if (field_size <= 0)
2219                                 {
2220                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, 
2221                                        ERR_R_ECDH_LIB);
2222                                 goto err;
2223                                 }
2224                         n=ECDH_compute_key(p, (field_size+7)/8, srvr_ecpoint, clnt_ecdh, NULL);
2225                         if (n <= 0)
2226                                 {
2227                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, 
2228                                        ERR_R_ECDH_LIB);
2229                                 goto err;
2230                                 }
2231
2232                         /* generate master key from the result */
2233                         s->session->master_key_length = s->method->ssl3_enc \
2234                             -> generate_master_secret(s, 
2235                                 s->session->master_key,
2236                                 p, n);
2237
2238                         memset(p, 0, n); /* clean up */
2239
2240                         if (ecdh_clnt_cert) 
2241                                 {
2242                                 /* Send empty client key exch message */
2243                                 n = 0;
2244                                 }
2245                         else 
2246                                 {
2247                                 /* First check the size of encoding and
2248                                  * allocate memory accordingly.
2249                                  */
2250                                 encoded_pt_len = 
2251                                     EC_POINT_point2oct(srvr_group, 
2252                                         EC_KEY_get0_public_key(clnt_ecdh), 
2253                                         POINT_CONVERSION_UNCOMPRESSED, 
2254                                         NULL, 0, NULL);
2255
2256                                 encodedPoint = (unsigned char *) 
2257                                     OPENSSL_malloc(encoded_pt_len * 
2258                                         sizeof(unsigned char)); 
2259                                 bn_ctx = BN_CTX_new();
2260                                 if ((encodedPoint == NULL) || 
2261                                     (bn_ctx == NULL)) 
2262                                         {
2263                                         SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
2264                                         goto err;
2265                                         }
2266
2267                                 /* Encode the public key */
2268                                 n = EC_POINT_point2oct(srvr_group, 
2269                                     EC_KEY_get0_public_key(clnt_ecdh), 
2270                                     POINT_CONVERSION_UNCOMPRESSED, 
2271                                     encodedPoint, encoded_pt_len, bn_ctx);
2272
2273                                 *p = n; /* length of encoded point */
2274                                 /* Encoded point will be copied here */
2275                                 p += 1; 
2276                                 /* copy the point */
2277                                 memcpy((unsigned char *)p, encodedPoint, n);
2278                                 /* increment n to account for length field */
2279                                 n += 1; 
2280                                 }
2281
2282                         /* Free allocated memory */
2283                         BN_CTX_free(bn_ctx);
2284                         if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
2285                         if (clnt_ecdh != NULL) 
2286                                  EC_KEY_free(clnt_ecdh);
2287                         EVP_PKEY_free(srvr_pub_pkey);
2288                         }
2289 #endif /* !OPENSSL_NO_ECDH */
2290 #ifndef OPENSSL_NO_PSK
2291                 else if (alg_k & SSL_kPSK)
2292                         {
2293                         char identity[PSK_MAX_IDENTITY_LEN];
2294                         unsigned char *t = NULL;
2295                         unsigned char psk_or_pre_ms[PSK_MAX_PSK_LEN*2+4];
2296                         unsigned int pre_ms_len = 0, psk_len = 0;
2297                         int psk_err = 1;
2298
2299                         n = 0;
2300                         if (s->psk_client_callback == NULL)
2301                                 {
2302                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2303                                         SSL_R_PSK_NO_CLIENT_CB);
2304                                 goto err;
2305                                 }
2306
2307                         psk_len = s->psk_client_callback(s, s->ctx->psk_identity_hint,
2308                                 identity, PSK_MAX_IDENTITY_LEN,
2309                                 psk_or_pre_ms, sizeof(psk_or_pre_ms));
2310                         if (psk_len > PSK_MAX_PSK_LEN)
2311                                 {
2312                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2313                                         ERR_R_INTERNAL_ERROR);
2314                                 goto psk_err;
2315                                 }
2316                         else if (psk_len == 0)
2317                                 {
2318                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2319                                         SSL_R_PSK_IDENTITY_NOT_FOUND);
2320                                 goto psk_err;
2321                                 }
2322
2323                         /* create PSK pre_master_secret */
2324                         pre_ms_len = 2+psk_len+2+psk_len;
2325                         t = psk_or_pre_ms;
2326                         memmove(psk_or_pre_ms+psk_len+4, psk_or_pre_ms, psk_len);
2327                         s2n(psk_len, t);
2328                         memset(t, 0, psk_len);
2329                         t+=psk_len;
2330                         s2n(psk_len, t);
2331
2332                         if (s->session->psk_identity_hint != NULL)
2333                                 OPENSSL_free(s->session->psk_identity_hint);
2334                         s->session->psk_identity_hint = BUF_strdup(s->ctx->psk_identity_hint);
2335                         if (s->ctx->psk_identity_hint != NULL &&
2336                                 s->session->psk_identity_hint == NULL)
2337                                 {
2338                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2339                                         ERR_R_MALLOC_FAILURE);
2340                                 goto psk_err;
2341                                 }
2342
2343                         if (s->session->psk_identity != NULL)
2344                                 OPENSSL_free(s->session->psk_identity);
2345                         s->session->psk_identity = BUF_strdup(identity);
2346                         if (s->session->psk_identity == NULL)
2347                                 {
2348                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2349                                         ERR_R_MALLOC_FAILURE);
2350                                 goto psk_err;
2351                                 }
2352
2353                         s->session->master_key_length =
2354                                 s->method->ssl3_enc->generate_master_secret(s,
2355                                         s->session->master_key,
2356                                         psk_or_pre_ms, pre_ms_len); 
2357                         n = strlen(identity);
2358                         s2n(n, p);
2359                         memcpy(p, identity, n);
2360                         n+=2;
2361                         psk_err = 0;
2362                 psk_err:
2363                         OPENSSL_cleanse(identity, PSK_MAX_IDENTITY_LEN);
2364                         OPENSSL_cleanse(psk_or_pre_ms, sizeof(psk_or_pre_ms));
2365                         if (psk_err != 0)
2366                                 {
2367                                 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
2368                                 goto err;
2369                                 }
2370                         }
2371 #endif
2372                 else
2373                         {
2374                         ssl3_send_alert(s, SSL3_AL_FATAL,
2375                             SSL_AD_HANDSHAKE_FAILURE);
2376                         SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2377                             ERR_R_INTERNAL_ERROR);
2378                         goto err;
2379                         }
2380                 
2381                 *(d++)=SSL3_MT_CLIENT_KEY_EXCHANGE;
2382                 l2n3(n,d);
2383
2384                 s->state=SSL3_ST_CW_KEY_EXCH_B;
2385                 /* number of bytes to write */
2386                 s->init_num=n+4;
2387                 s->init_off=0;
2388                 }
2389
2390         /* SSL3_ST_CW_KEY_EXCH_B */
2391         return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
2392 err:
2393 #ifndef OPENSSL_NO_ECDH
2394         BN_CTX_free(bn_ctx);
2395         if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
2396         if (clnt_ecdh != NULL) 
2397                 EC_KEY_free(clnt_ecdh);
2398         EVP_PKEY_free(srvr_pub_pkey);
2399 #endif
2400         return(-1);
2401         }
2402
2403 int ssl3_send_client_verify(SSL *s)
2404         {
2405         unsigned char *p,*d;
2406         unsigned char data[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
2407         EVP_PKEY *pkey;
2408 #ifndef OPENSSL_NO_RSA
2409         unsigned u=0;
2410 #endif
2411         unsigned long n;
2412 #if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
2413         int j;
2414 #endif
2415
2416         if (s->state == SSL3_ST_CW_CERT_VRFY_A)
2417                 {
2418                 d=(unsigned char *)s->init_buf->data;
2419                 p= &(d[4]);
2420                 pkey=s->cert->key->privatekey;
2421
2422                 s->method->ssl3_enc->cert_verify_mac(s,
2423                         NID_sha1,
2424                         &(data[MD5_DIGEST_LENGTH]));
2425
2426 #ifndef OPENSSL_NO_RSA
2427                 if (pkey->type == EVP_PKEY_RSA)
2428                         {
2429                         s->method->ssl3_enc->cert_verify_mac(s,
2430                                 NID_md5,
2431                                 &(data[0]));
2432                         if (RSA_sign(NID_md5_sha1, data,
2433                                          MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
2434                                         &(p[2]), &u, pkey->pkey.rsa) <= 0 )
2435                                 {
2436                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_RSA_LIB);
2437                                 goto err;
2438                                 }
2439                         s2n(u,p);
2440                         n=u+2;
2441                         }
2442                 else
2443 #endif
2444 #ifndef OPENSSL_NO_DSA
2445                         if (pkey->type == EVP_PKEY_DSA)
2446                         {
2447                         if (!DSA_sign(pkey->save_type,
2448                                 &(data[MD5_DIGEST_LENGTH]),
2449                                 SHA_DIGEST_LENGTH,&(p[2]),
2450                                 (unsigned int *)&j,pkey->pkey.dsa))
2451                                 {
2452                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_DSA_LIB);
2453                                 goto err;
2454                                 }
2455                         s2n(j,p);
2456                         n=j+2;
2457                         }
2458                 else
2459 #endif
2460 #ifndef OPENSSL_NO_ECDSA
2461                         if (pkey->type == EVP_PKEY_EC)
2462                         {
2463                         if (!ECDSA_sign(pkey->save_type,
2464                                 &(data[MD5_DIGEST_LENGTH]),
2465                                 SHA_DIGEST_LENGTH,&(p[2]),
2466                                 (unsigned int *)&j,pkey->pkey.ec))
2467                                 {
2468                                 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,
2469                                     ERR_R_ECDSA_LIB);
2470                                 goto err;
2471                                 }
2472                         s2n(j,p);
2473                         n=j+2;
2474                         }
2475                 else
2476 #endif
2477                         {
2478                         SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_INTERNAL_ERROR);
2479                         goto err;
2480                         }
2481                 *(d++)=SSL3_MT_CERTIFICATE_VERIFY;
2482                 l2n3(n,d);
2483
2484                 s->state=SSL3_ST_CW_CERT_VRFY_B;
2485                 s->init_num=(int)n+4;
2486                 s->init_off=0;
2487                 }
2488         return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
2489 err:
2490         return(-1);
2491         }
2492
2493 int ssl3_send_client_certificate(SSL *s)
2494         {
2495         X509 *x509=NULL;
2496         EVP_PKEY *pkey=NULL;
2497         int i;
2498         unsigned long l;
2499
2500         if (s->state == SSL3_ST_CW_CERT_A)
2501                 {
2502                 if ((s->cert == NULL) ||
2503                         (s->cert->key->x509 == NULL) ||
2504                         (s->cert->key->privatekey == NULL))
2505                         s->state=SSL3_ST_CW_CERT_B;
2506                 else
2507                         s->state=SSL3_ST_CW_CERT_C;
2508                 }
2509
2510         /* We need to get a client cert */
2511         if (s->state == SSL3_ST_CW_CERT_B)
2512                 {
2513                 /* If we get an error, we need to
2514                  * ssl->rwstate=SSL_X509_LOOKUP; return(-1);
2515                  * We then get retied later */
2516                 i=0;
2517                 if (s->ctx->client_cert_cb != NULL)
2518                         i=s->ctx->client_cert_cb(s,&(x509),&(pkey));
2519                 if (i < 0)
2520                         {
2521                         s->rwstate=SSL_X509_LOOKUP;
2522                         return(-1);
2523                         }
2524                 s->rwstate=SSL_NOTHING;
2525                 if ((i == 1) && (pkey != NULL) && (x509 != NULL))
2526                         {
2527                         s->state=SSL3_ST_CW_CERT_B;
2528                         if (    !SSL_use_certificate(s,x509) ||
2529                                 !SSL_use_PrivateKey(s,pkey))
2530                                 i=0;
2531                         }
2532                 else if (i == 1)
2533                         {
2534                         i=0;
2535                         SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE,SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
2536                         }
2537
2538                 if (x509 != NULL) X509_free(x509);
2539                 if (pkey != NULL) EVP_PKEY_free(pkey);
2540                 if (i == 0)
2541                         {
2542                         if (s->version == SSL3_VERSION)
2543                                 {
2544                                 s->s3->tmp.cert_req=0;
2545                                 ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_NO_CERTIFICATE);
2546                                 return(1);
2547                                 }
2548                         else
2549                                 {
2550                                 s->s3->tmp.cert_req=2;
2551                                 }
2552                         }
2553
2554                 /* Ok, we have a cert */
2555                 s->state=SSL3_ST_CW_CERT_C;
2556                 }
2557
2558         if (s->state == SSL3_ST_CW_CERT_C)
2559                 {
2560                 s->state=SSL3_ST_CW_CERT_D;
2561                 l=ssl3_output_cert_chain(s,
2562                         (s->s3->tmp.cert_req == 2)?NULL:s->cert->key->x509);
2563                 s->init_num=(int)l;
2564                 s->init_off=0;
2565                 }
2566         /* SSL3_ST_CW_CERT_D */
2567         return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
2568         }
2569
2570 #define has_bits(i,m)   (((i)&(m)) == (m))
2571
2572 int ssl3_check_cert_and_algorithm(SSL *s)
2573         {
2574         int i,idx;
2575         long alg_k,alg_a;
2576         EVP_PKEY *pkey=NULL;
2577         SESS_CERT *sc;
2578 #ifndef OPENSSL_NO_RSA
2579         RSA *rsa;
2580 #endif
2581 #ifndef OPENSSL_NO_DH
2582         DH *dh;
2583 #endif
2584
2585         sc=s->session->sess_cert;
2586         if (sc == NULL)
2587                 {
2588                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,ERR_R_INTERNAL_ERROR);
2589                 goto err;
2590                 }
2591
2592         alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
2593         alg_a=s->s3->tmp.new_cipher->algorithm_auth;
2594
2595         /* we don't have a certificate */
2596         if ((alg_a & (SSL_aDH|SSL_aNULL|SSL_aKRB5)) || (alg_k & SSL_kPSK))
2597                 return(1);
2598
2599 #ifndef OPENSSL_NO_RSA
2600         rsa=s->session->sess_cert->peer_rsa_tmp;
2601 #endif
2602 #ifndef OPENSSL_NO_DH
2603         dh=s->session->sess_cert->peer_dh_tmp;
2604 #endif
2605
2606         /* This is the passed certificate */
2607
2608         idx=sc->peer_cert_type;
2609 #ifndef OPENSSL_NO_ECDH
2610         if (idx == SSL_PKEY_ECC)
2611                 {
2612                 if (ssl_check_srvr_ecc_cert_and_alg(sc->peer_pkeys[idx].x509,
2613                     s->s3->tmp.new_cipher) == 0) 
2614                         { /* check failed */
2615                         SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_BAD_ECC_CERT);
2616                         goto f_err;
2617                         }
2618                 else 
2619                         {
2620                         return 1;
2621                         }
2622                 }
2623 #endif
2624         pkey=X509_get_pubkey(sc->peer_pkeys[idx].x509);
2625         i=X509_certificate_type(sc->peer_pkeys[idx].x509,pkey);
2626         EVP_PKEY_free(pkey);
2627
2628         
2629         /* Check that we have a certificate if we require one */
2630         if ((alg_a & SSL_aRSA) && !has_bits(i,EVP_PK_RSA|EVP_PKT_SIGN))
2631                 {
2632                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_SIGNING_CERT);
2633                 goto f_err;
2634                 }
2635 #ifndef OPENSSL_NO_DSA
2636         else if ((alg_a & SSL_aDSS) && !has_bits(i,EVP_PK_DSA|EVP_PKT_SIGN))
2637                 {
2638                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DSA_SIGNING_CERT);
2639                 goto f_err;
2640                 }
2641 #endif
2642 #ifndef OPENSSL_NO_RSA
2643         if ((alg_k & SSL_kRSA) &&
2644                 !(has_bits(i,EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL)))
2645                 {
2646                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_ENCRYPTING_CERT);
2647                 goto f_err;
2648                 }
2649 #endif
2650 #ifndef OPENSSL_NO_DH
2651         if ((alg_k & SSL_kEDH) &&
2652                 !(has_bits(i,EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL)))
2653                 {
2654                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_KEY);
2655                 goto f_err;
2656                 }
2657         else if ((alg_k & SSL_kDHr) && !has_bits(i,EVP_PK_DH|EVP_PKS_RSA))
2658                 {
2659                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_RSA_CERT);
2660                 goto f_err;
2661                 }
2662 #ifndef OPENSSL_NO_DSA
2663         else if ((alg_k & SSL_kDHd) && !has_bits(i,EVP_PK_DH|EVP_PKS_DSA))
2664                 {
2665                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_DSA_CERT);
2666                 goto f_err;
2667                 }
2668 #endif
2669 #endif
2670
2671         if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && !has_bits(i,EVP_PKT_EXP))
2672                 {
2673 #ifndef OPENSSL_NO_RSA
2674                 if (alg_k & SSL_kRSA)
2675                         {
2676                         if (rsa == NULL
2677                             || RSA_size(rsa)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher))
2678                                 {
2679                                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_RSA_KEY);
2680                                 goto f_err;
2681                                 }
2682                         }
2683                 else
2684 #endif
2685 #ifndef OPENSSL_NO_DH
2686                         if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
2687                             {
2688                             if (dh == NULL
2689                                 || DH_size(dh)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher))
2690                                 {
2691                                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_DH_KEY);
2692                                 goto f_err;
2693                                 }
2694                         }
2695                 else
2696 #endif
2697                         {
2698                         SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
2699                         goto f_err;
2700                         }
2701                 }
2702         return(1);
2703 f_err:
2704         ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
2705 err:
2706         return(0);
2707         }
2708
2709 /* Check to see if handshake is full or resumed. Usually this is just a
2710  * case of checking to see if a cache hit has occurred. In the case of
2711  * session tickets we have to check the next message to be sure.
2712  */
2713
2714 #ifndef OPENSSL_NO_TLSEXT
2715 static int ssl3_check_finished(SSL *s)
2716         {
2717         int ok;
2718         long n;
2719         if (!s->session->tlsext_tick)
2720                 return 1;
2721         /* this function is called when we really expect a Certificate
2722          * message, so permit appropriate message length */
2723         n=s->method->ssl_get_message(s,
2724                 SSL3_ST_CR_CERT_A,
2725                 SSL3_ST_CR_CERT_B,
2726                 -1,
2727                 s->max_cert_list,
2728                 &ok);
2729         if (!ok) return((int)n);
2730         s->s3->tmp.reuse_message = 1;
2731         if ((s->s3->tmp.message_type == SSL3_MT_FINISHED)
2732                 || (s->s3->tmp.message_type == SSL3_MT_NEWSESSION_TICKET))
2733                 return 2;
2734
2735         return 1;
2736         }
2737 #endif