s3_clnt.c revision 296465
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
145static SSL_METHOD *ssl3_get_client_method(int ver);
146static int ca_dn_cmp(const X509_NAME *const *a, const X509_NAME *const *b);
147
148#ifndef OPENSSL_NO_ECDH
149static int curve_id2nid(int curve_id);
150int check_srvr_ecc_cert_and_alg(X509 *x, SSL_CIPHER *cs);
151#endif
152
153static 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
161IMPLEMENT_ssl3_meth_func(SSLv3_client_method,
162                         ssl_undefined_function,
163                         ssl3_connect, ssl3_get_client_method)
164
165int 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
592int 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
700int 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
887int 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
1069int 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
1555int 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
1687static 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
1693int 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
1726    if (s->session->session_id_length > 0) {
1727        int i = s->session_ctx->session_cache_mode;
1728        SSL_SESSION *new_sess;
1729        /*
1730         * We reused an existing session, so we need to replace it with a new
1731         * one
1732         */
1733        if (i & SSL_SESS_CACHE_CLIENT) {
1734            /*
1735             * Remove the old session from the cache
1736             */
1737            if (i & SSL_SESS_CACHE_NO_INTERNAL_STORE) {
1738                if (s->session_ctx->remove_session_cb != NULL)
1739                    s->session_ctx->remove_session_cb(s->session_ctx,
1740                                                      s->session);
1741            } else {
1742                /* We carry on if this fails */
1743                SSL_CTX_remove_session(s->session_ctx, s->session);
1744            }
1745        }
1746
1747        if ((new_sess = ssl_session_dup(s->session, 0)) == 0) {
1748            al = SSL_AD_INTERNAL_ERROR;
1749            SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, ERR_R_MALLOC_FAILURE);
1750            goto f_err;
1751        }
1752
1753        SSL_SESSION_free(s->session);
1754        s->session = new_sess;
1755    }
1756
1757    n2l(p, s->session->tlsext_tick_lifetime_hint);
1758    n2s(p, ticklen);
1759    /* ticket_lifetime_hint + ticket_length + ticket */
1760    if (ticklen + 6 != n) {
1761        al = SSL_AD_DECODE_ERROR;
1762        SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_LENGTH_MISMATCH);
1763        goto f_err;
1764    }
1765    if (s->session->tlsext_tick) {
1766        OPENSSL_free(s->session->tlsext_tick);
1767        s->session->tlsext_ticklen = 0;
1768    }
1769    s->session->tlsext_tick = OPENSSL_malloc(ticklen);
1770    if (!s->session->tlsext_tick) {
1771        SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, ERR_R_MALLOC_FAILURE);
1772        goto err;
1773    }
1774    memcpy(s->session->tlsext_tick, p, ticklen);
1775    s->session->tlsext_ticklen = ticklen;
1776    /*
1777     * There are two ways to detect a resumed ticket sesion. One is to set an
1778     * appropriate session ID and then the server must return a match in
1779     * ServerHello. This allows the normal client session ID matching to work
1780     * and we know much earlier that the ticket has been accepted. The
1781     * other way is to set zero length session ID when the ticket is
1782     * presented and rely on the handshake to determine session resumption.
1783     * We choose the former approach because this fits in with assumptions
1784     * elsewhere in OpenSSL. The session ID is set to the SHA256 (or SHA1 is
1785     * SHA256 is disabled) hash of the ticket.
1786     */
1787    EVP_Digest(p, ticklen,
1788               s->session->session_id, &s->session->session_id_length,
1789# ifndef OPENSSL_NO_SHA256
1790               EVP_sha256(), NULL);
1791# else
1792               EVP_sha1(), NULL);
1793# endif
1794    ret = 1;
1795    return (ret);
1796 f_err:
1797    ssl3_send_alert(s, SSL3_AL_FATAL, al);
1798 err:
1799    return (-1);
1800}
1801
1802int ssl3_get_cert_status(SSL *s)
1803{
1804    int ok, al;
1805    unsigned long resplen;
1806    long n;
1807    const unsigned char *p;
1808
1809    n = s->method->ssl_get_message(s,
1810                                   SSL3_ST_CR_CERT_STATUS_A,
1811                                   SSL3_ST_CR_CERT_STATUS_B,
1812                                   SSL3_MT_CERTIFICATE_STATUS, 16384, &ok);
1813
1814    if (!ok)
1815        return ((int)n);
1816    if (n < 4) {
1817        /* need at least status type + length */
1818        al = SSL_AD_DECODE_ERROR;
1819        SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_LENGTH_MISMATCH);
1820        goto f_err;
1821    }
1822    p = (unsigned char *)s->init_msg;
1823    if (*p++ != TLSEXT_STATUSTYPE_ocsp) {
1824        al = SSL_AD_DECODE_ERROR;
1825        SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_UNSUPPORTED_STATUS_TYPE);
1826        goto f_err;
1827    }
1828    n2l3(p, resplen);
1829    if (resplen + 4 != (unsigned long)n) {
1830        al = SSL_AD_DECODE_ERROR;
1831        SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_LENGTH_MISMATCH);
1832        goto f_err;
1833    }
1834    if (s->tlsext_ocsp_resp)
1835        OPENSSL_free(s->tlsext_ocsp_resp);
1836    s->tlsext_ocsp_resp = BUF_memdup(p, resplen);
1837    if (!s->tlsext_ocsp_resp) {
1838        al = SSL_AD_INTERNAL_ERROR;
1839        SSLerr(SSL_F_SSL3_GET_CERT_STATUS, ERR_R_MALLOC_FAILURE);
1840        goto f_err;
1841    }
1842    s->tlsext_ocsp_resplen = resplen;
1843    if (s->ctx->tlsext_status_cb) {
1844        int ret;
1845        ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
1846        if (ret == 0) {
1847            al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
1848            SSLerr(SSL_F_SSL3_GET_CERT_STATUS, SSL_R_INVALID_STATUS_RESPONSE);
1849            goto f_err;
1850        }
1851        if (ret < 0) {
1852            al = SSL_AD_INTERNAL_ERROR;
1853            SSLerr(SSL_F_SSL3_GET_CERT_STATUS, ERR_R_MALLOC_FAILURE);
1854            goto f_err;
1855        }
1856    }
1857    return 1;
1858 f_err:
1859    ssl3_send_alert(s, SSL3_AL_FATAL, al);
1860    return (-1);
1861}
1862#endif
1863
1864int ssl3_get_server_done(SSL *s)
1865{
1866    int ok, ret = 0;
1867    long n;
1868
1869    /* Second to last param should be very small, like 0 :-) */
1870    n = s->method->ssl_get_message(s,
1871                                   SSL3_ST_CR_SRVR_DONE_A,
1872                                   SSL3_ST_CR_SRVR_DONE_B,
1873                                   SSL3_MT_SERVER_DONE, 30, &ok);
1874
1875    if (!ok)
1876        return ((int)n);
1877    if (n > 0) {
1878        /* should contain no data */
1879        ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1880        SSLerr(SSL_F_SSL3_GET_SERVER_DONE, SSL_R_LENGTH_MISMATCH);
1881        return -1;
1882    }
1883    ret = 1;
1884    return (ret);
1885}
1886
1887int ssl3_send_client_key_exchange(SSL *s)
1888{
1889    unsigned char *p, *d;
1890    int n;
1891    unsigned long l;
1892#ifndef OPENSSL_NO_RSA
1893    unsigned char *q;
1894    EVP_PKEY *pkey = NULL;
1895#endif
1896#ifndef OPENSSL_NO_KRB5
1897    KSSL_ERR kssl_err;
1898#endif                          /* OPENSSL_NO_KRB5 */
1899#ifndef OPENSSL_NO_ECDH
1900    EC_KEY *clnt_ecdh = NULL;
1901    const EC_POINT *srvr_ecpoint = NULL;
1902    EVP_PKEY *srvr_pub_pkey = NULL;
1903    unsigned char *encodedPoint = NULL;
1904    int encoded_pt_len = 0;
1905    BN_CTX *bn_ctx = NULL;
1906#endif
1907
1908    if (s->state == SSL3_ST_CW_KEY_EXCH_A) {
1909        d = (unsigned char *)s->init_buf->data;
1910        p = &(d[4]);
1911
1912        l = s->s3->tmp.new_cipher->algorithms;
1913
1914        /* Fool emacs indentation */
1915        if (0) {
1916        }
1917#ifndef OPENSSL_NO_RSA
1918        else if (l & SSL_kRSA) {
1919            RSA *rsa;
1920            unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1921
1922            if (s->session->sess_cert == NULL) {
1923                /*
1924                 * We should always have a server certificate with SSL_kRSA.
1925                 */
1926                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1927                       ERR_R_INTERNAL_ERROR);
1928                goto err;
1929            }
1930
1931            if (s->session->sess_cert->peer_rsa_tmp != NULL)
1932                rsa = s->session->sess_cert->peer_rsa_tmp;
1933            else {
1934                pkey =
1935                    X509_get_pubkey(s->session->
1936                                    sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].
1937                                    x509);
1938                if ((pkey == NULL) || (pkey->type != EVP_PKEY_RSA)
1939                    || (pkey->pkey.rsa == NULL)) {
1940                    SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1941                           ERR_R_INTERNAL_ERROR);
1942                    goto err;
1943                }
1944                rsa = pkey->pkey.rsa;
1945                EVP_PKEY_free(pkey);
1946            }
1947
1948            tmp_buf[0] = s->client_version >> 8;
1949            tmp_buf[1] = s->client_version & 0xff;
1950            if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= 0)
1951                goto err;
1952
1953            s->session->master_key_length = sizeof tmp_buf;
1954
1955            q = p;
1956            /* Fix buf for TLS and beyond */
1957            if (s->version > SSL3_VERSION)
1958                p += 2;
1959            n = RSA_public_encrypt(sizeof tmp_buf,
1960                                   tmp_buf, p, rsa, RSA_PKCS1_PADDING);
1961# ifdef PKCS1_CHECK
1962            if (s->options & SSL_OP_PKCS1_CHECK_1)
1963                p[1]++;
1964            if (s->options & SSL_OP_PKCS1_CHECK_2)
1965                tmp_buf[0] = 0x70;
1966# endif
1967            if (n <= 0) {
1968                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1969                       SSL_R_BAD_RSA_ENCRYPT);
1970                goto err;
1971            }
1972
1973            /* Fix buf for TLS and beyond */
1974            if (s->version > SSL3_VERSION) {
1975                s2n(n, q);
1976                n += 2;
1977            }
1978
1979            s->session->master_key_length =
1980                s->method->ssl3_enc->generate_master_secret(s,
1981                                                            s->
1982                                                            session->master_key,
1983                                                            tmp_buf,
1984                                                            sizeof tmp_buf);
1985            OPENSSL_cleanse(tmp_buf, sizeof tmp_buf);
1986        }
1987#endif
1988#ifndef OPENSSL_NO_KRB5
1989        else if (l & SSL_kKRB5) {
1990            krb5_error_code krb5rc;
1991            KSSL_CTX *kssl_ctx = s->kssl_ctx;
1992            /*  krb5_data   krb5_ap_req;  */
1993            krb5_data *enc_ticket;
1994            krb5_data authenticator, *authp = NULL;
1995            EVP_CIPHER_CTX ciph_ctx;
1996            EVP_CIPHER *enc = NULL;
1997            unsigned char iv[EVP_MAX_IV_LENGTH];
1998            unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1999            unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH + EVP_MAX_IV_LENGTH];
2000            int padl, outl = sizeof(epms);
2001
2002            EVP_CIPHER_CTX_init(&ciph_ctx);
2003
2004# ifdef KSSL_DEBUG
2005            printf("ssl3_send_client_key_exchange(%lx & %lx)\n",
2006                   l, SSL_kKRB5);
2007# endif                         /* KSSL_DEBUG */
2008
2009            authp = NULL;
2010# ifdef KRB5SENDAUTH
2011            if (KRB5SENDAUTH)
2012                authp = &authenticator;
2013# endif                         /* KRB5SENDAUTH */
2014
2015            krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp, &kssl_err);
2016            enc = kssl_map_enc(kssl_ctx->enctype);
2017            if (enc == NULL)
2018                goto err;
2019# ifdef KSSL_DEBUG
2020            {
2021                printf("kssl_cget_tkt rtn %d\n", krb5rc);
2022                if (krb5rc && kssl_err.text)
2023                    printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text);
2024            }
2025# endif                         /* KSSL_DEBUG */
2026
2027            if (krb5rc) {
2028                ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
2029                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, kssl_err.reason);
2030                goto err;
2031            }
2032
2033            /*-
2034             * 20010406 VRS - Earlier versions used KRB5 AP_REQ
2035             * in place of RFC 2712 KerberosWrapper, as in:
2036             *
2037             * Send ticket (copy to *p, set n = length)
2038             * n = krb5_ap_req.length;
2039             * memcpy(p, krb5_ap_req.data, krb5_ap_req.length);
2040             * if (krb5_ap_req.data)
2041             *   kssl_krb5_free_data_contents(NULL,&krb5_ap_req);
2042             *
2043             * Now using real RFC 2712 KerberosWrapper
2044             * (Thanks to Simon Wilkinson <sxw@sxw.org.uk>)
2045             * Note: 2712 "opaque" types are here replaced
2046             * with a 2-byte length followed by the value.
2047             * Example:
2048             * KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms
2049             * Where "xx xx" = length bytes.  Shown here with
2050             * optional authenticator omitted.
2051             */
2052
2053            /*  KerberosWrapper.Ticket              */
2054            s2n(enc_ticket->length, p);
2055            memcpy(p, enc_ticket->data, enc_ticket->length);
2056            p += enc_ticket->length;
2057            n = enc_ticket->length + 2;
2058
2059            /*  KerberosWrapper.Authenticator       */
2060            if (authp && authp->length) {
2061                s2n(authp->length, p);
2062                memcpy(p, authp->data, authp->length);
2063                p += authp->length;
2064                n += authp->length + 2;
2065
2066                free(authp->data);
2067                authp->data = NULL;
2068                authp->length = 0;
2069            } else {
2070                s2n(0, p);      /* null authenticator length */
2071                n += 2;
2072            }
2073
2074            tmp_buf[0] = s->client_version >> 8;
2075            tmp_buf[1] = s->client_version & 0xff;
2076            if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= 0)
2077                goto err;
2078
2079            /*-
2080             * 20010420 VRS.  Tried it this way; failed.
2081             *      EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL);
2082             *      EVP_CIPHER_CTX_set_key_length(&ciph_ctx,
2083             *                              kssl_ctx->length);
2084             *      EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv);
2085             */
2086
2087            memset(iv, 0, sizeof iv); /* per RFC 1510 */
2088            EVP_EncryptInit_ex(&ciph_ctx, enc, NULL, kssl_ctx->key, iv);
2089            EVP_EncryptUpdate(&ciph_ctx, epms, &outl, tmp_buf,
2090                              sizeof tmp_buf);
2091            EVP_EncryptFinal_ex(&ciph_ctx, &(epms[outl]), &padl);
2092            outl += padl;
2093            if (outl > sizeof epms) {
2094                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2095                       ERR_R_INTERNAL_ERROR);
2096                goto err;
2097            }
2098            EVP_CIPHER_CTX_cleanup(&ciph_ctx);
2099
2100            /*  KerberosWrapper.EncryptedPreMasterSecret    */
2101            s2n(outl, p);
2102            memcpy(p, epms, outl);
2103            p += outl;
2104            n += outl + 2;
2105
2106            s->session->master_key_length =
2107                s->method->ssl3_enc->generate_master_secret(s,
2108                                                            s->
2109                                                            session->master_key,
2110                                                            tmp_buf,
2111                                                            sizeof tmp_buf);
2112
2113            OPENSSL_cleanse(tmp_buf, sizeof tmp_buf);
2114            OPENSSL_cleanse(epms, outl);
2115        }
2116#endif
2117#ifndef OPENSSL_NO_DH
2118        else if (l & (SSL_kEDH | SSL_kDHr | SSL_kDHd)) {
2119            DH *dh_srvr, *dh_clnt;
2120
2121            if (s->session->sess_cert == NULL) {
2122                ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
2123                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2124                       SSL_R_UNEXPECTED_MESSAGE);
2125                goto err;
2126            }
2127
2128            if (s->session->sess_cert->peer_dh_tmp != NULL)
2129                dh_srvr = s->session->sess_cert->peer_dh_tmp;
2130            else {
2131                /* we get them from the cert */
2132                ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
2133                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2134                       SSL_R_UNABLE_TO_FIND_DH_PARAMETERS);
2135                goto err;
2136            }
2137
2138            /* generate a new random key */
2139            if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) {
2140                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB);
2141                goto err;
2142            }
2143            if (!DH_generate_key(dh_clnt)) {
2144                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB);
2145                goto err;
2146            }
2147
2148            /*
2149             * use the 'p' output buffer for the DH key, but make sure to
2150             * clear it out afterwards
2151             */
2152
2153            n = DH_compute_key(p, dh_srvr->pub_key, dh_clnt);
2154
2155            if (n <= 0) {
2156                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB);
2157                goto err;
2158            }
2159
2160            /* generate master key from the result */
2161            s->session->master_key_length =
2162                s->method->ssl3_enc->generate_master_secret(s,
2163                                                            s->
2164                                                            session->master_key,
2165                                                            p, n);
2166            /* clean up */
2167            memset(p, 0, n);
2168
2169            /* send off the data */
2170            n = BN_num_bytes(dh_clnt->pub_key);
2171            s2n(n, p);
2172            BN_bn2bin(dh_clnt->pub_key, p);
2173            n += 2;
2174
2175            DH_free(dh_clnt);
2176
2177            /* perhaps clean things up a bit EAY EAY EAY EAY */
2178        }
2179#endif
2180
2181#ifndef OPENSSL_NO_ECDH
2182        else if ((l & SSL_kECDH) || (l & SSL_kECDHE)) {
2183            const EC_GROUP *srvr_group = NULL;
2184            EC_KEY *tkey;
2185            int ecdh_clnt_cert = 0;
2186            int field_size = 0;
2187
2188            if (s->session->sess_cert == NULL) {
2189                ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
2190                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2191                       SSL_R_UNEXPECTED_MESSAGE);
2192                goto err;
2193            }
2194
2195            /*
2196             * Did we send out the client's ECDH share for use in premaster
2197             * computation as part of client certificate? If so, set
2198             * ecdh_clnt_cert to 1.
2199             */
2200            if ((l & SSL_kECDH) && (s->cert != NULL)) {
2201                /*-
2202                 * XXX: For now, we do not support client
2203                 * authentication using ECDH certificates.
2204                 * To add such support, one needs to add
2205                 * code that checks for appropriate
2206                 * conditions and sets ecdh_clnt_cert to 1.
2207                 * For example, the cert have an ECC
2208                 * key on the same curve as the server's
2209                 * and the key should be authorized for
2210                 * key agreement.
2211                 *
2212                 * One also needs to add code in ssl3_connect
2213                 * to skip sending the certificate verify
2214                 * message.
2215                 *
2216                 * if ((s->cert->key->privatekey != NULL) &&
2217                 *     (s->cert->key->privatekey->type ==
2218                 *      EVP_PKEY_EC) && ...)
2219                 * ecdh_clnt_cert = 1;
2220                 */
2221            }
2222
2223            if (s->session->sess_cert->peer_ecdh_tmp != NULL) {
2224                tkey = s->session->sess_cert->peer_ecdh_tmp;
2225            } else {
2226                /* Get the Server Public Key from Cert */
2227                srvr_pub_pkey =
2228                    X509_get_pubkey(s->session->
2229                                    sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
2230                if ((srvr_pub_pkey == NULL)
2231                    || (srvr_pub_pkey->type != EVP_PKEY_EC)
2232                    || (srvr_pub_pkey->pkey.ec == NULL)) {
2233                    SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2234                           ERR_R_INTERNAL_ERROR);
2235                    goto err;
2236                }
2237
2238                tkey = srvr_pub_pkey->pkey.ec;
2239            }
2240
2241            srvr_group = EC_KEY_get0_group(tkey);
2242            srvr_ecpoint = EC_KEY_get0_public_key(tkey);
2243
2244            if ((srvr_group == NULL) || (srvr_ecpoint == NULL)) {
2245                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2246                       ERR_R_INTERNAL_ERROR);
2247                goto err;
2248            }
2249
2250            if ((clnt_ecdh = EC_KEY_new()) == NULL) {
2251                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2252                       ERR_R_MALLOC_FAILURE);
2253                goto err;
2254            }
2255
2256            if (!EC_KEY_set_group(clnt_ecdh, srvr_group)) {
2257                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_EC_LIB);
2258                goto err;
2259            }
2260            if (ecdh_clnt_cert) {
2261                /*
2262                 * Reuse key info from our certificate We only need our
2263                 * private key to perform the ECDH computation.
2264                 */
2265                const BIGNUM *priv_key;
2266                tkey = s->cert->key->privatekey->pkey.ec;
2267                priv_key = EC_KEY_get0_private_key(tkey);
2268                if (priv_key == NULL) {
2269                    SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2270                           ERR_R_MALLOC_FAILURE);
2271                    goto err;
2272                }
2273                if (!EC_KEY_set_private_key(clnt_ecdh, priv_key)) {
2274                    SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_EC_LIB);
2275                    goto err;
2276                }
2277            } else {
2278                /* Generate a new ECDH key pair */
2279                if (!(EC_KEY_generate_key(clnt_ecdh))) {
2280                    SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2281                           ERR_R_ECDH_LIB);
2282                    goto err;
2283                }
2284            }
2285
2286            /*
2287             * use the 'p' output buffer for the ECDH key, but make sure to
2288             * clear it out afterwards
2289             */
2290
2291            field_size = EC_GROUP_get_degree(srvr_group);
2292            if (field_size <= 0) {
2293                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB);
2294                goto err;
2295            }
2296            n = ECDH_compute_key(p, (field_size + 7) / 8, srvr_ecpoint,
2297                                 clnt_ecdh, NULL);
2298            if (n <= 0) {
2299                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB);
2300                goto err;
2301            }
2302
2303            /* generate master key from the result */
2304            s->session->master_key_length =
2305                s->method->ssl3_enc->generate_master_secret(s,
2306                                                            s->
2307                                                            session->master_key,
2308                                                            p, n);
2309
2310            memset(p, 0, n);    /* clean up */
2311
2312            if (ecdh_clnt_cert) {
2313                /* Send empty client key exch message */
2314                n = 0;
2315            } else {
2316                /*
2317                 * First check the size of encoding and allocate memory
2318                 * accordingly.
2319                 */
2320                encoded_pt_len =
2321                    EC_POINT_point2oct(srvr_group,
2322                                       EC_KEY_get0_public_key(clnt_ecdh),
2323                                       POINT_CONVERSION_UNCOMPRESSED,
2324                                       NULL, 0, NULL);
2325
2326                encodedPoint = (unsigned char *)
2327                    OPENSSL_malloc(encoded_pt_len * sizeof(unsigned char));
2328                bn_ctx = BN_CTX_new();
2329                if ((encodedPoint == NULL) || (bn_ctx == NULL)) {
2330                    SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2331                           ERR_R_MALLOC_FAILURE);
2332                    goto err;
2333                }
2334
2335                /* Encode the public key */
2336                n = EC_POINT_point2oct(srvr_group,
2337                                       EC_KEY_get0_public_key(clnt_ecdh),
2338                                       POINT_CONVERSION_UNCOMPRESSED,
2339                                       encodedPoint, encoded_pt_len, bn_ctx);
2340
2341                *p = n;         /* length of encoded point */
2342                /* Encoded point will be copied here */
2343                p += 1;
2344                /* copy the point */
2345                memcpy((unsigned char *)p, encodedPoint, n);
2346                /* increment n to account for length field */
2347                n += 1;
2348            }
2349
2350            /* Free allocated memory */
2351            BN_CTX_free(bn_ctx);
2352            if (encodedPoint != NULL)
2353                OPENSSL_free(encodedPoint);
2354            if (clnt_ecdh != NULL)
2355                EC_KEY_free(clnt_ecdh);
2356            EVP_PKEY_free(srvr_pub_pkey);
2357        }
2358#endif                          /* !OPENSSL_NO_ECDH */
2359        else {
2360            ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
2361            SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
2362            goto err;
2363        }
2364
2365        *(d++) = SSL3_MT_CLIENT_KEY_EXCHANGE;
2366        l2n3(n, d);
2367
2368        s->state = SSL3_ST_CW_KEY_EXCH_B;
2369        /* number of bytes to write */
2370        s->init_num = n + 4;
2371        s->init_off = 0;
2372    }
2373
2374    /* SSL3_ST_CW_KEY_EXCH_B */
2375    return (ssl3_do_write(s, SSL3_RT_HANDSHAKE));
2376 err:
2377#ifndef OPENSSL_NO_ECDH
2378    BN_CTX_free(bn_ctx);
2379    if (encodedPoint != NULL)
2380        OPENSSL_free(encodedPoint);
2381    if (clnt_ecdh != NULL)
2382        EC_KEY_free(clnt_ecdh);
2383    EVP_PKEY_free(srvr_pub_pkey);
2384#endif
2385    return (-1);
2386}
2387
2388int ssl3_send_client_verify(SSL *s)
2389{
2390    unsigned char *p, *d;
2391    unsigned char data[MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH];
2392    EVP_PKEY *pkey;
2393#ifndef OPENSSL_NO_RSA
2394    unsigned u = 0;
2395#endif
2396    unsigned long n;
2397#if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
2398    int j;
2399#endif
2400
2401    if (s->state == SSL3_ST_CW_CERT_VRFY_A) {
2402        d = (unsigned char *)s->init_buf->data;
2403        p = &(d[4]);
2404        pkey = s->cert->key->privatekey;
2405
2406        s->method->ssl3_enc->cert_verify_mac(s, &(s->s3->finish_dgst2),
2407                                             &(data[MD5_DIGEST_LENGTH]));
2408
2409#ifndef OPENSSL_NO_RSA
2410        if (pkey->type == EVP_PKEY_RSA) {
2411            s->method->ssl3_enc->cert_verify_mac(s,
2412                                                 &(s->s3->finish_dgst1),
2413                                                 &(data[0]));
2414            if (RSA_sign
2415                (NID_md5_sha1, data, MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH,
2416                 &(p[2]), &u, pkey->pkey.rsa) <= 0) {
2417                SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_RSA_LIB);
2418                goto err;
2419            }
2420            s2n(u, p);
2421            n = u + 2;
2422        } else
2423#endif
2424#ifndef OPENSSL_NO_DSA
2425        if (pkey->type == EVP_PKEY_DSA) {
2426            if (!DSA_sign(pkey->save_type,
2427                          &(data[MD5_DIGEST_LENGTH]),
2428                          SHA_DIGEST_LENGTH, &(p[2]),
2429                          (unsigned int *)&j, pkey->pkey.dsa)) {
2430                SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_DSA_LIB);
2431                goto err;
2432            }
2433            s2n(j, p);
2434            n = j + 2;
2435        } else
2436#endif
2437#ifndef OPENSSL_NO_ECDSA
2438        if (pkey->type == EVP_PKEY_EC) {
2439            if (!ECDSA_sign(pkey->save_type,
2440                            &(data[MD5_DIGEST_LENGTH]),
2441                            SHA_DIGEST_LENGTH, &(p[2]),
2442                            (unsigned int *)&j, pkey->pkey.ec)) {
2443                SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_ECDSA_LIB);
2444                goto err;
2445            }
2446            s2n(j, p);
2447            n = j + 2;
2448        } else
2449#endif
2450        {
2451            SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_INTERNAL_ERROR);
2452            goto err;
2453        }
2454        *(d++) = SSL3_MT_CERTIFICATE_VERIFY;
2455        l2n3(n, d);
2456
2457        s->state = SSL3_ST_CW_CERT_VRFY_B;
2458        s->init_num = (int)n + 4;
2459        s->init_off = 0;
2460    }
2461    return (ssl3_do_write(s, SSL3_RT_HANDSHAKE));
2462 err:
2463    return (-1);
2464}
2465
2466int ssl3_send_client_certificate(SSL *s)
2467{
2468    X509 *x509 = NULL;
2469    EVP_PKEY *pkey = NULL;
2470    int i;
2471    unsigned long l;
2472
2473    if (s->state == SSL3_ST_CW_CERT_A) {
2474        if ((s->cert == NULL) ||
2475            (s->cert->key->x509 == NULL) ||
2476            (s->cert->key->privatekey == NULL))
2477            s->state = SSL3_ST_CW_CERT_B;
2478        else
2479            s->state = SSL3_ST_CW_CERT_C;
2480    }
2481
2482    /* We need to get a client cert */
2483    if (s->state == SSL3_ST_CW_CERT_B) {
2484        /*
2485         * If we get an error, we need to ssl->rwstate=SSL_X509_LOOKUP;
2486         * return(-1); We then get retied later
2487         */
2488        i = 0;
2489        i = ssl_do_client_cert_cb(s, &x509, &pkey);
2490        if (i < 0) {
2491            s->rwstate = SSL_X509_LOOKUP;
2492            return (-1);
2493        }
2494        s->rwstate = SSL_NOTHING;
2495        if ((i == 1) && (pkey != NULL) && (x509 != NULL)) {
2496            s->state = SSL3_ST_CW_CERT_B;
2497            if (!SSL_use_certificate(s, x509) || !SSL_use_PrivateKey(s, pkey))
2498                i = 0;
2499        } else if (i == 1) {
2500            i = 0;
2501            SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE,
2502                   SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
2503        }
2504
2505        if (x509 != NULL)
2506            X509_free(x509);
2507        if (pkey != NULL)
2508            EVP_PKEY_free(pkey);
2509        if (i == 0) {
2510            if (s->version == SSL3_VERSION) {
2511                s->s3->tmp.cert_req = 0;
2512                ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_NO_CERTIFICATE);
2513                return (1);
2514            } else {
2515                s->s3->tmp.cert_req = 2;
2516            }
2517        }
2518
2519        /* Ok, we have a cert */
2520        s->state = SSL3_ST_CW_CERT_C;
2521    }
2522
2523    if (s->state == SSL3_ST_CW_CERT_C) {
2524        s->state = SSL3_ST_CW_CERT_D;
2525        l = ssl3_output_cert_chain(s,
2526                                   (s->s3->tmp.cert_req ==
2527                                    2) ? NULL : s->cert->key->x509);
2528        s->init_num = (int)l;
2529        s->init_off = 0;
2530    }
2531    /* SSL3_ST_CW_CERT_D */
2532    return (ssl3_do_write(s, SSL3_RT_HANDSHAKE));
2533}
2534
2535#define has_bits(i,m)   (((i)&(m)) == (m))
2536
2537int ssl3_check_cert_and_algorithm(SSL *s)
2538{
2539    int i, idx;
2540    long algs;
2541    EVP_PKEY *pkey = NULL;
2542    SESS_CERT *sc;
2543#ifndef OPENSSL_NO_RSA
2544    RSA *rsa;
2545#endif
2546#ifndef OPENSSL_NO_DH
2547    DH *dh;
2548#endif
2549
2550    sc = s->session->sess_cert;
2551
2552    algs = s->s3->tmp.new_cipher->algorithms;
2553
2554    /* we don't have a certificate */
2555    if (algs & (SSL_aDH | SSL_aNULL | SSL_aKRB5))
2556        return (1);
2557
2558    if (sc == NULL) {
2559        SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, ERR_R_INTERNAL_ERROR);
2560        goto err;
2561    }
2562#ifndef OPENSSL_NO_RSA
2563    rsa = s->session->sess_cert->peer_rsa_tmp;
2564#endif
2565#ifndef OPENSSL_NO_DH
2566    dh = s->session->sess_cert->peer_dh_tmp;
2567#endif
2568
2569    /* This is the passed certificate */
2570
2571    idx = sc->peer_cert_type;
2572#ifndef OPENSSL_NO_ECDH
2573    if (idx == SSL_PKEY_ECC) {
2574        if (check_srvr_ecc_cert_and_alg(sc->peer_pkeys[idx].x509,
2575                                        s->s3->tmp.new_cipher) == 0) {
2576            /* check failed */
2577            SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_BAD_ECC_CERT);
2578            goto f_err;
2579        } else {
2580            return 1;
2581        }
2582    }
2583#endif
2584    pkey = X509_get_pubkey(sc->peer_pkeys[idx].x509);
2585    i = X509_certificate_type(sc->peer_pkeys[idx].x509, pkey);
2586    EVP_PKEY_free(pkey);
2587
2588    /* Check that we have a certificate if we require one */
2589    if ((algs & SSL_aRSA) && !has_bits(i, EVP_PK_RSA | EVP_PKT_SIGN)) {
2590        SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2591               SSL_R_MISSING_RSA_SIGNING_CERT);
2592        goto f_err;
2593    }
2594#ifndef OPENSSL_NO_DSA
2595    else if ((algs & SSL_aDSS) && !has_bits(i, EVP_PK_DSA | EVP_PKT_SIGN)) {
2596        SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2597               SSL_R_MISSING_DSA_SIGNING_CERT);
2598        goto f_err;
2599    }
2600#endif
2601#ifndef OPENSSL_NO_RSA
2602    if ((algs & SSL_kRSA) &&
2603        !(has_bits(i, EVP_PK_RSA | EVP_PKT_ENC) || (rsa != NULL))) {
2604        SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2605               SSL_R_MISSING_RSA_ENCRYPTING_CERT);
2606        goto f_err;
2607    }
2608#endif
2609#ifndef OPENSSL_NO_DH
2610    if ((algs & SSL_kEDH) &&
2611        !(has_bits(i, EVP_PK_DH | EVP_PKT_EXCH) || (dh != NULL))) {
2612        SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_MISSING_DH_KEY);
2613        goto f_err;
2614    } else if ((algs & SSL_kDHr) && !has_bits(i, EVP_PK_DH | EVP_PKS_RSA)) {
2615        SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2616               SSL_R_MISSING_DH_RSA_CERT);
2617        goto f_err;
2618    }
2619# ifndef OPENSSL_NO_DSA
2620    else if ((algs & SSL_kDHd) && !has_bits(i, EVP_PK_DH | EVP_PKS_DSA)) {
2621        SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2622               SSL_R_MISSING_DH_DSA_CERT);
2623        goto f_err;
2624    }
2625# endif
2626#endif
2627
2628    if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && !has_bits(i, EVP_PKT_EXP)) {
2629#ifndef OPENSSL_NO_RSA
2630        if (algs & SSL_kRSA) {
2631            if (rsa == NULL
2632                || RSA_size(rsa) * 8 >
2633                SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) {
2634                SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2635                       SSL_R_MISSING_EXPORT_TMP_RSA_KEY);
2636                goto f_err;
2637            }
2638        } else
2639#endif
2640#ifndef OPENSSL_NO_DH
2641        if (algs & (SSL_kEDH | SSL_kDHr | SSL_kDHd)) {
2642            if (dh == NULL
2643                || DH_size(dh) * 8 >
2644                SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)) {
2645                SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2646                       SSL_R_MISSING_EXPORT_TMP_DH_KEY);
2647                goto f_err;
2648            }
2649        } else
2650#endif
2651        {
2652            SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
2653                   SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
2654            goto f_err;
2655        }
2656    }
2657    return (1);
2658 f_err:
2659    ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
2660 err:
2661    return (0);
2662}
2663
2664#ifndef OPENSSL_NO_ECDH
2665/* This is the complement of nid2curve_id in s3_srvr.c. */
2666static int curve_id2nid(int curve_id)
2667{
2668    /*
2669     * ECC curves from draft-ietf-tls-ecc-01.txt (Mar 15, 2001) (no changes
2670     * in draft-ietf-tls-ecc-03.txt [June 2003])
2671     */
2672    static int nid_list[26] = {
2673        0,
2674        NID_sect163k1,          /* sect163k1 (1) */
2675        NID_sect163r1,          /* sect163r1 (2) */
2676        NID_sect163r2,          /* sect163r2 (3) */
2677        NID_sect193r1,          /* sect193r1 (4) */
2678        NID_sect193r2,          /* sect193r2 (5) */
2679        NID_sect233k1,          /* sect233k1 (6) */
2680        NID_sect233r1,          /* sect233r1 (7) */
2681        NID_sect239k1,          /* sect239k1 (8) */
2682        NID_sect283k1,          /* sect283k1 (9) */
2683        NID_sect283r1,          /* sect283r1 (10) */
2684        NID_sect409k1,          /* sect409k1 (11) */
2685        NID_sect409r1,          /* sect409r1 (12) */
2686        NID_sect571k1,          /* sect571k1 (13) */
2687        NID_sect571r1,          /* sect571r1 (14) */
2688        NID_secp160k1,          /* secp160k1 (15) */
2689        NID_secp160r1,          /* secp160r1 (16) */
2690        NID_secp160r2,          /* secp160r2 (17) */
2691        NID_secp192k1,          /* secp192k1 (18) */
2692        NID_X9_62_prime192v1,   /* secp192r1 (19) */
2693        NID_secp224k1,          /* secp224k1 (20) */
2694        NID_secp224r1,          /* secp224r1 (21) */
2695        NID_secp256k1,          /* secp256k1 (22) */
2696        NID_X9_62_prime256v1,   /* secp256r1 (23) */
2697        NID_secp384r1,          /* secp384r1 (24) */
2698        NID_secp521r1           /* secp521r1 (25) */
2699    };
2700
2701    if ((curve_id < 1) || (curve_id > 25))
2702        return 0;
2703
2704    return nid_list[curve_id];
2705}
2706#endif
2707
2708/*
2709 * Check to see if handshake is full or resumed. Usually this is just a case
2710 * of checking to see if a cache hit has occurred. In the case of session
2711 * tickets we have to check the next message to be sure.
2712 */
2713
2714#ifndef OPENSSL_NO_TLSEXT
2715int ssl3_check_finished(SSL *s)
2716{
2717    int ok;
2718    long n;
2719    /*
2720     * If we have no ticket or session ID is non-zero length (a match of a
2721     * non-zero session length would never reach here) it cannot be a resumed
2722     * session.
2723     */
2724    if (!s->session->tlsext_tick || s->session->session_id_length)
2725        return 1;
2726    /*
2727     * this function is called when we really expect a Certificate message,
2728     * so permit appropriate message length
2729     */
2730    n = s->method->ssl_get_message(s,
2731                                   SSL3_ST_CR_CERT_A,
2732                                   SSL3_ST_CR_CERT_B,
2733                                   -1, s->max_cert_list, &ok);
2734    if (!ok)
2735        return ((int)n);
2736    s->s3->tmp.reuse_message = 1;
2737    if ((s->s3->tmp.message_type == SSL3_MT_FINISHED)
2738        || (s->s3->tmp.message_type == SSL3_MT_NEWSESSION_TICKET))
2739        return 2;
2740
2741    return 1;
2742}
2743#endif
2744
2745int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey)
2746{
2747    int i = 0;
2748#ifndef OPENSSL_NO_ENGINE
2749    if (s->ctx->client_cert_engine) {
2750        i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s,
2751                                        SSL_get_client_CA_list(s),
2752                                        px509, ppkey, NULL, NULL, NULL);
2753        if (i != 0)
2754            return i;
2755    }
2756#endif
2757    if (s->ctx->client_cert_cb)
2758        i = s->ctx->client_cert_cb(s, px509, ppkey);
2759    return i;
2760}
2761