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