LCOV - code coverage report
Current view: top level - third_party/openssl/ssl - d1_clnt.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 0 249 0.0 %
Date: 2015-10-10 Functions: 0 6 0.0 %

          Line data    Source code
       1             : /* ssl/d1_clnt.c */
       2             : /*
       3             :  * DTLS implementation written by Nagendra Modadugu
       4             :  * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
       5             :  */
       6             : /* ====================================================================
       7             :  * Copyright (c) 1999-2007 The OpenSSL Project.  All rights reserved.
       8             :  *
       9             :  * Redistribution and use in source and binary forms, with or without
      10             :  * modification, are permitted provided that the following conditions
      11             :  * are met:
      12             :  *
      13             :  * 1. Redistributions of source code must retain the above copyright
      14             :  *    notice, this list of conditions and the following disclaimer.
      15             :  *
      16             :  * 2. Redistributions in binary form must reproduce the above copyright
      17             :  *    notice, this list of conditions and the following disclaimer in
      18             :  *    the documentation and/or other materials provided with the
      19             :  *    distribution.
      20             :  *
      21             :  * 3. All advertising materials mentioning features or use of this
      22             :  *    software must display the following acknowledgment:
      23             :  *    "This product includes software developed by the OpenSSL Project
      24             :  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
      25             :  *
      26             :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      27             :  *    endorse or promote products derived from this software without
      28             :  *    prior written permission. For written permission, please contact
      29             :  *    openssl-core@OpenSSL.org.
      30             :  *
      31             :  * 5. Products derived from this software may not be called "OpenSSL"
      32             :  *    nor may "OpenSSL" appear in their names without prior written
      33             :  *    permission of the OpenSSL Project.
      34             :  *
      35             :  * 6. Redistributions of any form whatsoever must retain the following
      36             :  *    acknowledgment:
      37             :  *    "This product includes software developed by the OpenSSL Project
      38             :  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
      39             :  *
      40             :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      41             :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      42             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      43             :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      44             :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      45             :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      46             :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      47             :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      49             :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      50             :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      51             :  * OF THE POSSIBILITY OF SUCH DAMAGE.
      52             :  * ====================================================================
      53             :  *
      54             :  * This product includes cryptographic software written by Eric Young
      55             :  * (eay@cryptsoft.com).  This product includes software written by Tim
      56             :  * Hudson (tjh@cryptsoft.com).
      57             :  *
      58             :  */
      59             : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
      60             :  * All rights reserved.
      61             :  *
      62             :  * This package is an SSL implementation written
      63             :  * by Eric Young (eay@cryptsoft.com).
      64             :  * The implementation was written so as to conform with Netscapes SSL.
      65             :  *
      66             :  * This library is free for commercial and non-commercial use as long as
      67             :  * the following conditions are aheared to.  The following conditions
      68             :  * apply to all code found in this distribution, be it the RC4, RSA,
      69             :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      70             :  * included with this distribution is covered by the same copyright terms
      71             :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      72             :  *
      73             :  * Copyright remains Eric Young's, and as such any Copyright notices in
      74             :  * the code are not to be removed.
      75             :  * If this package is used in a product, Eric Young should be given attribution
      76             :  * as the author of the parts of the library used.
      77             :  * This can be in the form of a textual message at program startup or
      78             :  * in documentation (online or textual) provided with the package.
      79             :  *
      80             :  * Redistribution and use in source and binary forms, with or without
      81             :  * modification, are permitted provided that the following conditions
      82             :  * are met:
      83             :  * 1. Redistributions of source code must retain the copyright
      84             :  *    notice, this list of conditions and the following disclaimer.
      85             :  * 2. Redistributions in binary form must reproduce the above copyright
      86             :  *    notice, this list of conditions and the following disclaimer in the
      87             :  *    documentation and/or other materials provided with the distribution.
      88             :  * 3. All advertising materials mentioning features or use of this software
      89             :  *    must display the following acknowledgement:
      90             :  *    "This product includes cryptographic software written by
      91             :  *     Eric Young (eay@cryptsoft.com)"
      92             :  *    The word 'cryptographic' can be left out if the rouines from the library
      93             :  *    being used are not cryptographic related :-).
      94             :  * 4. If you include any Windows specific code (or a derivative thereof) from
      95             :  *    the apps directory (application code) you must include an acknowledgement:
      96             :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      97             :  *
      98             :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      99             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     100             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     101             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     102             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     103             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     104             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     105             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     106             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     107             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     108             :  * SUCH DAMAGE.
     109             :  *
     110             :  * The licence and distribution terms for any publically available version or
     111             :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     112             :  * copied and put under another distribution licence
     113             :  * [including the GNU Public Licence.]
     114             :  */
     115             : 
     116             : #include <stdio.h>
     117             : #include "ssl_locl.h"
     118             : #ifndef OPENSSL_NO_KRB5
     119             : # include "kssl_lcl.h"
     120             : #endif
     121             : #include <openssl/buffer.h>
     122             : #include <openssl/rand.h>
     123             : #include <openssl/objects.h>
     124             : #include <openssl/evp.h>
     125             : #include <openssl/md5.h>
     126             : #include <openssl/bn.h>
     127             : #ifndef OPENSSL_NO_DH
     128             : # include <openssl/dh.h>
     129             : #endif
     130             : 
     131             : static const SSL_METHOD *dtls1_get_client_method(int ver);
     132             : static int dtls1_get_hello_verify(SSL *s);
     133             : 
     134           0 : static const SSL_METHOD *dtls1_get_client_method(int ver)
     135             : {
     136           0 :     if (ver == DTLS1_VERSION || ver == DTLS1_BAD_VER)
     137             :         return (DTLSv1_client_method());
     138           0 :     else if (ver == DTLS1_2_VERSION)
     139             :         return (DTLSv1_2_client_method());
     140             :     else
     141           0 :         return (NULL);
     142             : }
     143             : 
     144           0 : IMPLEMENT_dtls1_meth_func(DTLS1_VERSION,
     145             :                           DTLSv1_client_method,
     146             :                           ssl_undefined_function,
     147             :                           dtls1_connect,
     148             :                           dtls1_get_client_method, DTLSv1_enc_data)
     149             : 
     150           0 :     IMPLEMENT_dtls1_meth_func(DTLS1_2_VERSION,
     151             :                           DTLSv1_2_client_method,
     152             :                           ssl_undefined_function,
     153             :                           dtls1_connect,
     154             :                           dtls1_get_client_method, DTLSv1_2_enc_data)
     155             : 
     156           0 :     IMPLEMENT_dtls1_meth_func(DTLS_ANY_VERSION,
     157             :                           DTLS_client_method,
     158             :                           ssl_undefined_function,
     159             :                           dtls1_connect,
     160             :                           dtls1_get_client_method, DTLSv1_2_enc_data)
     161             : 
     162           0 : int dtls1_connect(SSL *s)
     163             : {
     164             :     BUF_MEM *buf = NULL;
     165           0 :     unsigned long Time = (unsigned long)time(NULL);
     166             :     void (*cb) (const SSL *ssl, int type, int val) = NULL;
     167             :     int ret = -1;
     168             :     int new_state, state, skip = 0;
     169             : #ifndef OPENSSL_NO_SCTP
     170             :     unsigned char sctpauthkey[64];
     171             :     char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)];
     172             : #endif
     173             : 
     174           0 :     RAND_add(&Time, sizeof(Time), 0);
     175           0 :     ERR_clear_error();
     176           0 :     clear_sys_error();
     177             : 
     178           0 :     if (s->info_callback != NULL)
     179             :         cb = s->info_callback;
     180           0 :     else if (s->ctx->info_callback != NULL)
     181             :         cb = s->ctx->info_callback;
     182             : 
     183           0 :     s->in_handshake++;
     184           0 :     if (!SSL_in_init(s) || SSL_in_before(s))
     185           0 :         SSL_clear(s);
     186             : 
     187             : #ifndef OPENSSL_NO_SCTP
     188             :     /*
     189             :      * Notify SCTP BIO socket to enter handshake mode and prevent stream
     190             :      * identifier other than 0. Will be ignored if no SCTP is used.
     191             :      */
     192             :     BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE,
     193             :              s->in_handshake, NULL);
     194             : #endif
     195             : 
     196             : #ifndef OPENSSL_NO_HEARTBEATS
     197             :     /*
     198             :      * If we're awaiting a HeartbeatResponse, pretend we already got and
     199             :      * don't await it anymore, because Heartbeats don't make sense during
     200             :      * handshakes anyway.
     201             :      */
     202           0 :     if (s->tlsext_hb_pending) {
     203           0 :         dtls1_stop_timer(s);
     204           0 :         s->tlsext_hb_pending = 0;
     205           0 :         s->tlsext_hb_seq++;
     206             :     }
     207             : #endif
     208             : 
     209             :     for (;;) {
     210           0 :         state = s->state;
     211             : 
     212           0 :         switch (s->state) {
     213             :         case SSL_ST_RENEGOTIATE:
     214           0 :             s->renegotiate = 1;
     215           0 :             s->state = SSL_ST_CONNECT;
     216           0 :             s->ctx->stats.sess_connect_renegotiate++;
     217             :             /* break */
     218             :         case SSL_ST_BEFORE:
     219             :         case SSL_ST_CONNECT:
     220             :         case SSL_ST_BEFORE | SSL_ST_CONNECT:
     221             :         case SSL_ST_OK | SSL_ST_CONNECT:
     222             : 
     223           0 :             s->server = 0;
     224           0 :             if (cb != NULL)
     225           0 :                 cb(s, SSL_CB_HANDSHAKE_START, 1);
     226             : 
     227           0 :             if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00) &&
     228             :                 (s->version & 0xff00) != (DTLS1_BAD_VER & 0xff00)) {
     229           0 :                 SSLerr(SSL_F_DTLS1_CONNECT, ERR_R_INTERNAL_ERROR);
     230             :                 ret = -1;
     231           0 :                 s->state = SSL_ST_ERR;
     232           0 :                 goto end;
     233             :             }
     234             : 
     235             :             /* s->version=SSL3_VERSION; */
     236           0 :             s->type = SSL_ST_CONNECT;
     237             : 
     238           0 :             if (s->init_buf == NULL) {
     239           0 :                 if ((buf = BUF_MEM_new()) == NULL) {
     240             :                     ret = -1;
     241           0 :                     s->state = SSL_ST_ERR;
     242           0 :                     goto end;
     243             :                 }
     244           0 :                 if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) {
     245             :                     ret = -1;
     246           0 :                     s->state = SSL_ST_ERR;
     247           0 :                     goto end;
     248             :                 }
     249           0 :                 s->init_buf = buf;
     250             :                 buf = NULL;
     251             :             }
     252             : 
     253           0 :             if (!ssl3_setup_buffers(s)) {
     254             :                 ret = -1;
     255           0 :                 s->state = SSL_ST_ERR;
     256           0 :                 goto end;
     257             :             }
     258             : 
     259             :             /* setup buffing BIO */
     260           0 :             if (!ssl_init_wbio_buffer(s, 0)) {
     261             :                 ret = -1;
     262           0 :                 s->state = SSL_ST_ERR;
     263           0 :                 goto end;
     264             :             }
     265             : 
     266             :             /* don't push the buffering BIO quite yet */
     267             : 
     268           0 :             s->state = SSL3_ST_CW_CLNT_HELLO_A;
     269           0 :             s->ctx->stats.sess_connect++;
     270           0 :             s->init_num = 0;
     271             :             /* mark client_random uninitialized */
     272           0 :             memset(s->s3->client_random, 0, sizeof(s->s3->client_random));
     273           0 :             s->d1->send_cookie = 0;
     274           0 :             s->hit = 0;
     275           0 :             s->d1->change_cipher_spec_ok = 0;
     276             :             /*
     277             :              * Should have been reset by ssl3_get_finished, too.
     278             :              */
     279           0 :             s->s3->change_cipher_spec = 0;
     280           0 :             break;
     281             : 
     282             : #ifndef OPENSSL_NO_SCTP
     283             :         case DTLS1_SCTP_ST_CR_READ_SOCK:
     284             : 
     285             :             if (BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) {
     286             :                 s->s3->in_read_app_data = 2;
     287             :                 s->rwstate = SSL_READING;
     288             :                 BIO_clear_retry_flags(SSL_get_rbio(s));
     289             :                 BIO_set_retry_read(SSL_get_rbio(s));
     290             :                 ret = -1;
     291             :                 goto end;
     292             :             }
     293             : 
     294             :             s->state = s->s3->tmp.next_state;
     295             :             break;
     296             : 
     297             :         case DTLS1_SCTP_ST_CW_WRITE_SOCK:
     298             :             /* read app data until dry event */
     299             : 
     300             :             ret = BIO_dgram_sctp_wait_for_dry(SSL_get_wbio(s));
     301             :             if (ret < 0)
     302             :                 goto end;
     303             : 
     304             :             if (ret == 0) {
     305             :                 s->s3->in_read_app_data = 2;
     306             :                 s->rwstate = SSL_READING;
     307             :                 BIO_clear_retry_flags(SSL_get_rbio(s));
     308             :                 BIO_set_retry_read(SSL_get_rbio(s));
     309             :                 ret = -1;
     310             :                 goto end;
     311             :             }
     312             : 
     313             :             s->state = s->d1->next_state;
     314             :             break;
     315             : #endif
     316             : 
     317             :         case SSL3_ST_CW_CLNT_HELLO_A:
     318             :         case SSL3_ST_CW_CLNT_HELLO_B:
     319             : 
     320           0 :             s->shutdown = 0;
     321             : 
     322             :             /* every DTLS ClientHello resets Finished MAC */
     323           0 :             ssl3_init_finished_mac(s);
     324             : 
     325           0 :             dtls1_start_timer(s);
     326           0 :             ret = ssl3_client_hello(s);
     327           0 :             if (ret <= 0)
     328             :                 goto end;
     329             : 
     330           0 :             if (s->d1->send_cookie) {
     331           0 :                 s->state = SSL3_ST_CW_FLUSH;
     332           0 :                 s->s3->tmp.next_state = SSL3_ST_CR_SRVR_HELLO_A;
     333             :             } else
     334           0 :                 s->state = SSL3_ST_CR_SRVR_HELLO_A;
     335             : 
     336           0 :             s->init_num = 0;
     337             : 
     338             : #ifndef OPENSSL_NO_SCTP
     339             :             /* Disable buffering for SCTP */
     340             :             if (!BIO_dgram_is_sctp(SSL_get_wbio(s))) {
     341             : #endif
     342             :                 /*
     343             :                  * turn on buffering for the next lot of output
     344             :                  */
     345           0 :                 if (s->bbio != s->wbio)
     346           0 :                     s->wbio = BIO_push(s->bbio, s->wbio);
     347             : #ifndef OPENSSL_NO_SCTP
     348             :             }
     349             : #endif
     350             : 
     351             :             break;
     352             : 
     353             :         case SSL3_ST_CR_SRVR_HELLO_A:
     354             :         case SSL3_ST_CR_SRVR_HELLO_B:
     355           0 :             ret = ssl3_get_server_hello(s);
     356           0 :             if (ret <= 0)
     357             :                 goto end;
     358             :             else {
     359           0 :                 if (s->hit) {
     360             : #ifndef OPENSSL_NO_SCTP
     361             :                     /*
     362             :                      * Add new shared key for SCTP-Auth, will be ignored if
     363             :                      * no SCTP used.
     364             :                      */
     365             :                     snprintf((char *)labelbuffer,
     366             :                              sizeof(DTLS1_SCTP_AUTH_LABEL),
     367             :                              DTLS1_SCTP_AUTH_LABEL);
     368             : 
     369             :                     SSL_export_keying_material(s, sctpauthkey,
     370             :                                                sizeof(sctpauthkey),
     371             :                                                labelbuffer,
     372             :                                                sizeof(labelbuffer), NULL, 0,
     373             :                                                0);
     374             : 
     375             :                     BIO_ctrl(SSL_get_wbio(s),
     376             :                              BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
     377             :                              sizeof(sctpauthkey), sctpauthkey);
     378             : #endif
     379             : 
     380           0 :                     s->state = SSL3_ST_CR_FINISHED_A;
     381             :                 } else
     382           0 :                     s->state = DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A;
     383             :             }
     384           0 :             s->init_num = 0;
     385           0 :             break;
     386             : 
     387             :         case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A:
     388             :         case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B:
     389             : 
     390           0 :             ret = dtls1_get_hello_verify(s);
     391           0 :             if (ret <= 0)
     392             :                 goto end;
     393           0 :             dtls1_stop_timer(s);
     394           0 :             if (s->d1->send_cookie) /* start again, with a cookie */
     395           0 :                 s->state = SSL3_ST_CW_CLNT_HELLO_A;
     396             :             else
     397           0 :                 s->state = SSL3_ST_CR_CERT_A;
     398           0 :             s->init_num = 0;
     399           0 :             break;
     400             : 
     401             :         case SSL3_ST_CR_CERT_A:
     402             :         case SSL3_ST_CR_CERT_B:
     403             :             /* Check if it is anon DH or PSK */
     404           0 :             if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
     405           0 :                 !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) {
     406           0 :                 ret = ssl3_get_server_certificate(s);
     407           0 :                 if (ret <= 0)
     408             :                     goto end;
     409             : #ifndef OPENSSL_NO_TLSEXT
     410           0 :                 if (s->tlsext_status_expected)
     411           0 :                     s->state = SSL3_ST_CR_CERT_STATUS_A;
     412             :                 else
     413           0 :                     s->state = SSL3_ST_CR_KEY_EXCH_A;
     414             :             } else {
     415             :                 skip = 1;
     416           0 :                 s->state = SSL3_ST_CR_KEY_EXCH_A;
     417             :             }
     418             : #else
     419             :             } else
     420             :                 skip = 1;
     421             : 
     422             :             s->state = SSL3_ST_CR_KEY_EXCH_A;
     423             : #endif
     424           0 :             s->init_num = 0;
     425           0 :             break;
     426             : 
     427             :         case SSL3_ST_CR_KEY_EXCH_A:
     428             :         case SSL3_ST_CR_KEY_EXCH_B:
     429           0 :             ret = ssl3_get_key_exchange(s);
     430           0 :             if (ret <= 0)
     431             :                 goto end;
     432           0 :             s->state = SSL3_ST_CR_CERT_REQ_A;
     433           0 :             s->init_num = 0;
     434             : 
     435             :             /*
     436             :              * at this point we check that we have the required stuff from
     437             :              * the server
     438             :              */
     439           0 :             if (!ssl3_check_cert_and_algorithm(s)) {
     440             :                 ret = -1;
     441           0 :                 s->state = SSL_ST_ERR;
     442           0 :                 goto end;
     443             :             }
     444             :             break;
     445             : 
     446             :         case SSL3_ST_CR_CERT_REQ_A:
     447             :         case SSL3_ST_CR_CERT_REQ_B:
     448           0 :             ret = ssl3_get_certificate_request(s);
     449           0 :             if (ret <= 0)
     450             :                 goto end;
     451           0 :             s->state = SSL3_ST_CR_SRVR_DONE_A;
     452           0 :             s->init_num = 0;
     453           0 :             break;
     454             : 
     455             :         case SSL3_ST_CR_SRVR_DONE_A:
     456             :         case SSL3_ST_CR_SRVR_DONE_B:
     457           0 :             ret = ssl3_get_server_done(s);
     458           0 :             if (ret <= 0)
     459             :                 goto end;
     460           0 :             dtls1_stop_timer(s);
     461           0 :             if (s->s3->tmp.cert_req)
     462           0 :                 s->s3->tmp.next_state = SSL3_ST_CW_CERT_A;
     463             :             else
     464           0 :                 s->s3->tmp.next_state = SSL3_ST_CW_KEY_EXCH_A;
     465           0 :             s->init_num = 0;
     466             : 
     467             : #ifndef OPENSSL_NO_SCTP
     468             :             if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
     469             :                 state == SSL_ST_RENEGOTIATE)
     470             :                 s->state = DTLS1_SCTP_ST_CR_READ_SOCK;
     471             :             else
     472             : #endif
     473           0 :                 s->state = s->s3->tmp.next_state;
     474           0 :             break;
     475             : 
     476             :         case SSL3_ST_CW_CERT_A:
     477             :         case SSL3_ST_CW_CERT_B:
     478             :         case SSL3_ST_CW_CERT_C:
     479             :         case SSL3_ST_CW_CERT_D:
     480           0 :             dtls1_start_timer(s);
     481           0 :             ret = ssl3_send_client_certificate(s);
     482           0 :             if (ret <= 0)
     483             :                 goto end;
     484           0 :             s->state = SSL3_ST_CW_KEY_EXCH_A;
     485           0 :             s->init_num = 0;
     486           0 :             break;
     487             : 
     488             :         case SSL3_ST_CW_KEY_EXCH_A:
     489             :         case SSL3_ST_CW_KEY_EXCH_B:
     490           0 :             dtls1_start_timer(s);
     491           0 :             ret = ssl3_send_client_key_exchange(s);
     492           0 :             if (ret <= 0)
     493             :                 goto end;
     494             : 
     495             : #ifndef OPENSSL_NO_SCTP
     496             :             /*
     497             :              * Add new shared key for SCTP-Auth, will be ignored if no SCTP
     498             :              * used.
     499             :              */
     500             :             snprintf((char *)labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
     501             :                      DTLS1_SCTP_AUTH_LABEL);
     502             : 
     503             :             SSL_export_keying_material(s, sctpauthkey,
     504             :                                        sizeof(sctpauthkey), labelbuffer,
     505             :                                        sizeof(labelbuffer), NULL, 0, 0);
     506             : 
     507             :             BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
     508             :                      sizeof(sctpauthkey), sctpauthkey);
     509             : #endif
     510             : 
     511             :             /*
     512             :              * EAY EAY EAY need to check for DH fix cert sent back
     513             :              */
     514             :             /*
     515             :              * For TLS, cert_req is set to 2, so a cert chain of nothing is
     516             :              * sent, but no verify packet is sent
     517             :              */
     518           0 :             if (s->s3->tmp.cert_req == 1) {
     519           0 :                 s->state = SSL3_ST_CW_CERT_VRFY_A;
     520             :             } else {
     521             : #ifndef OPENSSL_NO_SCTP
     522             :                 if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
     523             :                     s->d1->next_state = SSL3_ST_CW_CHANGE_A;
     524             :                     s->state = DTLS1_SCTP_ST_CW_WRITE_SOCK;
     525             :                 } else
     526             : #endif
     527           0 :                     s->state = SSL3_ST_CW_CHANGE_A;
     528             :             }
     529             : 
     530           0 :             s->init_num = 0;
     531           0 :             break;
     532             : 
     533             :         case SSL3_ST_CW_CERT_VRFY_A:
     534             :         case SSL3_ST_CW_CERT_VRFY_B:
     535           0 :             dtls1_start_timer(s);
     536           0 :             ret = ssl3_send_client_verify(s);
     537           0 :             if (ret <= 0)
     538             :                 goto end;
     539             : #ifndef OPENSSL_NO_SCTP
     540             :             if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
     541             :                 s->d1->next_state = SSL3_ST_CW_CHANGE_A;
     542             :                 s->state = DTLS1_SCTP_ST_CW_WRITE_SOCK;
     543             :             } else
     544             : #endif
     545           0 :                 s->state = SSL3_ST_CW_CHANGE_A;
     546           0 :             s->init_num = 0;
     547           0 :             break;
     548             : 
     549             :         case SSL3_ST_CW_CHANGE_A:
     550             :         case SSL3_ST_CW_CHANGE_B:
     551           0 :             if (!s->hit)
     552           0 :                 dtls1_start_timer(s);
     553           0 :             ret = dtls1_send_change_cipher_spec(s,
     554             :                                                 SSL3_ST_CW_CHANGE_A,
     555             :                                                 SSL3_ST_CW_CHANGE_B);
     556           0 :             if (ret <= 0)
     557             :                 goto end;
     558             : 
     559           0 :             s->state = SSL3_ST_CW_FINISHED_A;
     560           0 :             s->init_num = 0;
     561             : 
     562           0 :             s->session->cipher = s->s3->tmp.new_cipher;
     563             : #ifdef OPENSSL_NO_COMP
     564             :             s->session->compress_meth = 0;
     565             : #else
     566           0 :             if (s->s3->tmp.new_compression == NULL)
     567           0 :                 s->session->compress_meth = 0;
     568             :             else
     569           0 :                 s->session->compress_meth = s->s3->tmp.new_compression->id;
     570             : #endif
     571           0 :             if (!s->method->ssl3_enc->setup_key_block(s)) {
     572             :                 ret = -1;
     573           0 :                 s->state = SSL_ST_ERR;
     574           0 :                 goto end;
     575             :             }
     576             : 
     577           0 :             if (!s->method->ssl3_enc->change_cipher_state(s,
     578             :                                                           SSL3_CHANGE_CIPHER_CLIENT_WRITE))
     579             :             {
     580             :                 ret = -1;
     581           0 :                 s->state = SSL_ST_ERR;
     582           0 :                 goto end;
     583             :             }
     584             : #ifndef OPENSSL_NO_SCTP
     585             :             if (s->hit) {
     586             :                 /*
     587             :                  * Change to new shared key of SCTP-Auth, will be ignored if
     588             :                  * no SCTP used.
     589             :                  */
     590             :                 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY,
     591             :                          0, NULL);
     592             :             }
     593             : #endif
     594             : 
     595           0 :             dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
     596           0 :             break;
     597             : 
     598             :         case SSL3_ST_CW_FINISHED_A:
     599             :         case SSL3_ST_CW_FINISHED_B:
     600           0 :             if (!s->hit)
     601           0 :                 dtls1_start_timer(s);
     602           0 :             ret = ssl3_send_finished(s,
     603             :                                      SSL3_ST_CW_FINISHED_A,
     604             :                                      SSL3_ST_CW_FINISHED_B,
     605             :                                      s->method->
     606             :                                      ssl3_enc->client_finished_label,
     607           0 :                                      s->method->
     608             :                                      ssl3_enc->client_finished_label_len);
     609           0 :             if (ret <= 0)
     610             :                 goto end;
     611           0 :             s->state = SSL3_ST_CW_FLUSH;
     612             : 
     613             :             /* clear flags */
     614           0 :             s->s3->flags &= ~SSL3_FLAGS_POP_BUFFER;
     615           0 :             if (s->hit) {
     616           0 :                 s->s3->tmp.next_state = SSL_ST_OK;
     617             : #ifndef OPENSSL_NO_SCTP
     618             :                 if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
     619             :                     s->d1->next_state = s->s3->tmp.next_state;
     620             :                     s->s3->tmp.next_state = DTLS1_SCTP_ST_CW_WRITE_SOCK;
     621             :                 }
     622             : #endif
     623           0 :                 if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED) {
     624           0 :                     s->state = SSL_ST_OK;
     625             : #ifndef OPENSSL_NO_SCTP
     626             :                     if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
     627             :                         s->d1->next_state = SSL_ST_OK;
     628             :                         s->state = DTLS1_SCTP_ST_CW_WRITE_SOCK;
     629             :                     }
     630             : #endif
     631           0 :                     s->s3->flags |= SSL3_FLAGS_POP_BUFFER;
     632           0 :                     s->s3->delay_buf_pop_ret = 0;
     633             :                 }
     634             :             } else {
     635             : #ifndef OPENSSL_NO_SCTP
     636             :                 /*
     637             :                  * Change to new shared key of SCTP-Auth, will be ignored if
     638             :                  * no SCTP used.
     639             :                  */
     640             :                 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY,
     641             :                          0, NULL);
     642             : #endif
     643             : 
     644             : #ifndef OPENSSL_NO_TLSEXT
     645             :                 /*
     646             :                  * Allow NewSessionTicket if ticket expected
     647             :                  */
     648           0 :                 if (s->tlsext_ticket_expected)
     649           0 :                     s->s3->tmp.next_state = SSL3_ST_CR_SESSION_TICKET_A;
     650             :                 else
     651             : #endif
     652             : 
     653           0 :                     s->s3->tmp.next_state = SSL3_ST_CR_FINISHED_A;
     654             :             }
     655           0 :             s->init_num = 0;
     656           0 :             break;
     657             : 
     658             : #ifndef OPENSSL_NO_TLSEXT
     659             :         case SSL3_ST_CR_SESSION_TICKET_A:
     660             :         case SSL3_ST_CR_SESSION_TICKET_B:
     661           0 :             ret = ssl3_get_new_session_ticket(s);
     662           0 :             if (ret <= 0)
     663             :                 goto end;
     664           0 :             s->state = SSL3_ST_CR_FINISHED_A;
     665           0 :             s->init_num = 0;
     666           0 :             break;
     667             : 
     668             :         case SSL3_ST_CR_CERT_STATUS_A:
     669             :         case SSL3_ST_CR_CERT_STATUS_B:
     670           0 :             ret = ssl3_get_cert_status(s);
     671           0 :             if (ret <= 0)
     672             :                 goto end;
     673           0 :             s->state = SSL3_ST_CR_KEY_EXCH_A;
     674           0 :             s->init_num = 0;
     675           0 :             break;
     676             : #endif
     677             : 
     678             :         case SSL3_ST_CR_FINISHED_A:
     679             :         case SSL3_ST_CR_FINISHED_B:
     680           0 :             s->d1->change_cipher_spec_ok = 1;
     681           0 :             ret = ssl3_get_finished(s, SSL3_ST_CR_FINISHED_A,
     682             :                                     SSL3_ST_CR_FINISHED_B);
     683           0 :             if (ret <= 0)
     684             :                 goto end;
     685           0 :             dtls1_stop_timer(s);
     686             : 
     687           0 :             if (s->hit)
     688           0 :                 s->state = SSL3_ST_CW_CHANGE_A;
     689             :             else
     690           0 :                 s->state = SSL_ST_OK;
     691             : 
     692             : #ifndef OPENSSL_NO_SCTP
     693             :             if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
     694             :                 state == SSL_ST_RENEGOTIATE) {
     695             :                 s->d1->next_state = s->state;
     696             :                 s->state = DTLS1_SCTP_ST_CW_WRITE_SOCK;
     697             :             }
     698             : #endif
     699             : 
     700           0 :             s->init_num = 0;
     701           0 :             break;
     702             : 
     703             :         case SSL3_ST_CW_FLUSH:
     704           0 :             s->rwstate = SSL_WRITING;
     705           0 :             if (BIO_flush(s->wbio) <= 0) {
     706             :                 /*
     707             :                  * If the write error was fatal, stop trying
     708             :                  */
     709           0 :                 if (!BIO_should_retry(s->wbio)) {
     710           0 :                     s->rwstate = SSL_NOTHING;
     711           0 :                     s->state = s->s3->tmp.next_state;
     712             :                 }
     713             : 
     714             :                 ret = -1;
     715             :                 goto end;
     716             :             }
     717           0 :             s->rwstate = SSL_NOTHING;
     718           0 :             s->state = s->s3->tmp.next_state;
     719           0 :             break;
     720             : 
     721             :         case SSL_ST_OK:
     722             :             /* clean a few things up */
     723           0 :             ssl3_cleanup_key_block(s);
     724             : 
     725             : #if 0
     726             :             if (s->init_buf != NULL) {
     727             :                 BUF_MEM_free(s->init_buf);
     728             :                 s->init_buf = NULL;
     729             :             }
     730             : #endif
     731             : 
     732             :             /*
     733             :              * If we are not 'joining' the last two packets, remove the
     734             :              * buffering now
     735             :              */
     736           0 :             if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER))
     737           0 :                 ssl_free_wbio_buffer(s);
     738             :             /* else do it later in ssl3_write */
     739             : 
     740           0 :             s->init_num = 0;
     741           0 :             s->renegotiate = 0;
     742           0 :             s->new_session = 0;
     743             : 
     744           0 :             ssl_update_cache(s, SSL_SESS_CACHE_CLIENT);
     745           0 :             if (s->hit)
     746           0 :                 s->ctx->stats.sess_hit++;
     747             : 
     748             :             ret = 1;
     749             :             /* s->server=0; */
     750           0 :             s->handshake_func = dtls1_connect;
     751           0 :             s->ctx->stats.sess_connect_good++;
     752             : 
     753           0 :             if (cb != NULL)
     754           0 :                 cb(s, SSL_CB_HANDSHAKE_DONE, 1);
     755             : 
     756             :             /* done with handshaking */
     757           0 :             s->d1->handshake_read_seq = 0;
     758           0 :             s->d1->next_handshake_write_seq = 0;
     759           0 :             goto end;
     760             :             /* break; */
     761             : 
     762             :         case SSL_ST_ERR:
     763             :         default:
     764           0 :             SSLerr(SSL_F_DTLS1_CONNECT, SSL_R_UNKNOWN_STATE);
     765             :             ret = -1;
     766           0 :             goto end;
     767             :             /* break; */
     768             :         }
     769             : 
     770             :         /* did we do anything */
     771           0 :         if (!s->s3->tmp.reuse_message && !skip) {
     772           0 :             if (s->debug) {
     773           0 :                 if ((ret = BIO_flush(s->wbio)) <= 0)
     774             :                     goto end;
     775             :             }
     776             : 
     777           0 :             if ((cb != NULL) && (s->state != state)) {
     778             :                 new_state = s->state;
     779           0 :                 s->state = state;
     780           0 :                 cb(s, SSL_CB_CONNECT_LOOP, 1);
     781           0 :                 s->state = new_state;
     782             :             }
     783             :         }
     784             :         skip = 0;
     785             :     }
     786             :  end:
     787           0 :     s->in_handshake--;
     788             : 
     789             : #ifndef OPENSSL_NO_SCTP
     790             :     /*
     791             :      * Notify SCTP BIO socket to leave handshake mode and allow stream
     792             :      * identifier other than 0. Will be ignored if no SCTP is used.
     793             :      */
     794             :     BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE,
     795             :              s->in_handshake, NULL);
     796             : #endif
     797             : 
     798           0 :     if (buf != NULL)
     799           0 :         BUF_MEM_free(buf);
     800           0 :     if (cb != NULL)
     801           0 :         cb(s, SSL_CB_CONNECT_EXIT, ret);
     802           0 :     return (ret);
     803             : }
     804             : 
     805           0 : static int dtls1_get_hello_verify(SSL *s)
     806             : {
     807           0 :     int n, al, ok = 0;
     808             :     unsigned char *data;
     809             :     unsigned int cookie_len;
     810             : 
     811           0 :     s->first_packet = 1;
     812           0 :     n = s->method->ssl_get_message(s,
     813             :                                    DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A,
     814             :                                    DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B,
     815             :                                    -1, s->max_cert_list, &ok);
     816           0 :     s->first_packet = 0;
     817             : 
     818           0 :     if (!ok)
     819             :         return ((int)n);
     820             : 
     821           0 :     if (s->s3->tmp.message_type != DTLS1_MT_HELLO_VERIFY_REQUEST) {
     822           0 :         s->d1->send_cookie = 0;
     823           0 :         s->s3->tmp.reuse_message = 1;
     824           0 :         return (1);
     825             :     }
     826             : 
     827           0 :     data = (unsigned char *)s->init_msg;
     828             : #if 0
     829             :     if (s->method->version != DTLS_ANY_VERSION &&
     830             :         ((data[0] != (s->version >> 8)) || (data[1] != (s->version & 0xff))))
     831             :     {
     832             :         SSLerr(SSL_F_DTLS1_GET_HELLO_VERIFY, SSL_R_WRONG_SSL_VERSION);
     833             :         s->version = (s->version & 0xff00) | data[1];
     834             :         al = SSL_AD_PROTOCOL_VERSION;
     835             :         goto f_err;
     836             :     }
     837             : #endif
     838             :     data += 2;
     839             : 
     840           0 :     cookie_len = *(data++);
     841           0 :     if (cookie_len > sizeof(s->d1->cookie)) {
     842             :         al = SSL_AD_ILLEGAL_PARAMETER;
     843             :         goto f_err;
     844             :     }
     845             : 
     846           0 :     memcpy(s->d1->cookie, data, cookie_len);
     847           0 :     s->d1->cookie_len = cookie_len;
     848             : 
     849           0 :     s->d1->send_cookie = 1;
     850           0 :     return 1;
     851             : 
     852             :  f_err:
     853           0 :     ssl3_send_alert(s, SSL3_AL_FATAL, al);
     854           0 :     s->state = SSL_ST_ERR;
     855           0 :     return -1;
     856             : }

Generated by: LCOV version 1.10