]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - crypto/openssl/ssl/s3_clnt.c
Merge OpenSSL 0.9.8zf.
[FreeBSD/stable/9.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         n2l3(p, l);
935         if ((l + nc + 3) > llen) {
936             al = SSL_AD_DECODE_ERROR;
937             SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
938                    SSL_R_CERT_LENGTH_MISMATCH);
939             goto f_err;
940         }
941
942         q = p;
943         x = d2i_X509(NULL, &q, l);
944         if (x == NULL) {
945             al = SSL_AD_BAD_CERTIFICATE;
946             SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_ASN1_LIB);
947             goto f_err;
948         }
949         if (q != (p + l)) {
950             al = SSL_AD_DECODE_ERROR;
951             SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
952                    SSL_R_CERT_LENGTH_MISMATCH);
953             goto f_err;
954         }
955         if (!sk_X509_push(sk, x)) {
956             SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE, ERR_R_MALLOC_FAILURE);
957             goto err;
958         }
959         x = NULL;
960         nc += l + 3;
961         p = q;
962     }
963
964     i = ssl_verify_cert_chain(s, sk);
965     if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)
966 #ifndef OPENSSL_NO_KRB5
967         && (s->s3->tmp.
968             new_cipher->algorithms & (SSL_MKEY_MASK | SSL_AUTH_MASK))
969         != (SSL_aKRB5 | SSL_kKRB5)
970 #endif                          /* OPENSSL_NO_KRB5 */
971         ) {
972         al = ssl_verify_alarm_type(s->verify_result);
973         SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
974                SSL_R_CERTIFICATE_VERIFY_FAILED);
975         goto f_err;
976     }
977     ERR_clear_error();          /* but we keep s->verify_result */
978
979     sc = ssl_sess_cert_new();
980     if (sc == NULL)
981         goto err;
982
983     if (s->session->sess_cert)
984         ssl_sess_cert_free(s->session->sess_cert);
985     s->session->sess_cert = sc;
986
987     sc->cert_chain = sk;
988     /*
989      * Inconsistency alert: cert_chain does include the peer's certificate,
990      * which we don't include in s3_srvr.c
991      */
992     x = sk_X509_value(sk, 0);
993     sk = NULL;
994     /*
995      * VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end
996      */
997
998     pkey = X509_get_pubkey(x);
999
1000     /* VRS: allow null cert if auth == KRB5 */
1001     need_cert = ((s->s3->tmp.new_cipher->algorithms
1002                   & (SSL_MKEY_MASK | SSL_AUTH_MASK))
1003                  == (SSL_aKRB5 | SSL_kKRB5)) ? 0 : 1;
1004
1005 #ifdef KSSL_DEBUG
1006     printf("pkey,x = %p, %p\n", (void *)pkey, (void *)x);
1007     printf("ssl_cert_type(x,pkey) = %d\n", ssl_cert_type(x, pkey));
1008     printf("cipher, alg, nc = %s, %lx, %d\n", s->s3->tmp.new_cipher->name,
1009            s->s3->tmp.new_cipher->algorithms, need_cert);
1010 #endif                          /* KSSL_DEBUG */
1011
1012     if (need_cert && ((pkey == NULL) || EVP_PKEY_missing_parameters(pkey))) {
1013         x = NULL;
1014         al = SSL3_AL_FATAL;
1015         SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
1016                SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS);
1017         goto f_err;
1018     }
1019
1020     i = ssl_cert_type(x, pkey);
1021     if (need_cert && i < 0) {
1022         x = NULL;
1023         al = SSL3_AL_FATAL;
1024         SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
1025                SSL_R_UNKNOWN_CERTIFICATE_TYPE);
1026         goto f_err;
1027     }
1028
1029     if (need_cert) {
1030         sc->peer_cert_type = i;
1031         CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509);
1032         /*
1033          * Why would the following ever happen? We just created sc a couple
1034          * of lines ago.
1035          */
1036         if (sc->peer_pkeys[i].x509 != NULL)
1037             X509_free(sc->peer_pkeys[i].x509);
1038         sc->peer_pkeys[i].x509 = x;
1039         sc->peer_key = &(sc->peer_pkeys[i]);
1040
1041         if (s->session->peer != NULL)
1042             X509_free(s->session->peer);
1043         CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509);
1044         s->session->peer = x;
1045     } else {
1046         sc->peer_cert_type = i;
1047         sc->peer_key = NULL;
1048
1049         if (s->session->peer != NULL)
1050             X509_free(s->session->peer);
1051         s->session->peer = NULL;
1052     }
1053     s->session->verify_result = s->verify_result;
1054
1055     x = NULL;
1056     ret = 1;
1057
1058     if (0) {
1059  f_err:
1060         ssl3_send_alert(s, SSL3_AL_FATAL, al);
1061     }
1062  err:
1063     EVP_PKEY_free(pkey);
1064     X509_free(x);
1065     sk_X509_pop_free(sk, X509_free);
1066     return (ret);
1067 }
1068
1069 int ssl3_get_key_exchange(SSL *s)
1070 {
1071 #ifndef OPENSSL_NO_RSA
1072     unsigned char *q, md_buf[EVP_MAX_MD_SIZE * 2];
1073 #endif
1074     EVP_MD_CTX md_ctx;
1075     unsigned char *param, *p;
1076     int al, j, ok;
1077     long i, param_len, n, alg;
1078     EVP_PKEY *pkey = NULL;
1079 #ifndef OPENSSL_NO_RSA
1080     RSA *rsa = NULL;
1081 #endif
1082 #ifndef OPENSSL_NO_DH
1083     DH *dh = NULL;
1084 #endif
1085 #ifndef OPENSSL_NO_ECDH
1086     EC_KEY *ecdh = NULL;
1087     BN_CTX *bn_ctx = NULL;
1088     EC_POINT *srvr_ecpoint = NULL;
1089     int curve_nid = 0;
1090     int encoded_pt_len = 0;
1091 #endif
1092
1093     /*
1094      * use same message size as in ssl3_get_certificate_request() as
1095      * ServerKeyExchange message may be skipped
1096      */
1097     n = s->method->ssl_get_message(s,
1098                                    SSL3_ST_CR_KEY_EXCH_A,
1099                                    SSL3_ST_CR_KEY_EXCH_B,
1100                                    -1, s->max_cert_list, &ok);
1101
1102     if (!ok)
1103         return ((int)n);
1104
1105     alg = s->s3->tmp.new_cipher->algorithms;
1106     EVP_MD_CTX_init(&md_ctx);
1107
1108     if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) {
1109         /*
1110          * Can't skip server key exchange if this is an ephemeral
1111          * ciphersuite.
1112          */
1113         if (alg & (SSL_kEDH | SSL_kECDHE)) {
1114             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNEXPECTED_MESSAGE);
1115             al = SSL_AD_UNEXPECTED_MESSAGE;
1116             goto f_err;
1117         }
1118         s->s3->tmp.reuse_message = 1;
1119         return (1);
1120     }
1121
1122     param = p = (unsigned char *)s->init_msg;
1123
1124     if (s->session->sess_cert != NULL) {
1125 #ifndef OPENSSL_NO_RSA
1126         if (s->session->sess_cert->peer_rsa_tmp != NULL) {
1127             RSA_free(s->session->sess_cert->peer_rsa_tmp);
1128             s->session->sess_cert->peer_rsa_tmp = NULL;
1129         }
1130 #endif
1131 #ifndef OPENSSL_NO_DH
1132         if (s->session->sess_cert->peer_dh_tmp) {
1133             DH_free(s->session->sess_cert->peer_dh_tmp);
1134             s->session->sess_cert->peer_dh_tmp = NULL;
1135         }
1136 #endif
1137 #ifndef OPENSSL_NO_ECDH
1138         if (s->session->sess_cert->peer_ecdh_tmp) {
1139             EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp);
1140             s->session->sess_cert->peer_ecdh_tmp = NULL;
1141         }
1142 #endif
1143     } else {
1144         s->session->sess_cert = ssl_sess_cert_new();
1145     }
1146
1147     /* Total length of the parameters including the length prefix */
1148     param_len = 0;
1149
1150     al = SSL_AD_DECODE_ERROR;
1151 #ifndef OPENSSL_NO_RSA
1152     if (alg & SSL_kRSA) {
1153         /* Temporary RSA keys only allowed in export ciphersuites */
1154         if (!SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)) {
1155             al = SSL_AD_UNEXPECTED_MESSAGE;
1156             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNEXPECTED_MESSAGE);
1157             goto f_err;
1158         }
1159         if ((rsa = RSA_new()) == NULL) {
1160             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE);
1161             goto err;
1162         }
1163
1164         param_len = 2;
1165         if (param_len > n) {
1166             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
1167             goto f_err;
1168         }
1169         n2s(p, i);
1170
1171         if (i > n - param_len) {
1172             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_RSA_MODULUS_LENGTH);
1173             goto f_err;
1174         }
1175         param_len += i;
1176
1177         if (!(rsa->n = BN_bin2bn(p, i, rsa->n))) {
1178             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB);
1179             goto err;
1180         }
1181         p += i;
1182
1183         if (2 > n - param_len) {
1184             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
1185             goto f_err;
1186         }
1187         param_len += 2;
1188
1189         n2s(p, i);
1190
1191         if (i > n - param_len) {
1192             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_RSA_E_LENGTH);
1193             goto f_err;
1194         }
1195         param_len += i;
1196
1197         if (!(rsa->e = BN_bin2bn(p, i, rsa->e))) {
1198             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB);
1199             goto err;
1200         }
1201         p += i;
1202         n -= param_len;
1203
1204         /* this should be because we are using an export cipher */
1205         if (alg & SSL_aRSA)
1206             pkey =
1207                 X509_get_pubkey(s->session->
1208                                 sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1209         else {
1210             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1211             goto err;
1212         }
1213         s->session->sess_cert->peer_rsa_tmp = rsa;
1214         rsa = NULL;
1215     }
1216 #else                           /* OPENSSL_NO_RSA */
1217     if (0) ;
1218 #endif
1219 #ifndef OPENSSL_NO_DH
1220     else if (alg & SSL_kEDH) {
1221         if ((dh = DH_new()) == NULL) {
1222             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_DH_LIB);
1223             goto err;
1224         }
1225
1226         param_len = 2;
1227         if (param_len > n) {
1228             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
1229             goto f_err;
1230         }
1231         n2s(p, i);
1232
1233         if (i > n - param_len) {
1234             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_P_LENGTH);
1235             goto f_err;
1236         }
1237         param_len += i;
1238
1239         if (!(dh->p = BN_bin2bn(p, i, NULL))) {
1240             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB);
1241             goto err;
1242         }
1243         p += i;
1244
1245         if (2 > n - param_len) {
1246             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
1247             goto f_err;
1248         }
1249         param_len += 2;
1250
1251         n2s(p, i);
1252
1253         if (i > n - param_len) {
1254             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_G_LENGTH);
1255             goto f_err;
1256         }
1257         param_len += i;
1258
1259         if (!(dh->g = BN_bin2bn(p, i, NULL))) {
1260             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB);
1261             goto err;
1262         }
1263         p += i;
1264
1265         if (2 > n - param_len) {
1266             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
1267             goto f_err;
1268         }
1269         param_len += 2;
1270
1271         n2s(p, i);
1272
1273         if (i > n - param_len) {
1274             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_PUB_KEY_LENGTH);
1275             goto f_err;
1276         }
1277         param_len += i;
1278
1279         if (!(dh->pub_key = BN_bin2bn(p, i, NULL))) {
1280             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB);
1281             goto err;
1282         }
1283         p += i;
1284         n -= param_len;
1285
1286 # ifndef OPENSSL_NO_RSA
1287         if (alg & SSL_aRSA)
1288             pkey =
1289                 X509_get_pubkey(s->session->
1290                                 sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1291 # else
1292         if (0) ;
1293 # endif
1294 # ifndef OPENSSL_NO_DSA
1295         else if (alg & SSL_aDSS)
1296             pkey =
1297                 X509_get_pubkey(s->session->
1298                                 sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].
1299                                 x509);
1300 # endif
1301         /* else anonymous DH, so no certificate or pkey. */
1302
1303         s->session->sess_cert->peer_dh_tmp = dh;
1304         dh = NULL;
1305     } else if ((alg & SSL_kDHr) || (alg & SSL_kDHd)) {
1306         al = SSL_AD_ILLEGAL_PARAMETER;
1307         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1308                SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
1309         goto f_err;
1310     }
1311 #endif                          /* !OPENSSL_NO_DH */
1312
1313 #ifndef OPENSSL_NO_ECDH
1314     else if (alg & SSL_kECDHE) {
1315         EC_GROUP *ngroup;
1316         const EC_GROUP *group;
1317
1318         if ((ecdh = EC_KEY_new()) == NULL) {
1319             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE);
1320             goto err;
1321         }
1322
1323         /*
1324          * Extract elliptic curve parameters and the server's ephemeral ECDH
1325          * public key. Keep accumulating lengths of various components in
1326          * param_len and make sure it never exceeds n.
1327          */
1328
1329         /*
1330          * XXX: For now we only support named (not generic) curves and the
1331          * ECParameters in this case is just three bytes. We also need one
1332          * byte for the length of the encoded point
1333          */
1334         param_len = 4;
1335         if (param_len > n) {
1336             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
1337             goto f_err;
1338         }
1339
1340         if ((*p != NAMED_CURVE_TYPE) ||
1341             ((curve_nid = curve_id2nid(*(p + 2))) == 0)) {
1342             al = SSL_AD_INTERNAL_ERROR;
1343             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1344                    SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS);
1345             goto f_err;
1346         }
1347
1348         ngroup = EC_GROUP_new_by_curve_name(curve_nid);
1349         if (ngroup == NULL) {
1350             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EC_LIB);
1351             goto err;
1352         }
1353         if (EC_KEY_set_group(ecdh, ngroup) == 0) {
1354             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EC_LIB);
1355             goto err;
1356         }
1357         EC_GROUP_free(ngroup);
1358
1359         group = EC_KEY_get0_group(ecdh);
1360
1361         if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) &&
1362             (EC_GROUP_get_degree(group) > 163)) {
1363             al = SSL_AD_EXPORT_RESTRICTION;
1364             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1365                    SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER);
1366             goto f_err;
1367         }
1368
1369         p += 3;
1370
1371         /* Next, get the encoded ECPoint */
1372         if (((srvr_ecpoint = EC_POINT_new(group)) == NULL) ||
1373             ((bn_ctx = BN_CTX_new()) == NULL)) {
1374             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE);
1375             goto err;
1376         }
1377
1378         encoded_pt_len = *p;    /* length of encoded point */
1379         p += 1;
1380
1381         if ((encoded_pt_len > n - param_len) ||
1382             (EC_POINT_oct2point(group, srvr_ecpoint,
1383                                 p, encoded_pt_len, bn_ctx) == 0)) {
1384             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_ECPOINT);
1385             goto f_err;
1386         }
1387         param_len += encoded_pt_len;
1388
1389         n -= param_len;
1390         p += encoded_pt_len;
1391
1392         /*
1393          * The ECC/TLS specification does not mention the use of DSA to sign
1394          * ECParameters in the server key exchange message. We do support RSA
1395          * and ECDSA.
1396          */
1397         if (0) ;
1398 # ifndef OPENSSL_NO_RSA
1399         else if (alg & SSL_aRSA)
1400             pkey =
1401                 X509_get_pubkey(s->session->
1402                                 sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1403 # endif
1404 # ifndef OPENSSL_NO_ECDSA
1405         else if (alg & SSL_aECDSA)
1406             pkey =
1407                 X509_get_pubkey(s->session->
1408                                 sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
1409 # endif
1410         /* else anonymous ECDH, so no certificate or pkey. */
1411         EC_KEY_set_public_key(ecdh, srvr_ecpoint);
1412         s->session->sess_cert->peer_ecdh_tmp = ecdh;
1413         ecdh = NULL;
1414         BN_CTX_free(bn_ctx);
1415         bn_ctx = NULL;
1416         EC_POINT_free(srvr_ecpoint);
1417         srvr_ecpoint = NULL;
1418     } else if (alg & SSL_kECDH) {
1419         al = SSL_AD_UNEXPECTED_MESSAGE;
1420         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNEXPECTED_MESSAGE);
1421         goto f_err;
1422     }
1423 #endif                          /* !OPENSSL_NO_ECDH */
1424     if (alg & SSL_aFZA) {
1425         al = SSL_AD_HANDSHAKE_FAILURE;
1426         SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1427                SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
1428         goto f_err;
1429     }
1430
1431     /* p points to the next byte, there are 'n' bytes left */
1432
1433     /* if it was signed, check the signature */
1434     if (pkey != NULL) {
1435         n2s(p, i);
1436         n -= 2;
1437         j = EVP_PKEY_size(pkey);
1438
1439         /*
1440          * Check signature length. If n is 0 then signature is empty
1441          */
1442         if ((i != n) || (n > j) || (n <= 0)) {
1443             /* wrong packet length */
1444             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_WRONG_SIGNATURE_LENGTH);
1445             goto f_err;
1446         }
1447 #ifndef OPENSSL_NO_RSA
1448         if (pkey->type == EVP_PKEY_RSA) {
1449             int num;
1450             unsigned int size;
1451
1452             j = 0;
1453             q = md_buf;
1454             for (num = 2; num > 0; num--) {
1455                 EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
1456                 EVP_DigestInit_ex(&md_ctx, (num == 2)
1457                                   ? s->ctx->md5 : s->ctx->sha1, NULL);
1458                 EVP_DigestUpdate(&md_ctx, &(s->s3->client_random[0]),
1459                                  SSL3_RANDOM_SIZE);
1460                 EVP_DigestUpdate(&md_ctx, &(s->s3->server_random[0]),
1461                                  SSL3_RANDOM_SIZE);
1462                 EVP_DigestUpdate(&md_ctx, param, param_len);
1463                 EVP_DigestFinal_ex(&md_ctx, q, &size);
1464                 q += size;
1465                 j += size;
1466             }
1467             i = RSA_verify(NID_md5_sha1, md_buf, j, p, n, pkey->pkey.rsa);
1468             if (i < 0) {
1469                 al = SSL_AD_DECRYPT_ERROR;
1470                 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_RSA_DECRYPT);
1471                 goto f_err;
1472             }
1473             if (i == 0) {
1474                 /* bad signature */
1475                 al = SSL_AD_DECRYPT_ERROR;
1476                 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SIGNATURE);
1477                 goto f_err;
1478             }
1479         } else
1480 #endif
1481 #ifndef OPENSSL_NO_DSA
1482         if (pkey->type == EVP_PKEY_DSA) {
1483             /* lets do DSS */
1484             EVP_VerifyInit_ex(&md_ctx, EVP_dss1(), NULL);
1485             EVP_VerifyUpdate(&md_ctx, &(s->s3->client_random[0]),
1486                              SSL3_RANDOM_SIZE);
1487             EVP_VerifyUpdate(&md_ctx, &(s->s3->server_random[0]),
1488                              SSL3_RANDOM_SIZE);
1489             EVP_VerifyUpdate(&md_ctx, param, param_len);
1490             if (EVP_VerifyFinal(&md_ctx, p, (int)n, pkey) <= 0) {
1491                 /* bad signature */
1492                 al = SSL_AD_DECRYPT_ERROR;
1493                 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SIGNATURE);
1494                 goto f_err;
1495             }
1496         } else
1497 #endif
1498 #ifndef OPENSSL_NO_ECDSA
1499         if (pkey->type == EVP_PKEY_EC) {
1500             /* let's do ECDSA */
1501             EVP_VerifyInit_ex(&md_ctx, EVP_ecdsa(), NULL);
1502             EVP_VerifyUpdate(&md_ctx, &(s->s3->client_random[0]),
1503                              SSL3_RANDOM_SIZE);
1504             EVP_VerifyUpdate(&md_ctx, &(s->s3->server_random[0]),
1505                              SSL3_RANDOM_SIZE);
1506             EVP_VerifyUpdate(&md_ctx, param, param_len);
1507             if (EVP_VerifyFinal(&md_ctx, p, (int)n, pkey) <= 0) {
1508                 /* bad signature */
1509                 al = SSL_AD_DECRYPT_ERROR;
1510                 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_SIGNATURE);
1511                 goto f_err;
1512             }
1513         } else
1514 #endif
1515         {
1516             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1517             goto err;
1518         }
1519     } else {
1520         /* still data left over */
1521         if (!(alg & SSL_aNULL)) {
1522             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1523             goto err;
1524         }
1525         if (n != 0) {
1526             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_EXTRA_DATA_IN_MESSAGE);
1527             goto f_err;
1528         }
1529     }
1530     EVP_PKEY_free(pkey);
1531     EVP_MD_CTX_cleanup(&md_ctx);
1532     return (1);
1533  f_err:
1534     ssl3_send_alert(s, SSL3_AL_FATAL, al);
1535  err:
1536     EVP_PKEY_free(pkey);
1537 #ifndef OPENSSL_NO_RSA
1538     if (rsa != NULL)
1539         RSA_free(rsa);
1540 #endif
1541 #ifndef OPENSSL_NO_DH
1542     if (dh != NULL)
1543         DH_free(dh);
1544 #endif
1545 #ifndef OPENSSL_NO_ECDH
1546     BN_CTX_free(bn_ctx);
1547     EC_POINT_free(srvr_ecpoint);
1548     if (ecdh != NULL)
1549         EC_KEY_free(ecdh);
1550 #endif
1551     EVP_MD_CTX_cleanup(&md_ctx);
1552     return (-1);
1553 }
1554
1555 int ssl3_get_certificate_request(SSL *s)
1556 {
1557     int ok, ret = 0;
1558     unsigned long n, nc, l;
1559     unsigned int llen, ctype_num, i;
1560     X509_NAME *xn = NULL;
1561     const unsigned char *p, *q;
1562     unsigned char *d;
1563     STACK_OF(X509_NAME) *ca_sk = NULL;
1564
1565     n = s->method->ssl_get_message(s,
1566                                    SSL3_ST_CR_CERT_REQ_A,
1567                                    SSL3_ST_CR_CERT_REQ_B,
1568                                    -1, s->max_cert_list, &ok);
1569
1570     if (!ok)
1571         return ((int)n);
1572
1573     s->s3->tmp.cert_req = 0;
1574
1575     if (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE) {
1576         s->s3->tmp.reuse_message = 1;
1577         return (1);
1578     }
1579
1580     if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST) {
1581         ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
1582         SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_WRONG_MESSAGE_TYPE);
1583         goto err;
1584     }
1585
1586     /* TLS does not like anon-DH with client cert */
1587     if (s->version > SSL3_VERSION) {
1588         l = s->s3->tmp.new_cipher->algorithms;
1589         if (l & SSL_aNULL) {
1590             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
1591             SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,
1592                    SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER);
1593             goto err;
1594         }
1595     }
1596
1597     p = d = (unsigned char *)s->init_msg;
1598
1599     if ((ca_sk = sk_X509_NAME_new(ca_dn_cmp)) == NULL) {
1600         SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, ERR_R_MALLOC_FAILURE);
1601         goto err;
1602     }
1603
1604     /* get the certificate types */
1605     ctype_num = *(p++);
1606     if (ctype_num > SSL3_CT_NUMBER)
1607         ctype_num = SSL3_CT_NUMBER;
1608     for (i = 0; i < ctype_num; i++)
1609         s->s3->tmp.ctype[i] = p[i];
1610     p += ctype_num;
1611
1612     /* get the CA RDNs */
1613     n2s(p, llen);
1614 #if 0
1615     {
1616         FILE *out;
1617         out = fopen("/tmp/vsign.der", "w");
1618         fwrite(p, 1, llen, out);
1619         fclose(out);
1620     }
1621 #endif
1622
1623     if ((llen + ctype_num + 2 + 1) != n) {
1624         ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1625         SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_LENGTH_MISMATCH);
1626         goto err;
1627     }
1628
1629     for (nc = 0; nc < llen;) {
1630         n2s(p, l);
1631         if ((l + nc + 2) > llen) {
1632             if ((s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
1633                 goto cont;      /* netscape bugs */
1634             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1635             SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, SSL_R_CA_DN_TOO_LONG);
1636             goto err;
1637         }
1638
1639         q = p;
1640
1641         if ((xn = d2i_X509_NAME(NULL, &q, l)) == NULL) {
1642             /* If netscape tolerance is on, ignore errors */
1643             if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG)
1644                 goto cont;
1645             else {
1646                 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1647                 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, ERR_R_ASN1_LIB);
1648                 goto err;
1649             }
1650         }
1651
1652         if (q != (p + l)) {
1653             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1654             SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,
1655                    SSL_R_CA_DN_LENGTH_MISMATCH);
1656             goto err;
1657         }
1658         if (!sk_X509_NAME_push(ca_sk, xn)) {
1659             SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST, ERR_R_MALLOC_FAILURE);
1660             goto err;
1661         }
1662
1663         p += l;
1664         nc += l + 2;
1665     }
1666
1667     if (0) {
1668  cont:
1669         ERR_clear_error();
1670     }
1671
1672     /* we should setup a certificate to return.... */
1673     s->s3->tmp.cert_req = 1;
1674     s->s3->tmp.ctype_num = ctype_num;
1675     if (s->s3->tmp.ca_names != NULL)
1676         sk_X509_NAME_pop_free(s->s3->tmp.ca_names, X509_NAME_free);
1677     s->s3->tmp.ca_names = ca_sk;
1678     ca_sk = NULL;
1679
1680     ret = 1;
1681  err:
1682     if (ca_sk != NULL)
1683         sk_X509_NAME_pop_free(ca_sk, X509_NAME_free);
1684     return (ret);
1685 }
1686
1687 static int ca_dn_cmp(const X509_NAME *const *a, const X509_NAME *const *b)
1688 {
1689     return (X509_NAME_cmp(*a, *b));
1690 }
1691
1692 #ifndef OPENSSL_NO_TLSEXT
1693 int ssl3_get_new_session_ticket(SSL *s)
1694 {
1695     int ok, al, ret = 0, ticklen;
1696     long n;
1697     const unsigned char *p;
1698     unsigned char *d;
1699
1700     n = s->method->ssl_get_message(s,
1701                                    SSL3_ST_CR_SESSION_TICKET_A,
1702                                    SSL3_ST_CR_SESSION_TICKET_B,
1703                                    -1, 16384, &ok);
1704
1705     if (!ok)
1706         return ((int)n);
1707
1708     if (s->s3->tmp.message_type == SSL3_MT_FINISHED) {
1709         s->s3->tmp.reuse_message = 1;
1710         return (1);
1711     }
1712     if (s->s3->tmp.message_type != SSL3_MT_NEWSESSION_TICKET) {
1713         al = SSL_AD_UNEXPECTED_MESSAGE;
1714         SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_BAD_MESSAGE_TYPE);
1715         goto f_err;
1716     }
1717     if (n < 6) {
1718         /* need at least ticket_lifetime_hint + ticket length */
1719         al = SSL_AD_DECODE_ERROR;
1720         SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_LENGTH_MISMATCH);
1721         goto f_err;
1722     }
1723
1724     p = d = (unsigned char *)s->init_msg;
1725     n2l(p, s->session->tlsext_tick_lifetime_hint);
1726     n2s(p, ticklen);
1727     /* ticket_lifetime_hint + ticket_length + ticket */
1728     if (ticklen + 6 != n) {
1729         al = SSL_AD_DECODE_ERROR;
1730         SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_LENGTH_MISMATCH);
1731         goto f_err;
1732     }
1733     if (s->session->tlsext_tick) {
1734         OPENSSL_free(s->session->tlsext_tick);
1735         s->session->tlsext_ticklen = 0;
1736     }
1737     s->session->tlsext_tick = OPENSSL_malloc(ticklen);
1738     if (!s->session->tlsext_tick) {
1739         SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, ERR_R_MALLOC_FAILURE);
1740         goto err;
1741     }
1742     memcpy(s->session->tlsext_tick, p, ticklen);
1743     s->session->tlsext_ticklen = ticklen;
1744     /*
1745      * There are two ways to detect a resumed ticket sesion. One is to set an
1746      * appropriate session ID and then the server must return a match in
1747      * ServerHello. This allows the normal client session ID matching to work
1748      * and we know much earlier that the ticket has been accepted. The
1749      * other way is to set zero length session ID when the ticket is
1750      * presented and rely on the handshake to determine session resumption.
1751      * We choose the former approach because this fits in with assumptions
1752      * elsewhere in OpenSSL. The session ID is set to the SHA256 (or SHA1 is
1753      * SHA256 is disabled) hash of the ticket.
1754      */
1755     EVP_Digest(p, ticklen,
1756                s->session->session_id, &s->session->session_id_length,
1757 # ifndef OPENSSL_NO_SHA256
1758                EVP_sha256(), NULL);
1759 # else
1760                EVP_sha1(), NULL);
1761 # endif
1762     ret = 1;
1763     return (ret);
1764  f_err:
1765     ssl3_send_alert(s, SSL3_AL_FATAL, al);
1766  err:
1767     return (-1);
1768 }
1769
1770 int ssl3_get_cert_status(SSL *s)
1771 {
1772     int ok, al;
1773     unsigned long resplen;
1774     long n;
1775     const unsigned char *p;
1776
1777     n = s->method->ssl_get_message(s,
1778                                    SSL3_ST_CR_CERT_STATUS_A,
1779                                    SSL3_ST_CR_CERT_STATUS_B,
1780                                    SSL3_MT_CERTIFICATE_STATUS, 16384, &ok);
1781
1782     if (!ok)
1783         return ((int)n);
1784     if (n < 4) {
1785         /* need at least status type + length */
1786         al = SSL_AD_DECODE_ERROR;
1787         SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_LENGTH_MISMATCH);
1788         goto f_err;
1789     }
1790     p = (unsigned char *)s->init_msg;
1791     if (*p++ != TLSEXT_STATUSTYPE_ocsp) {
1792         al = SSL_AD_DECODE_ERROR;
1793         SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_UNSUPPORTED_STATUS_TYPE);
1794         goto f_err;
1795     }
1796     n2l3(p, resplen);
1797     if (resplen + 4 != (unsigned long)n) {
1798         al = SSL_AD_DECODE_ERROR;
1799         SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_LENGTH_MISMATCH);
1800         goto f_err;
1801     }
1802     if (s->tlsext_ocsp_resp)
1803         OPENSSL_free(s->tlsext_ocsp_resp);
1804     s->tlsext_ocsp_resp = BUF_memdup(p, resplen);
1805     if (!s->tlsext_ocsp_resp) {
1806         al = SSL_AD_INTERNAL_ERROR;
1807         SSLerr(SSL_F_SSL3_GET_CERT_STATUS, ERR_R_MALLOC_FAILURE);
1808         goto f_err;
1809     }
1810     s->tlsext_ocsp_resplen = resplen;
1811     if (s->ctx->tlsext_status_cb) {
1812         int ret;
1813         ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
1814         if (ret == 0) {
1815             al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
1816             SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_INVALID_STATUS_RESPONSE);
1817             goto f_err;
1818         }
1819         if (ret < 0) {
1820             al = SSL_AD_INTERNAL_ERROR;
1821             SSLerr(SSL_F_SSL3_GET_CERT_STATUS, ERR_R_MALLOC_FAILURE);
1822             goto f_err;
1823         }
1824     }
1825     return 1;
1826  f_err:
1827     ssl3_send_alert(s, SSL3_AL_FATAL, al);
1828     return (-1);
1829 }
1830 #endif
1831
1832 int ssl3_get_server_done(SSL *s)
1833 {
1834     int ok, ret = 0;
1835     long n;
1836
1837     /* Second to last param should be very small, like 0 :-) */
1838     n = s->method->ssl_get_message(s,
1839                                    SSL3_ST_CR_SRVR_DONE_A,
1840                                    SSL3_ST_CR_SRVR_DONE_B,
1841                                    SSL3_MT_SERVER_DONE, 30, &ok);
1842
1843     if (!ok)
1844         return ((int)n);
1845     if (n > 0) {
1846         /* should contain no data */
1847         ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1848         SSLerr(SSL_F_SSL3_GET_SERVER_DONE, SSL_R_LENGTH_MISMATCH);
1849         return -1;
1850     }
1851     ret = 1;
1852     return (ret);
1853 }
1854
1855 int ssl3_send_client_key_exchange(SSL *s)
1856 {
1857     unsigned char *p, *d;
1858     int n;
1859     unsigned long l;
1860 #ifndef OPENSSL_NO_RSA
1861     unsigned char *q;
1862     EVP_PKEY *pkey = NULL;
1863 #endif
1864 #ifndef OPENSSL_NO_KRB5
1865     KSSL_ERR kssl_err;
1866 #endif                          /* OPENSSL_NO_KRB5 */
1867 #ifndef OPENSSL_NO_ECDH
1868     EC_KEY *clnt_ecdh = NULL;
1869     const EC_POINT *srvr_ecpoint = NULL;
1870     EVP_PKEY *srvr_pub_pkey = NULL;
1871     unsigned char *encodedPoint = NULL;
1872     int encoded_pt_len = 0;
1873     BN_CTX *bn_ctx = NULL;
1874 #endif
1875
1876     if (s->state == SSL3_ST_CW_KEY_EXCH_A) {
1877         d = (unsigned char *)s->init_buf->data;
1878         p = &(d[4]);
1879
1880         l = s->s3->tmp.new_cipher->algorithms;
1881
1882         /* Fool emacs indentation */
1883         if (0) {
1884         }
1885 #ifndef OPENSSL_NO_RSA
1886         else if (l & SSL_kRSA) {
1887             RSA *rsa;
1888             unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1889
1890             if (s->session->sess_cert == NULL) {
1891                 /*
1892                  * We should always have a server certificate with SSL_kRSA.
1893                  */
1894                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1895                        ERR_R_INTERNAL_ERROR);
1896                 goto err;
1897             }
1898
1899             if (s->session->sess_cert->peer_rsa_tmp != NULL)
1900                 rsa = s->session->sess_cert->peer_rsa_tmp;
1901             else {
1902                 pkey =
1903                     X509_get_pubkey(s->session->
1904                                     sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].
1905                                     x509);
1906                 if ((pkey == NULL) || (pkey->type != EVP_PKEY_RSA)
1907                     || (pkey->pkey.rsa == NULL)) {
1908                     SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1909                            ERR_R_INTERNAL_ERROR);
1910                     goto err;
1911                 }
1912                 rsa = pkey->pkey.rsa;
1913                 EVP_PKEY_free(pkey);
1914             }
1915
1916             tmp_buf[0] = s->client_version >> 8;
1917             tmp_buf[1] = s->client_version & 0xff;
1918             if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= 0)
1919                 goto err;
1920
1921             s->session->master_key_length = sizeof tmp_buf;
1922
1923             q = p;
1924             /* Fix buf for TLS and beyond */
1925             if (s->version > SSL3_VERSION)
1926                 p += 2;
1927             n = RSA_public_encrypt(sizeof tmp_buf,
1928                                    tmp_buf, p, rsa, RSA_PKCS1_PADDING);
1929 # ifdef PKCS1_CHECK
1930             if (s->options & SSL_OP_PKCS1_CHECK_1)
1931                 p[1]++;
1932             if (s->options & SSL_OP_PKCS1_CHECK_2)
1933                 tmp_buf[0] = 0x70;
1934 # endif
1935             if (n <= 0) {
1936                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1937                        SSL_R_BAD_RSA_ENCRYPT);
1938                 goto err;
1939             }
1940
1941             /* Fix buf for TLS and beyond */
1942             if (s->version > SSL3_VERSION) {
1943                 s2n(n, q);
1944                 n += 2;
1945             }
1946
1947             s->session->master_key_length =
1948                 s->method->ssl3_enc->generate_master_secret(s,
1949                                                             s->
1950                                                             session->master_key,
1951                                                             tmp_buf,
1952                                                             sizeof tmp_buf);
1953             OPENSSL_cleanse(tmp_buf, sizeof tmp_buf);
1954         }
1955 #endif
1956 #ifndef OPENSSL_NO_KRB5
1957         else if (l & SSL_kKRB5) {
1958             krb5_error_code krb5rc;
1959             KSSL_CTX *kssl_ctx = s->kssl_ctx;
1960             /*  krb5_data   krb5_ap_req;  */
1961             krb5_data *enc_ticket;
1962             krb5_data authenticator, *authp = NULL;
1963             EVP_CIPHER_CTX ciph_ctx;
1964             EVP_CIPHER *enc = NULL;
1965             unsigned char iv[EVP_MAX_IV_LENGTH];
1966             unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1967             unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH + EVP_MAX_IV_LENGTH];
1968             int padl, outl = sizeof(epms);
1969
1970             EVP_CIPHER_CTX_init(&ciph_ctx);
1971
1972 # ifdef KSSL_DEBUG
1973             printf("ssl3_send_client_key_exchange(%lx & %lx)\n",
1974                    l, SSL_kKRB5);
1975 # endif                         /* KSSL_DEBUG */
1976
1977             authp = NULL;
1978 # ifdef KRB5SENDAUTH
1979             if (KRB5SENDAUTH)
1980                 authp = &authenticator;
1981 # endif                         /* KRB5SENDAUTH */
1982
1983             krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp, &kssl_err);
1984             enc = kssl_map_enc(kssl_ctx->enctype);
1985             if (enc == NULL)
1986                 goto err;
1987 # ifdef KSSL_DEBUG
1988             {
1989                 printf("kssl_cget_tkt rtn %d\n", krb5rc);
1990                 if (krb5rc && kssl_err.text)
1991                     printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text);
1992             }
1993 # endif                         /* KSSL_DEBUG */
1994
1995             if (krb5rc) {
1996                 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
1997                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, kssl_err.reason);
1998                 goto err;
1999             }
2000
2001             /*-
2002              * 20010406 VRS - Earlier versions used KRB5 AP_REQ
2003              * in place of RFC 2712 KerberosWrapper, as in:
2004              *
2005              * Send ticket (copy to *p, set n = length)
2006              * n = krb5_ap_req.length;
2007              * memcpy(p, krb5_ap_req.data, krb5_ap_req.length);
2008              * if (krb5_ap_req.data)
2009              *   kssl_krb5_free_data_contents(NULL,&krb5_ap_req);
2010              *
2011              * Now using real RFC 2712 KerberosWrapper
2012              * (Thanks to Simon Wilkinson <sxw@sxw.org.uk>)
2013              * Note: 2712 "opaque" types are here replaced
2014              * with a 2-byte length followed by the value.
2015              * Example:
2016              * KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms
2017              * Where "xx xx" = length bytes.  Shown here with
2018              * optional authenticator omitted.
2019              */
2020
2021             /*  KerberosWrapper.Ticket              */
2022             s2n(enc_ticket->length, p);
2023             memcpy(p, enc_ticket->data, enc_ticket->length);
2024             p += enc_ticket->length;
2025             n = enc_ticket->length + 2;
2026
2027             /*  KerberosWrapper.Authenticator       */
2028             if (authp && authp->length) {
2029                 s2n(authp->length, p);
2030                 memcpy(p, authp->data, authp->length);
2031                 p += authp->length;
2032                 n += authp->length + 2;
2033
2034                 free(authp->data);
2035                 authp->data = NULL;
2036                 authp->length = 0;
2037             } else {
2038                 s2n(0, p);      /* null authenticator length */
2039                 n += 2;
2040             }
2041
2042             tmp_buf[0] = s->client_version >> 8;
2043             tmp_buf[1] = s->client_version & 0xff;
2044             if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= 0)
2045                 goto err;
2046
2047             /*-
2048              * 20010420 VRS.  Tried it this way; failed.
2049              *      EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL);
2050              *      EVP_CIPHER_CTX_set_key_length(&ciph_ctx,
2051              *                              kssl_ctx->length);
2052              *      EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv);
2053              */
2054
2055             memset(iv, 0, sizeof iv); /* per RFC 1510 */
2056             EVP_EncryptInit_ex(&ciph_ctx, enc, NULL, kssl_ctx->key, iv);
2057             EVP_EncryptUpdate(&ciph_ctx, epms, &outl, tmp_buf,
2058                               sizeof tmp_buf);
2059             EVP_EncryptFinal_ex(&ciph_ctx, &(epms[outl]), &padl);
2060             outl += padl;
2061             if (outl > sizeof epms) {
2062                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2063                        ERR_R_INTERNAL_ERROR);
2064                 goto err;
2065             }
2066             EVP_CIPHER_CTX_cleanup(&ciph_ctx);
2067
2068             /*  KerberosWrapper.EncryptedPreMasterSecret    */
2069             s2n(outl, p);
2070             memcpy(p, epms, outl);
2071             p += outl;
2072             n += outl + 2;
2073
2074             s->session->master_key_length =
2075                 s->method->ssl3_enc->generate_master_secret(s,
2076                                                             s->
2077                                                             session->master_key,
2078                                                             tmp_buf,
2079                                                             sizeof tmp_buf);
2080
2081             OPENSSL_cleanse(tmp_buf, sizeof tmp_buf);
2082             OPENSSL_cleanse(epms, outl);
2083         }
2084 #endif
2085 #ifndef OPENSSL_NO_DH
2086         else if (l & (SSL_kEDH | SSL_kDHr | SSL_kDHd)) {
2087             DH *dh_srvr, *dh_clnt;
2088
2089             if (s->session->sess_cert == NULL) {
2090                 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
2091                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2092                        SSL_R_UNEXPECTED_MESSAGE);
2093                 goto err;
2094             }
2095
2096             if (s->session->sess_cert->peer_dh_tmp != NULL)
2097                 dh_srvr = s->session->sess_cert->peer_dh_tmp;
2098             else {
2099                 /* we get them from the cert */
2100                 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
2101                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2102                        SSL_R_UNABLE_TO_FIND_DH_PARAMETERS);
2103                 goto err;
2104             }
2105
2106             /* generate a new random key */
2107             if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) {
2108                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB);
2109                 goto err;
2110             }
2111             if (!DH_generate_key(dh_clnt)) {
2112                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB);
2113                 goto err;
2114             }
2115
2116             /*
2117              * use the 'p' output buffer for the DH key, but make sure to
2118              * clear it out afterwards
2119              */
2120
2121             n = DH_compute_key(p, dh_srvr->pub_key, dh_clnt);
2122
2123             if (n <= 0) {
2124                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB);
2125                 goto err;
2126             }
2127
2128             /* generate master key from the result */
2129             s->session->master_key_length =
2130                 s->method->ssl3_enc->generate_master_secret(s,
2131                                                             s->
2132                                                             session->master_key,
2133                                                             p, n);
2134             /* clean up */
2135             memset(p, 0, n);
2136
2137             /* send off the data */
2138             n = BN_num_bytes(dh_clnt->pub_key);
2139             s2n(n, p);
2140             BN_bn2bin(dh_clnt->pub_key, p);
2141             n += 2;
2142
2143             DH_free(dh_clnt);
2144
2145             /* perhaps clean things up a bit EAY EAY EAY EAY */
2146         }
2147 #endif
2148
2149 #ifndef OPENSSL_NO_ECDH
2150         else if ((l & SSL_kECDH) || (l & SSL_kECDHE)) {
2151             const EC_GROUP *srvr_group = NULL;
2152             EC_KEY *tkey;
2153             int ecdh_clnt_cert = 0;
2154             int field_size = 0;
2155
2156             if (s->session->sess_cert == NULL) {
2157                 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
2158                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2159                        SSL_R_UNEXPECTED_MESSAGE);
2160                 goto err;
2161             }
2162
2163             /*
2164              * Did we send out the client's ECDH share for use in premaster
2165              * computation as part of client certificate? If so, set
2166              * ecdh_clnt_cert to 1.
2167              */
2168             if ((l & SSL_kECDH) && (s->cert != NULL)) {
2169                 /*-
2170                  * XXX: For now, we do not support client
2171                  * authentication using ECDH certificates.
2172                  * To add such support, one needs to add
2173                  * code that checks for appropriate
2174                  * conditions and sets ecdh_clnt_cert to 1.
2175                  * For example, the cert have an ECC
2176                  * key on the same curve as the server's
2177                  * and the key should be authorized for
2178                  * key agreement.
2179                  *
2180                  * One also needs to add code in ssl3_connect
2181                  * to skip sending the certificate verify
2182                  * message.
2183                  *
2184                  * if ((s->cert->key->privatekey != NULL) &&
2185                  *     (s->cert->key->privatekey->type ==
2186                  *      EVP_PKEY_EC) && ...)
2187                  * ecdh_clnt_cert = 1;
2188                  */
2189             }
2190
2191             if (s->session->sess_cert->peer_ecdh_tmp != NULL) {
2192                 tkey = s->session->sess_cert->peer_ecdh_tmp;
2193             } else {
2194                 /* Get the Server Public Key from Cert */
2195                 srvr_pub_pkey =
2196                     X509_get_pubkey(s->session->
2197                                     sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
2198                 if ((srvr_pub_pkey == NULL)
2199                     || (srvr_pub_pkey->type != EVP_PKEY_EC)
2200                     || (srvr_pub_pkey->pkey.ec == NULL)) {
2201                     SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2202                            ERR_R_INTERNAL_ERROR);
2203                     goto err;
2204                 }
2205
2206                 tkey = srvr_pub_pkey->pkey.ec;
2207             }
2208
2209             srvr_group = EC_KEY_get0_group(tkey);
2210             srvr_ecpoint = EC_KEY_get0_public_key(tkey);
2211
2212             if ((srvr_group == NULL) || (srvr_ecpoint == NULL)) {
2213                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2214                        ERR_R_INTERNAL_ERROR);
2215                 goto err;
2216             }
2217
2218             if ((clnt_ecdh = EC_KEY_new()) == NULL) {
2219                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2220                        ERR_R_MALLOC_FAILURE);
2221                 goto err;
2222             }
2223
2224             if (!EC_KEY_set_group(clnt_ecdh, srvr_group)) {
2225                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_EC_LIB);
2226                 goto err;
2227             }
2228             if (ecdh_clnt_cert) {
2229                 /*
2230                  * Reuse key info from our certificate We only need our
2231                  * private key to perform the ECDH computation.
2232                  */
2233                 const BIGNUM *priv_key;
2234                 tkey = s->cert->key->privatekey->pkey.ec;
2235                 priv_key = EC_KEY_get0_private_key(tkey);
2236                 if (priv_key == NULL) {
2237                     SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2238                            ERR_R_MALLOC_FAILURE);
2239                     goto err;
2240                 }
2241                 if (!EC_KEY_set_private_key(clnt_ecdh, priv_key)) {
2242                     SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_EC_LIB);
2243                     goto err;
2244                 }
2245             } else {
2246                 /* Generate a new ECDH key pair */
2247                 if (!(EC_KEY_generate_key(clnt_ecdh))) {
2248                     SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2249                            ERR_R_ECDH_LIB);
2250                     goto err;
2251                 }
2252             }
2253
2254             /*
2255              * use the 'p' output buffer for the ECDH key, but make sure to
2256              * clear it out afterwards
2257              */
2258
2259             field_size = EC_GROUP_get_degree(srvr_group);
2260             if (field_size <= 0) {
2261                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB);
2262                 goto err;
2263             }
2264             n = ECDH_compute_key(p, (field_size + 7) / 8, srvr_ecpoint,
2265                                  clnt_ecdh, NULL);
2266             if (n <= 0) {
2267                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB);
2268                 goto err;
2269             }
2270
2271             /* generate master key from the result */
2272             s->session->master_key_length =
2273                 s->method->ssl3_enc->generate_master_secret(s,
2274                                                             s->
2275                                                             session->master_key,
2276                                                             p, n);
2277
2278             memset(p, 0, n);    /* clean up */
2279
2280             if (ecdh_clnt_cert) {
2281                 /* Send empty client key exch message */
2282                 n = 0;
2283             } else {
2284                 /*
2285                  * First check the size of encoding and allocate memory
2286                  * accordingly.
2287                  */
2288                 encoded_pt_len =
2289                     EC_POINT_point2oct(srvr_group,
2290                                        EC_KEY_get0_public_key(clnt_ecdh),
2291                                        POINT_CONVERSION_UNCOMPRESSED,
2292                                        NULL, 0, NULL);
2293
2294                 encodedPoint = (unsigned char *)
2295                     OPENSSL_malloc(encoded_pt_len * sizeof(unsigned char));
2296                 bn_ctx = BN_CTX_new();
2297                 if ((encodedPoint == NULL) || (bn_ctx == NULL)) {
2298                     SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2299                            ERR_R_MALLOC_FAILURE);
2300                     goto err;
2301                 }
2302
2303                 /* Encode the public key */
2304                 n = EC_POINT_point2oct(srvr_group,
2305                                        EC_KEY_get0_public_key(clnt_ecdh),
2306                                        POINT_CONVERSION_UNCOMPRESSED,
2307                                        encodedPoint, encoded_pt_len, bn_ctx);
2308
2309                 *p = n;         /* length of encoded point */
2310                 /* Encoded point will be copied here */
2311                 p += 1;
2312                 /* copy the point */
2313                 memcpy((unsigned char *)p, encodedPoint, n);
2314                 /* increment n to account for length field */
2315                 n += 1;
2316             }
2317
2318             /* Free allocated memory */
2319             BN_CTX_free(bn_ctx);
2320             if (encodedPoint != NULL)
2321                 OPENSSL_free(encodedPoint);
2322             if (clnt_ecdh != NULL)
2323                 EC_KEY_free(clnt_ecdh);
2324             EVP_PKEY_free(srvr_pub_pkey);
2325         }
2326 #endif                          /* !OPENSSL_NO_ECDH */
2327         else {
2328             ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
2329             SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
2330             goto err;
2331         }
2332
2333         *(d++) = SSL3_MT_CLIENT_KEY_EXCHANGE;
2334         l2n3(n, d);
2335
2336         s->state = SSL3_ST_CW_KEY_EXCH_B;
2337         /* number of bytes to write */
2338         s->init_num = n + 4;
2339         s->init_off = 0;
2340     }
2341
2342     /* SSL3_ST_CW_KEY_EXCH_B */
2343     return (ssl3_do_write(s, SSL3_RT_HANDSHAKE));
2344  err:
2345 #ifndef OPENSSL_NO_ECDH
2346     BN_CTX_free(bn_ctx);
2347     if (encodedPoint != NULL)
2348         OPENSSL_free(encodedPoint);
2349     if (clnt_ecdh != NULL)
2350         EC_KEY_free(clnt_ecdh);
2351     EVP_PKEY_free(srvr_pub_pkey);
2352 #endif
2353     return (-1);
2354 }
2355
2356 int ssl3_send_client_verify(SSL *s)
2357 {
2358     unsigned char *p, *d;
2359     unsigned char data[MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH];
2360     EVP_PKEY *pkey;
2361 #ifndef OPENSSL_NO_RSA
2362     unsigned u = 0;
2363 #endif
2364     unsigned long n;
2365 #if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
2366     int j;
2367 #endif
2368
2369     if (s->state == SSL3_ST_CW_CERT_VRFY_A) {
2370         d = (unsigned char *)s->init_buf->data;
2371         p = &(d[4]);
2372         pkey = s->cert->key->privatekey;
2373
2374         s->method->ssl3_enc->cert_verify_mac(s, &(s->s3->finish_dgst2),
2375                                              &(data[MD5_DIGEST_LENGTH]));
2376
2377 #ifndef OPENSSL_NO_RSA
2378         if (pkey->type == EVP_PKEY_RSA) {
2379             s->method->ssl3_enc->cert_verify_mac(s,
2380                                                  &(s->s3->finish_dgst1),
2381                                                  &(data[0]));
2382             if (RSA_sign
2383                 (NID_md5_sha1, data, MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH,
2384                  &(p[2]), &u, pkey->pkey.rsa) <= 0) {
2385                 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_RSA_LIB);
2386                 goto err;
2387             }
2388             s2n(u, p);
2389             n = u + 2;
2390         } else
2391 #endif
2392 #ifndef OPENSSL_NO_DSA
2393         if (pkey->type == EVP_PKEY_DSA) {
2394             if (!DSA_sign(pkey->save_type,
2395                           &(data[MD5_DIGEST_LENGTH]),
2396                           SHA_DIGEST_LENGTH, &(p[2]),
2397                           (unsigned int *)&j, pkey->pkey.dsa)) {
2398                 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_DSA_LIB);
2399                 goto err;
2400             }
2401             s2n(j, p);
2402             n = j + 2;
2403         } else
2404 #endif
2405 #ifndef OPENSSL_NO_ECDSA
2406         if (pkey->type == EVP_PKEY_EC) {
2407             if (!ECDSA_sign(pkey->save_type,
2408                             &(data[MD5_DIGEST_LENGTH]),
2409                             SHA_DIGEST_LENGTH, &(p[2]),
2410                             (unsigned int *)&j, pkey->pkey.ec)) {
2411                 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_ECDSA_LIB);
2412                 goto err;
2413             }
2414             s2n(j, p);
2415             n = j + 2;
2416         } else
2417 #endif
2418         {
2419             SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_INTERNAL_ERROR);
2420             goto err;
2421         }
2422         *(d++) = SSL3_MT_CERTIFICATE_VERIFY;
2423         l2n3(n, d);
2424
2425         s->state = SSL3_ST_CW_CERT_VRFY_B;
2426         s->init_num = (int)n + 4;
2427         s->init_off = 0;
2428     }
2429     return (ssl3_do_write(s, SSL3_RT_HANDSHAKE));
2430  err:
2431     return (-1);
2432 }
2433
2434 int ssl3_send_client_certificate(SSL *s)
2435 {
2436     X509 *x509 = NULL;
2437     EVP_PKEY *pkey = NULL;
2438     int i;
2439     unsigned long l;
2440
2441     if (s->state == SSL3_ST_CW_CERT_A) {
2442         if ((s->cert == NULL) ||
2443             (s->cert->key->x509 == NULL) ||
2444             (s->cert->key->privatekey == NULL))
2445             s->state = SSL3_ST_CW_CERT_B;
2446         else
2447             s->state = SSL3_ST_CW_CERT_C;
2448     }
2449
2450     /* We need to get a client cert */
2451     if (s->state == SSL3_ST_CW_CERT_B) {
2452         /*
2453          * If we get an error, we need to ssl->rwstate=SSL_X509_LOOKUP;
2454          * return(-1); We then get retied later
2455          */
2456         i = 0;
2457         i = ssl_do_client_cert_cb(s, &x509, &pkey);
2458         if (i < 0) {
2459             s->rwstate = SSL_X509_LOOKUP;
2460             return (-1);
2461         }
2462         s->rwstate = SSL_NOTHING;
2463         if ((i == 1) && (pkey != NULL) && (x509 != NULL)) {
2464             s->state = SSL3_ST_CW_CERT_B;
2465             if (!SSL_use_certificate(s, x509) || !SSL_use_PrivateKey(s, pkey))
2466                 i = 0;
2467         } else if (i == 1) {
2468             i = 0;
2469             SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE,
2470                    SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
2471         }
2472
2473         if (x509 != NULL)
2474             X509_free(x509);
2475         if (pkey != NULL)
2476             EVP_PKEY_free(pkey);
2477         if (i == 0) {
2478             if (s->version == SSL3_VERSION) {
2479                 s->s3->tmp.cert_req = 0;
2480                 ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_NO_CERTIFICATE);
2481                 return (1);
2482             } else {
2483                 s->s3->tmp.cert_req = 2;
2484             }
2485         }
2486
2487         /* Ok, we have a cert */
2488         s->state = SSL3_ST_CW_CERT_C;
2489     }
2490
2491     if (s->state == SSL3_ST_CW_CERT_C) {
2492         s->state = SSL3_ST_CW_CERT_D;
2493         l = ssl3_output_cert_chain(s,
2494                                    (s->s3->tmp.cert_req ==
2495                                     2) ? NULL : s->cert->key->x509);
2496         s->init_num = (int)l;
2497         s->init_off = 0;
2498     }
2499     /* SSL3_ST_CW_CERT_D */
2500     return (ssl3_do_write(s, SSL3_RT_HANDSHAKE));
2501 }
2502
2503 #define has_bits(i,m)   (((i)&(m)) == (m))
2504
2505 int ssl3_check_cert_and_algorithm(SSL *s)
2506 {
2507     int i, idx;
2508     long algs;
2509     EVP_PKEY *pkey = NULL;
2510     SESS_CERT *sc;
2511 #ifndef OPENSSL_NO_RSA
2512     RSA *rsa;
2513 #endif
2514 #ifndef OPENSSL_NO_DH
2515     DH *dh;
2516 #endif
2517
2518     sc = s->session->sess_cert;
2519
2520     algs = s->s3->tmp.new_cipher->algorithms;
2521
2522     /* we don't have a certificate */
2523     if (algs & (SSL_aDH | SSL_aNULL | SSL_aKRB5))
2524         return (1);
2525
2526     if (sc == NULL) {
2527         SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, ERR_R_INTERNAL_ERROR);
2528         goto err;
2529     }
2530 #ifndef OPENSSL_NO_RSA
2531     rsa = s->session->sess_cert->peer_rsa_tmp;
2532 #endif
2533 #ifndef OPENSSL_NO_DH
2534     dh = s->session->sess_cert->peer_dh_tmp;
2535 #endif
2536
2537     /* This is the passed certificate */
2538
2539     idx = sc->peer_cert_type;
2540 #ifndef OPENSSL_NO_ECDH
2541     if (idx == SSL_PKEY_ECC) {
2542         if (check_srvr_ecc_cert_and_alg(sc->peer_pkeys[idx].x509,
2543                                         s->s3->tmp.new_cipher) == 0) {
2544             /* check failed */
2545             SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_BAD_ECC_CERT);
2546             goto f_err;
2547         } else {
2548             return 1;
2549         }
2550     }
2551 #endif
2552     pkey = X509_get_pubkey(sc->peer_pkeys[idx].x509);
2553     i = X509_certificate_type(sc->peer_pkeys[idx].x509, pkey);
2554     EVP_PKEY_free(pkey);
2555
2556     /* Check that we have a certificate if we require one */
2557     if ((algs & SSL_aRSA) && !has_bits(i, EVP_PK_RSA | EVP_PKT_SIGN)) {
2558         SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2559                SSL_R_MISSING_RSA_SIGNING_CERT);
2560         goto f_err;
2561     }
2562 #ifndef OPENSSL_NO_DSA
2563     else if ((algs & SSL_aDSS) && !has_bits(i, EVP_PK_DSA | EVP_PKT_SIGN)) {
2564         SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2565                SSL_R_MISSING_DSA_SIGNING_CERT);
2566         goto f_err;
2567     }
2568 #endif
2569 #ifndef OPENSSL_NO_RSA
2570     if ((algs & SSL_kRSA) &&
2571         !(has_bits(i, EVP_PK_RSA | EVP_PKT_ENC) || (rsa != NULL))) {
2572         SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2573                SSL_R_MISSING_RSA_ENCRYPTING_CERT);
2574         goto f_err;
2575     }
2576 #endif
2577 #ifndef OPENSSL_NO_DH
2578     if ((algs & SSL_kEDH) &&
2579         !(has_bits(i, EVP_PK_DH | EVP_PKT_EXCH) || (dh != NULL))) {
2580         SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_DH_KEY);
2581         goto f_err;
2582     } else if ((algs & SSL_kDHr) && !has_bits(i, EVP_PK_DH | EVP_PKS_RSA)) {
2583         SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2584                SSL_R_MISSING_DH_RSA_CERT);
2585         goto f_err;
2586     }
2587 # ifndef OPENSSL_NO_DSA
2588     else if ((algs & SSL_kDHd) && !has_bits(i, EVP_PK_DH | EVP_PKS_DSA)) {
2589         SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2590                SSL_R_MISSING_DH_DSA_CERT);
2591         goto f_err;
2592     }
2593 # endif
2594 #endif
2595
2596     if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && !has_bits(i, EVP_PKT_EXP)) {
2597 #ifndef OPENSSL_NO_RSA
2598         if (algs & SSL_kRSA) {
2599             if (rsa == NULL
2600                 || RSA_size(rsa) * 8 >
2601                 SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) {
2602                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2603                        SSL_R_MISSING_EXPORT_TMP_RSA_KEY);
2604                 goto f_err;
2605             }
2606         } else
2607 #endif
2608 #ifndef OPENSSL_NO_DH
2609         if (algs & (SSL_kEDH | SSL_kDHr | SSL_kDHd)) {
2610             if (dh == NULL
2611                 || DH_size(dh) * 8 >
2612                 SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) {
2613                 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2614                        SSL_R_MISSING_EXPORT_TMP_DH_KEY);
2615                 goto f_err;
2616             }
2617         } else
2618 #endif
2619         {
2620             SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2621                    SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
2622             goto f_err;
2623         }
2624     }
2625     return (1);
2626  f_err:
2627     ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
2628  err:
2629     return (0);
2630 }
2631
2632 #ifndef OPENSSL_NO_ECDH
2633 /* This is the complement of nid2curve_id in s3_srvr.c. */
2634 static int curve_id2nid(int curve_id)
2635 {
2636     /*
2637      * ECC curves from draft-ietf-tls-ecc-01.txt (Mar 15, 2001) (no changes
2638      * in draft-ietf-tls-ecc-03.txt [June 2003])
2639      */
2640     static int nid_list[26] = {
2641         0,
2642         NID_sect163k1,          /* sect163k1 (1) */
2643         NID_sect163r1,          /* sect163r1 (2) */
2644         NID_sect163r2,          /* sect163r2 (3) */
2645         NID_sect193r1,          /* sect193r1 (4) */
2646         NID_sect193r2,          /* sect193r2 (5) */
2647         NID_sect233k1,          /* sect233k1 (6) */
2648         NID_sect233r1,          /* sect233r1 (7) */
2649         NID_sect239k1,          /* sect239k1 (8) */
2650         NID_sect283k1,          /* sect283k1 (9) */
2651         NID_sect283r1,          /* sect283r1 (10) */
2652         NID_sect409k1,          /* sect409k1 (11) */
2653         NID_sect409r1,          /* sect409r1 (12) */
2654         NID_sect571k1,          /* sect571k1 (13) */
2655         NID_sect571r1,          /* sect571r1 (14) */
2656         NID_secp160k1,          /* secp160k1 (15) */
2657         NID_secp160r1,          /* secp160r1 (16) */
2658         NID_secp160r2,          /* secp160r2 (17) */
2659         NID_secp192k1,          /* secp192k1 (18) */
2660         NID_X9_62_prime192v1,   /* secp192r1 (19) */
2661         NID_secp224k1,          /* secp224k1 (20) */
2662         NID_secp224r1,          /* secp224r1 (21) */
2663         NID_secp256k1,          /* secp256k1 (22) */
2664         NID_X9_62_prime256v1,   /* secp256r1 (23) */
2665         NID_secp384r1,          /* secp384r1 (24) */
2666         NID_secp521r1           /* secp521r1 (25) */
2667     };
2668
2669     if ((curve_id < 1) || (curve_id > 25))
2670         return 0;
2671
2672     return nid_list[curve_id];
2673 }
2674 #endif
2675
2676 /*
2677  * Check to see if handshake is full or resumed. Usually this is just a case
2678  * of checking to see if a cache hit has occurred. In the case of session
2679  * tickets we have to check the next message to be sure.
2680  */
2681
2682 #ifndef OPENSSL_NO_TLSEXT
2683 int ssl3_check_finished(SSL *s)
2684 {
2685     int ok;
2686     long n;
2687     /*
2688      * If we have no ticket or session ID is non-zero length (a match of a
2689      * non-zero session length would never reach here) it cannot be a resumed
2690      * session.
2691      */
2692     if (!s->session->tlsext_tick || s->session->session_id_length)
2693         return 1;
2694     /*
2695      * this function is called when we really expect a Certificate message,
2696      * so permit appropriate message length
2697      */
2698     n = s->method->ssl_get_message(s,
2699                                    SSL3_ST_CR_CERT_A,
2700                                    SSL3_ST_CR_CERT_B,
2701                                    -1, s->max_cert_list, &ok);
2702     if (!ok)
2703         return ((int)n);
2704     s->s3->tmp.reuse_message = 1;
2705     if ((s->s3->tmp.message_type == SSL3_MT_FINISHED)
2706         || (s->s3->tmp.message_type == SSL3_MT_NEWSESSION_TICKET))
2707         return 2;
2708
2709     return 1;
2710 }
2711 #endif
2712
2713 int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey)
2714 {
2715     int i = 0;
2716 #ifndef OPENSSL_NO_ENGINE
2717     if (s->ctx->client_cert_engine) {
2718         i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s,
2719                                         SSL_get_client_CA_list(s),
2720                                         px509, ppkey, NULL, NULL, NULL);
2721         if (i != 0)
2722             return i;
2723     }
2724 #endif
2725     if (s->ctx->client_cert_cb)
2726         i = s->ctx->client_cert_cb(s, px509, ppkey);
2727     return i;
2728 }