LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/ssl - d1_srvr.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 0 281 0.0 %
Date: 2014-08-02 Functions: 0 6 0.0 %
Branches: 0 194 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* ssl/d1_srvr.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                 :            : #include <openssl/buffer.h>
     119                 :            : #include <openssl/rand.h>
     120                 :            : #include <openssl/objects.h>
     121                 :            : #include <openssl/evp.h>
     122                 :            : #include <openssl/x509.h>
     123                 :            : #include <openssl/md5.h>
     124                 :            : #include <openssl/bn.h>
     125                 :            : #ifndef OPENSSL_NO_DH
     126                 :            : #include <openssl/dh.h>
     127                 :            : #endif
     128                 :            : 
     129                 :            : static const SSL_METHOD *dtls1_get_server_method(int ver);
     130                 :            : static int dtls1_send_hello_verify_request(SSL *s);
     131                 :            : 
     132                 :          0 : static const SSL_METHOD *dtls1_get_server_method(int ver)
     133                 :            :         {
     134         [ #  # ]:          0 :         if (ver == DTLS1_VERSION)
     135                 :          0 :                 return(DTLSv1_server_method());
     136         [ #  # ]:          0 :         else if (ver == DTLS1_2_VERSION)
     137                 :          0 :                 return(DTLSv1_2_server_method());
     138                 :            :         else
     139                 :            :                 return(NULL);
     140                 :            :         }
     141                 :            : 
     142                 :          0 : IMPLEMENT_dtls1_meth_func(DTLS1_VERSION,
     143                 :            :                         DTLSv1_server_method,
     144                 :            :                         dtls1_accept,
     145                 :            :                         ssl_undefined_function,
     146                 :            :                         dtls1_get_server_method,
     147                 :            :                         DTLSv1_enc_data)
     148                 :            : 
     149                 :          0 : IMPLEMENT_dtls1_meth_func(DTLS1_2_VERSION,
     150                 :            :                         DTLSv1_2_server_method,
     151                 :            :                         dtls1_accept,
     152                 :            :                         ssl_undefined_function,
     153                 :            :                         dtls1_get_server_method,
     154                 :            :                         DTLSv1_2_enc_data)
     155                 :            : 
     156                 :          0 : IMPLEMENT_dtls1_meth_func(DTLS_ANY_VERSION,
     157                 :            :                         DTLS_server_method,
     158                 :            :                         dtls1_accept,
     159                 :            :                         ssl_undefined_function,
     160                 :            :                         dtls1_get_server_method,
     161                 :            :                         DTLSv1_2_enc_data)
     162                 :            : 
     163                 :          0 : int dtls1_accept(SSL *s)
     164                 :            :         {
     165                 :            :         BUF_MEM *buf;
     166                 :          0 :         unsigned long Time=(unsigned long)time(NULL);
     167                 :          0 :         void (*cb)(const SSL *ssl,int type,int val)=NULL;
     168                 :            :         unsigned long alg_k;
     169                 :          0 :         int ret= -1;
     170                 :          0 :         int new_state,state,skip=0;
     171                 :            :         int listen;
     172                 :            : #ifndef OPENSSL_NO_SCTP
     173                 :            :         unsigned char sctpauthkey[64];
     174                 :            :         char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)];
     175                 :            : #endif
     176                 :            : 
     177                 :          0 :         RAND_add(&Time,sizeof(Time),0);
     178                 :          0 :         ERR_clear_error();
     179                 :          0 :         clear_sys_error();
     180                 :            : 
     181         [ #  # ]:          0 :         if (s->info_callback != NULL)
     182                 :            :                 cb=s->info_callback;
     183         [ #  # ]:          0 :         else if (s->ctx->info_callback != NULL)
     184                 :          0 :                 cb=s->ctx->info_callback;
     185                 :            :         
     186                 :          0 :         listen = s->d1->listen;
     187                 :            : 
     188                 :            :         /* init things to blank */
     189                 :          0 :         s->in_handshake++;
     190 [ #  # ][ #  # ]:          0 :         if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
     191                 :            : 
     192                 :          0 :         s->d1->listen = listen;
     193                 :            : #ifndef OPENSSL_NO_SCTP
     194                 :            :         /* Notify SCTP BIO socket to enter handshake
     195                 :            :          * mode and prevent stream identifier other
     196                 :            :          * than 0. Will be ignored if no SCTP is used.
     197                 :            :          */
     198                 :            :         BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE, s->in_handshake, NULL);
     199                 :            : #endif
     200                 :            : 
     201         [ #  # ]:          0 :         if (s->cert == NULL)
     202                 :            :                 {
     203                 :          0 :                 SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
     204                 :          0 :                 return(-1);
     205                 :            :                 }
     206                 :            : 
     207                 :            : #ifndef OPENSSL_NO_HEARTBEATS
     208                 :            :         /* If we're awaiting a HeartbeatResponse, pretend we
     209                 :            :          * already got and don't await it anymore, because
     210                 :            :          * Heartbeats don't make sense during handshakes anyway.
     211                 :            :          */
     212         [ #  # ]:          0 :         if (s->tlsext_hb_pending)
     213                 :            :                 {
     214                 :          0 :                 dtls1_stop_timer(s);
     215                 :          0 :                 s->tlsext_hb_pending = 0;
     216                 :          0 :                 s->tlsext_hb_seq++;
     217                 :            :                 }
     218                 :            : #endif
     219                 :            : 
     220                 :            :         for (;;)
     221                 :            :                 {
     222                 :          0 :                 state=s->state;
     223                 :            : 
     224   [ #  #  #  #  :          0 :                 switch (s->state)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     225                 :            :                         {
     226                 :            :                 case SSL_ST_RENEGOTIATE:
     227                 :          0 :                         s->renegotiate=1;
     228                 :            :                         /* s->state=SSL_ST_ACCEPT; */
     229                 :            : 
     230                 :            :                 case SSL_ST_BEFORE:
     231                 :            :                 case SSL_ST_ACCEPT:
     232                 :            :                 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
     233                 :            :                 case SSL_ST_OK|SSL_ST_ACCEPT:
     234                 :            : 
     235                 :          0 :                         s->server=1;
     236         [ #  # ]:          0 :                         if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
     237                 :            : 
     238         [ #  # ]:          0 :                         if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00))
     239                 :            :                                 {
     240                 :          0 :                                 SSLerr(SSL_F_DTLS1_ACCEPT, ERR_R_INTERNAL_ERROR);
     241                 :          0 :                                 return -1;
     242                 :            :                                 }
     243                 :          0 :                         s->type=SSL_ST_ACCEPT;
     244                 :            : 
     245         [ #  # ]:          0 :                         if (s->init_buf == NULL)
     246                 :            :                                 {
     247         [ #  # ]:          0 :                                 if ((buf=BUF_MEM_new()) == NULL)
     248                 :            :                                         {
     249                 :            :                                         ret= -1;
     250                 :            :                                         goto end;
     251                 :            :                                         }
     252         [ #  # ]:          0 :                                 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
     253                 :            :                                         {
     254                 :            :                                         ret= -1;
     255                 :            :                                         goto end;
     256                 :            :                                         }
     257                 :          0 :                                 s->init_buf=buf;
     258                 :            :                                 }
     259                 :            : 
     260         [ #  # ]:          0 :                         if (!ssl3_setup_buffers(s))
     261                 :            :                                 {
     262                 :            :                                 ret= -1;
     263                 :            :                                 goto end;
     264                 :            :                                 }
     265                 :            : 
     266                 :          0 :                         s->init_num=0;
     267                 :            : 
     268         [ #  # ]:          0 :                         if (s->state != SSL_ST_RENEGOTIATE)
     269                 :            :                                 {
     270                 :            :                                 /* Ok, we now need to push on a buffering BIO so that
     271                 :            :                                  * the output is sent in a way that TCP likes :-)
     272                 :            :                                  * ...but not with SCTP :-)
     273                 :            :                                  */
     274                 :            : #ifndef OPENSSL_NO_SCTP
     275                 :            :                                 if (!BIO_dgram_is_sctp(SSL_get_wbio(s)))
     276                 :            : #endif
     277         [ #  # ]:          0 :                                         if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
     278                 :            : 
     279                 :          0 :                                 ssl3_init_finished_mac(s);
     280                 :          0 :                                 s->state=SSL3_ST_SR_CLNT_HELLO_A;
     281                 :          0 :                                 s->ctx->stats.sess_accept++;
     282                 :            :                                 }
     283                 :            :                         else
     284                 :            :                                 {
     285                 :            :                                 /* s->state == SSL_ST_RENEGOTIATE,
     286                 :            :                                  * we will just send a HelloRequest */
     287                 :          0 :                                 s->ctx->stats.sess_accept_renegotiate++;
     288                 :          0 :                                 s->state=SSL3_ST_SW_HELLO_REQ_A;
     289                 :            :                                 }
     290                 :            : 
     291                 :            :                         break;
     292                 :            : 
     293                 :            :                 case SSL3_ST_SW_HELLO_REQ_A:
     294                 :            :                 case SSL3_ST_SW_HELLO_REQ_B:
     295                 :            : 
     296                 :          0 :                         s->shutdown=0;
     297                 :          0 :                         dtls1_clear_record_buffer(s);
     298                 :          0 :                         dtls1_start_timer(s);
     299                 :          0 :                         ret=ssl3_send_hello_request(s);
     300         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     301                 :          0 :                         s->s3->tmp.next_state=SSL3_ST_SR_CLNT_HELLO_A;
     302                 :          0 :                         s->state=SSL3_ST_SW_FLUSH;
     303                 :          0 :                         s->init_num=0;
     304                 :            : 
     305                 :          0 :                         ssl3_init_finished_mac(s);
     306                 :          0 :                         break;
     307                 :            : 
     308                 :            :                 case SSL3_ST_SW_HELLO_REQ_C:
     309                 :          0 :                         s->state=SSL_ST_OK;
     310                 :          0 :                         break;
     311                 :            : 
     312                 :            :                 case SSL3_ST_SR_CLNT_HELLO_A:
     313                 :            :                 case SSL3_ST_SR_CLNT_HELLO_B:
     314                 :            :                 case SSL3_ST_SR_CLNT_HELLO_C:
     315                 :            : 
     316                 :          0 :                         s->shutdown=0;
     317                 :          0 :                         ret=ssl3_get_client_hello(s);
     318         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     319                 :          0 :                         dtls1_stop_timer(s);
     320                 :            : 
     321 [ #  # ][ #  # ]:          0 :                         if (ret == 1 && (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE))
     322                 :          0 :                                 s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A;
     323                 :            :                         else
     324                 :          0 :                                 s->state = SSL3_ST_SW_SRVR_HELLO_A;
     325                 :            : 
     326                 :          0 :                         s->init_num=0;
     327                 :            : 
     328                 :            :                         /* Reflect ClientHello sequence to remain stateless while listening */
     329         [ #  # ]:          0 :                         if (listen)
     330                 :            :                                 {
     331                 :          0 :                                 memcpy(s->s3->write_sequence, s->s3->read_sequence, sizeof(s->s3->write_sequence));
     332                 :            :                                 }
     333                 :            : 
     334                 :            :                         /* If we're just listening, stop here */
     335 [ #  # ][ #  # ]:          0 :                         if (listen && s->state == SSL3_ST_SW_SRVR_HELLO_A)
     336                 :            :                                 {
     337                 :          0 :                                 ret = 2;
     338                 :          0 :                                 s->d1->listen = 0;
     339                 :            :                                 /* Set expected sequence numbers
     340                 :            :                                  * to continue the handshake.
     341                 :            :                                  */
     342                 :          0 :                                 s->d1->handshake_read_seq = 2;
     343                 :          0 :                                 s->d1->handshake_write_seq = 1;
     344                 :          0 :                                 s->d1->next_handshake_write_seq = 1;
     345                 :          0 :                                 goto end;
     346                 :            :                                 }
     347                 :            :                         
     348                 :            :                         break;
     349                 :            :                         
     350                 :            :                 case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A:
     351                 :            :                 case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B:
     352                 :            : 
     353                 :          0 :                         ret = dtls1_send_hello_verify_request(s);
     354         [ #  # ]:          0 :                         if ( ret <= 0) goto end;
     355                 :          0 :                         s->state=SSL3_ST_SW_FLUSH;
     356                 :          0 :                         s->s3->tmp.next_state=SSL3_ST_SR_CLNT_HELLO_A;
     357                 :            : 
     358                 :            :                         /* HelloVerifyRequest resets Finished MAC */
     359         [ #  # ]:          0 :                         if (s->version != DTLS1_BAD_VER)
     360                 :          0 :                                 ssl3_init_finished_mac(s);
     361                 :            :                         break;
     362                 :            :                         
     363                 :            : #ifndef OPENSSL_NO_SCTP
     364                 :            :                 case DTLS1_SCTP_ST_SR_READ_SOCK:
     365                 :            :                         
     366                 :            :                         if (BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s)))                
     367                 :            :                                 {
     368                 :            :                                 s->s3->in_read_app_data=2;
     369                 :            :                                 s->rwstate=SSL_READING;
     370                 :            :                                 BIO_clear_retry_flags(SSL_get_rbio(s));
     371                 :            :                                 BIO_set_retry_read(SSL_get_rbio(s));
     372                 :            :                                 ret = -1;
     373                 :            :                                 goto end;
     374                 :            :                                 }
     375                 :            :                         
     376                 :            :                         s->state=SSL3_ST_SR_FINISHED_A;
     377                 :            :                         break;
     378                 :            :                         
     379                 :            :                 case DTLS1_SCTP_ST_SW_WRITE_SOCK:
     380                 :            :                         ret = BIO_dgram_sctp_wait_for_dry(SSL_get_wbio(s));
     381                 :            :                         if (ret < 0) goto end;
     382                 :            :                         
     383                 :            :                         if (ret == 0)
     384                 :            :                                 {
     385                 :            :                                 if (s->d1->next_state != SSL_ST_OK)
     386                 :            :                                         {
     387                 :            :                                         s->s3->in_read_app_data=2;
     388                 :            :                                         s->rwstate=SSL_READING;
     389                 :            :                                         BIO_clear_retry_flags(SSL_get_rbio(s));
     390                 :            :                                         BIO_set_retry_read(SSL_get_rbio(s));
     391                 :            :                                         ret = -1;
     392                 :            :                                         goto end;
     393                 :            :                                         }
     394                 :            :                                 }
     395                 :            : 
     396                 :            :                         s->state=s->d1->next_state;
     397                 :            :                         break;
     398                 :            : #endif
     399                 :            : 
     400                 :            :                 case SSL3_ST_SW_SRVR_HELLO_A:
     401                 :            :                 case SSL3_ST_SW_SRVR_HELLO_B:
     402                 :          0 :                         s->renegotiate = 2;
     403                 :          0 :                         dtls1_start_timer(s);
     404                 :          0 :                         ret=ssl3_send_server_hello(s);
     405         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     406                 :            : 
     407         [ #  # ]:          0 :                         if (s->hit)
     408                 :            :                                 {
     409                 :            : #ifndef OPENSSL_NO_SCTP
     410                 :            :                                 /* Add new shared key for SCTP-Auth,
     411                 :            :                                  * will be ignored if no SCTP used.
     412                 :            :                                  */
     413                 :            :                                 snprintf((char*) labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
     414                 :            :                                          DTLS1_SCTP_AUTH_LABEL);
     415                 :            : 
     416                 :            :                                 SSL_export_keying_material(s, sctpauthkey,
     417                 :            :                                                            sizeof(sctpauthkey), labelbuffer,
     418                 :            :                                                            sizeof(labelbuffer), NULL, 0, 0);
     419                 :            :                                 
     420                 :            :                                 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
     421                 :            :                          sizeof(sctpauthkey), sctpauthkey);
     422                 :            : #endif
     423                 :            : #ifndef OPENSSL_NO_TLSEXT
     424         [ #  # ]:          0 :                                 if (s->tlsext_ticket_expected)
     425                 :          0 :                                         s->state=SSL3_ST_SW_SESSION_TICKET_A;
     426                 :            :                                 else
     427                 :          0 :                                         s->state=SSL3_ST_SW_CHANGE_A;
     428                 :            : #else
     429                 :            :                                 s->state=SSL3_ST_SW_CHANGE_A;
     430                 :            : #endif
     431                 :            :                                 }
     432                 :            :                         else
     433                 :          0 :                                 s->state=SSL3_ST_SW_CERT_A;
     434                 :          0 :                         s->init_num=0;
     435                 :          0 :                         break;
     436                 :            : 
     437                 :            :                 case SSL3_ST_SW_CERT_A:
     438                 :            :                 case SSL3_ST_SW_CERT_B:
     439                 :            :                         /* Check if it is anon DH or normal PSK */
     440         [ #  # ]:          0 :                         if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)
     441         [ #  # ]:          0 :                                 && !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
     442                 :            :                                 {
     443                 :          0 :                                 dtls1_start_timer(s);
     444                 :          0 :                                 ret=ssl3_send_server_certificate(s);
     445         [ #  # ]:          0 :                                 if (ret <= 0) goto end;
     446                 :            : #ifndef OPENSSL_NO_TLSEXT
     447         [ #  # ]:          0 :                                 if (s->tlsext_status_expected)
     448                 :          0 :                                         s->state=SSL3_ST_SW_CERT_STATUS_A;
     449                 :            :                                 else
     450                 :          0 :                                         s->state=SSL3_ST_SW_KEY_EXCH_A;
     451                 :            :                                 }
     452                 :            :                         else
     453                 :            :                                 {
     454                 :          0 :                                 skip = 1;
     455                 :          0 :                                 s->state=SSL3_ST_SW_KEY_EXCH_A;
     456                 :            :                                 }
     457                 :            : #else
     458                 :            :                                 }
     459                 :            :                         else
     460                 :            :                                 skip=1;
     461                 :            : 
     462                 :            :                         s->state=SSL3_ST_SW_KEY_EXCH_A;
     463                 :            : #endif
     464                 :          0 :                         s->init_num=0;
     465                 :          0 :                         break;
     466                 :            : 
     467                 :            :                 case SSL3_ST_SW_KEY_EXCH_A:
     468                 :            :                 case SSL3_ST_SW_KEY_EXCH_B:
     469                 :          0 :                         alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
     470                 :            : 
     471                 :            :                         /* clear this, it may get reset by
     472                 :            :                          * send_server_key_exchange */
     473         [ #  # ]:          0 :                         if ((s->options & SSL_OP_EPHEMERAL_RSA)
     474                 :            : #ifndef OPENSSL_NO_KRB5
     475                 :            :                                 && !(alg_k & SSL_kKRB5)
     476                 :            : #endif /* OPENSSL_NO_KRB5 */
     477                 :            :                                 )
     478                 :            :                                 /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
     479                 :            :                                  * even when forbidden by protocol specs
     480                 :            :                                  * (handshake may fail as clients are not required to
     481                 :            :                                  * be able to handle this) */
     482                 :          0 :                                 s->s3->tmp.use_rsa_tmp=1;
     483                 :            :                         else
     484                 :          0 :                                 s->s3->tmp.use_rsa_tmp=0;
     485                 :            : 
     486                 :            :                         /* only send if a DH key exchange or
     487                 :            :                          * RSA but we have a sign only certificate */
     488         [ #  # ]:          0 :                         if (s->s3->tmp.use_rsa_tmp
     489                 :            :                         /* PSK: send ServerKeyExchange if PSK identity
     490                 :            :                          * hint if provided */
     491                 :            : #ifndef OPENSSL_NO_PSK
     492 [ #  # ][ #  # ]:          0 :                             || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint)
     493                 :            : #endif
     494                 :            :                             || (alg_k & (SSL_kDHE|SSL_kDHr|SSL_kDHd))
     495         [ #  # ]:          0 :                             || (alg_k & SSL_kECDHE)
     496         [ #  # ]:          0 :                             || ((alg_k & SSL_kRSA)
     497         [ #  # ]:          0 :                                 && (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
     498         [ #  # ]:          0 :                                     || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
     499 [ #  # ][ #  # ]:          0 :                                         && EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)
     500                 :            :                                         )
     501                 :            :                                     )
     502                 :            :                                 )
     503                 :            :                             )
     504                 :            :                                 {
     505                 :          0 :                                 dtls1_start_timer(s);
     506                 :          0 :                                 ret=ssl3_send_server_key_exchange(s);
     507         [ #  # ]:          0 :                                 if (ret <= 0) goto end;
     508                 :            :                                 }
     509                 :            :                         else
     510                 :            :                                 skip=1;
     511                 :            : 
     512                 :          0 :                         s->state=SSL3_ST_SW_CERT_REQ_A;
     513                 :          0 :                         s->init_num=0;
     514                 :          0 :                         break;
     515                 :            : 
     516                 :            :                 case SSL3_ST_SW_CERT_REQ_A:
     517                 :            :                 case SSL3_ST_SW_CERT_REQ_B:
     518         [ #  # ]:          0 :                         if (/* don't request cert unless asked for it: */
     519         [ #  # ]:          0 :                                 !(s->verify_mode & SSL_VERIFY_PEER) ||
     520                 :            :                                 /* if SSL_VERIFY_CLIENT_ONCE is set,
     521                 :            :                                  * don't request cert during re-negotiation: */
     522         [ #  # ]:          0 :                                 ((s->session->peer != NULL) &&
     523         [ #  # ]:          0 :                                  (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
     524                 :            :                                 /* never request cert in anonymous ciphersuites
     525                 :            :                                  * (see section "Certificate request" in SSL 3 drafts
     526                 :            :                                  * and in RFC 2246): */
     527         [ #  # ]:          0 :                                 ((s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
     528                 :            :                                  /* ... except when the application insists on verification
     529                 :            :                                   * (against the specs, but s3_clnt.c accepts this for SSL 3) */
     530         [ #  # ]:          0 :                                  !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
     531                 :            :                                  /* never request cert in Kerberos ciphersuites */
     532                 :          0 :                                 (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5)
     533                 :            :                                 /* With normal PSK Certificates and
     534                 :            :                                  * Certificate Requests are omitted */
     535         [ #  # ]:          0 :                                 || (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
     536                 :            :                                 {
     537                 :            :                                 /* no cert request */
     538                 :          0 :                                 skip=1;
     539                 :          0 :                                 s->s3->tmp.cert_request=0;
     540                 :          0 :                                 s->state=SSL3_ST_SW_SRVR_DONE_A;
     541                 :            : #ifndef OPENSSL_NO_SCTP
     542                 :            :                                 if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
     543                 :            :                                         {
     544                 :            :                                         s->d1->next_state = SSL3_ST_SW_SRVR_DONE_A;
     545                 :            :                                         s->state = DTLS1_SCTP_ST_SW_WRITE_SOCK;
     546                 :            :                                         }
     547                 :            : #endif
     548                 :            :                                 }
     549                 :            :                         else
     550                 :            :                                 {
     551                 :          0 :                                 s->s3->tmp.cert_request=1;
     552                 :          0 :                                 dtls1_start_timer(s);
     553                 :          0 :                                 ret=ssl3_send_certificate_request(s);
     554         [ #  # ]:          0 :                                 if (ret <= 0) goto end;
     555                 :            : #ifndef NETSCAPE_HANG_BUG
     556                 :          0 :                                 s->state=SSL3_ST_SW_SRVR_DONE_A;
     557                 :            : #ifndef OPENSSL_NO_SCTP
     558                 :            :                                 if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
     559                 :            :                                         {
     560                 :            :                                         s->d1->next_state = SSL3_ST_SW_SRVR_DONE_A;
     561                 :            :                                         s->state = DTLS1_SCTP_ST_SW_WRITE_SOCK;
     562                 :            :                                         }
     563                 :            : #endif
     564                 :            : #else
     565                 :            :                                 s->state=SSL3_ST_SW_FLUSH;
     566                 :            :                                 s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
     567                 :            : #ifndef OPENSSL_NO_SCTP
     568                 :            :                                 if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
     569                 :            :                                         {
     570                 :            :                                         s->d1->next_state = s->s3->tmp.next_state;
     571                 :            :                                         s->s3->tmp.next_state=DTLS1_SCTP_ST_SW_WRITE_SOCK;
     572                 :            :                                         }
     573                 :            : #endif
     574                 :            : #endif
     575                 :          0 :                                 s->init_num=0;
     576                 :            :                                 }
     577                 :            :                         break;
     578                 :            : 
     579                 :            :                 case SSL3_ST_SW_SRVR_DONE_A:
     580                 :            :                 case SSL3_ST_SW_SRVR_DONE_B:
     581                 :          0 :                         dtls1_start_timer(s);
     582                 :          0 :                         ret=ssl3_send_server_done(s);
     583         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     584                 :          0 :                         s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
     585                 :          0 :                         s->state=SSL3_ST_SW_FLUSH;
     586                 :          0 :                         s->init_num=0;
     587                 :          0 :                         break;
     588                 :            :                 
     589                 :            :                 case SSL3_ST_SW_FLUSH:
     590                 :          0 :                         s->rwstate=SSL_WRITING;
     591         [ #  # ]:          0 :                         if (BIO_flush(s->wbio) <= 0)
     592                 :            :                                 {
     593                 :            :                                 /* If the write error was fatal, stop trying */
     594         [ #  # ]:          0 :                                 if (!BIO_should_retry(s->wbio))
     595                 :            :                                         {
     596                 :          0 :                                         s->rwstate=SSL_NOTHING;
     597                 :          0 :                                         s->state=s->s3->tmp.next_state;
     598                 :            :                                         }
     599                 :            :                                 
     600                 :            :                                 ret= -1;
     601                 :            :                                 goto end;
     602                 :            :                                 }
     603                 :          0 :                         s->rwstate=SSL_NOTHING;
     604                 :          0 :                         s->state=s->s3->tmp.next_state;
     605                 :          0 :                         break;
     606                 :            : 
     607                 :            :                 case SSL3_ST_SR_CERT_A:
     608                 :            :                 case SSL3_ST_SR_CERT_B:
     609                 :            :                         /* Check for second client hello (MS SGC) */
     610                 :          0 :                         ret = ssl3_check_client_hello(s);
     611         [ #  # ]:          0 :                         if (ret <= 0)
     612                 :            :                                 goto end;
     613         [ #  # ]:          0 :                         if (ret == 2)
     614                 :            :                                 {
     615                 :          0 :                                 dtls1_stop_timer(s);
     616                 :          0 :                                 s->state = SSL3_ST_SR_CLNT_HELLO_C;
     617                 :            :                                 }
     618                 :            :                         else {
     619         [ #  # ]:          0 :                                 if (s->s3->tmp.cert_request)
     620                 :            :                                         {
     621                 :          0 :                                         ret=ssl3_get_client_certificate(s);
     622         [ #  # ]:          0 :                                         if (ret <= 0) goto end;
     623                 :            :                                         }
     624                 :          0 :                                 s->init_num=0;
     625                 :          0 :                                 s->state=SSL3_ST_SR_KEY_EXCH_A;
     626                 :            :                         }
     627                 :            :                         break;
     628                 :            : 
     629                 :            :                 case SSL3_ST_SR_KEY_EXCH_A:
     630                 :            :                 case SSL3_ST_SR_KEY_EXCH_B:
     631                 :          0 :                         ret=ssl3_get_client_key_exchange(s);
     632         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     633                 :            : #ifndef OPENSSL_NO_SCTP
     634                 :            :                         /* Add new shared key for SCTP-Auth,
     635                 :            :                          * will be ignored if no SCTP used.
     636                 :            :                          */
     637                 :            :                         snprintf((char *) labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
     638                 :            :                                  DTLS1_SCTP_AUTH_LABEL);
     639                 :            : 
     640                 :            :                         SSL_export_keying_material(s, sctpauthkey,
     641                 :            :                                                    sizeof(sctpauthkey), labelbuffer,
     642                 :            :                                                    sizeof(labelbuffer), NULL, 0, 0);
     643                 :            : 
     644                 :            :                         BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
     645                 :            :                                  sizeof(sctpauthkey), sctpauthkey);
     646                 :            : #endif
     647                 :            : 
     648                 :          0 :                         s->state=SSL3_ST_SR_CERT_VRFY_A;
     649                 :          0 :                         s->init_num=0;
     650                 :            : 
     651         [ #  # ]:          0 :                         if (ret == 2)
     652                 :            :                                 {
     653                 :            :                                 /* For the ECDH ciphersuites when
     654                 :            :                                  * the client sends its ECDH pub key in
     655                 :            :                                  * a certificate, the CertificateVerify
     656                 :            :                                  * message is not sent.
     657                 :            :                                  */
     658                 :          0 :                                 s->state=SSL3_ST_SR_FINISHED_A;
     659                 :            :                                 s->init_num = 0;
     660                 :            :                                 }
     661         [ #  # ]:          0 :                         else if (SSL_USE_SIGALGS(s))
     662                 :            :                                 {
     663                 :            :                                 s->state=SSL3_ST_SR_CERT_VRFY_A;
     664                 :            :                                 s->init_num=0;
     665         [ #  # ]:          0 :                                 if (!s->session->peer)
     666                 :            :                                         break;
     667                 :            :                                 /* For sigalgs freeze the handshake buffer
     668                 :            :                                  * at this point and digest cached records.
     669                 :            :                                  */
     670         [ #  # ]:          0 :                                 if (!s->s3->handshake_buffer)
     671                 :            :                                         {
     672                 :          0 :                                         SSLerr(SSL_F_DTLS1_ACCEPT,ERR_R_INTERNAL_ERROR);
     673                 :          0 :                                         return -1;
     674                 :            :                                         }
     675                 :          0 :                                 s->s3->flags |= TLS1_FLAGS_KEEP_HANDSHAKE;
     676         [ #  # ]:          0 :                                 if (!ssl3_digest_cached_records(s))
     677                 :            :                                         return -1;
     678                 :            :                                 }
     679                 :            :                         else
     680                 :            :                                 {
     681                 :            :                                 s->state=SSL3_ST_SR_CERT_VRFY_A;
     682                 :            :                                 s->init_num=0;
     683                 :            : 
     684                 :            :                                 /* We need to get hashes here so if there is
     685                 :            :                                  * a client cert, it can be verified */ 
     686                 :          0 :                                 s->method->ssl3_enc->cert_verify_mac(s,
     687                 :            :                                         NID_md5,
     688                 :          0 :                                         &(s->s3->tmp.cert_verify_md[0]));
     689                 :          0 :                                 s->method->ssl3_enc->cert_verify_mac(s,
     690                 :            :                                         NID_sha1,
     691                 :          0 :                                         &(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]));
     692                 :            :                                 }
     693                 :            :                         break;
     694                 :            : 
     695                 :            :                 case SSL3_ST_SR_CERT_VRFY_A:
     696                 :            :                 case SSL3_ST_SR_CERT_VRFY_B:
     697                 :            : 
     698                 :          0 :                         s->d1->change_cipher_spec_ok = 1;
     699                 :            :                         /* we should decide if we expected this one */
     700                 :          0 :                         ret=ssl3_get_cert_verify(s);
     701         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     702                 :            : #ifndef OPENSSL_NO_SCTP
     703                 :            :                         if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
     704                 :            :                             state == SSL_ST_RENEGOTIATE)
     705                 :            :                                 s->state=DTLS1_SCTP_ST_SR_READ_SOCK;
     706                 :            :                         else
     707                 :            : #endif                  
     708                 :          0 :                                 s->state=SSL3_ST_SR_FINISHED_A;
     709                 :          0 :                         s->init_num=0;
     710                 :          0 :                         break;
     711                 :            : 
     712                 :            :                 case SSL3_ST_SR_FINISHED_A:
     713                 :            :                 case SSL3_ST_SR_FINISHED_B:
     714                 :          0 :                         s->d1->change_cipher_spec_ok = 1;
     715                 :          0 :                         ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
     716                 :            :                                 SSL3_ST_SR_FINISHED_B);
     717         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     718                 :          0 :                         dtls1_stop_timer(s);
     719         [ #  # ]:          0 :                         if (s->hit)
     720                 :          0 :                                 s->state=SSL_ST_OK;
     721                 :            : #ifndef OPENSSL_NO_TLSEXT
     722         [ #  # ]:          0 :                         else if (s->tlsext_ticket_expected)
     723                 :          0 :                                 s->state=SSL3_ST_SW_SESSION_TICKET_A;
     724                 :            : #endif
     725                 :            :                         else
     726                 :          0 :                                 s->state=SSL3_ST_SW_CHANGE_A;
     727                 :          0 :                         s->init_num=0;
     728                 :          0 :                         break;
     729                 :            : 
     730                 :            : #ifndef OPENSSL_NO_TLSEXT
     731                 :            :                 case SSL3_ST_SW_SESSION_TICKET_A:
     732                 :            :                 case SSL3_ST_SW_SESSION_TICKET_B:
     733                 :          0 :                         ret=ssl3_send_newsession_ticket(s);
     734         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     735                 :          0 :                         s->state=SSL3_ST_SW_CHANGE_A;
     736                 :          0 :                         s->init_num=0;
     737                 :          0 :                         break;
     738                 :            : 
     739                 :            :                 case SSL3_ST_SW_CERT_STATUS_A:
     740                 :            :                 case SSL3_ST_SW_CERT_STATUS_B:
     741                 :          0 :                         ret=ssl3_send_cert_status(s);
     742         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     743                 :          0 :                         s->state=SSL3_ST_SW_KEY_EXCH_A;
     744                 :          0 :                         s->init_num=0;
     745                 :          0 :                         break;
     746                 :            : 
     747                 :            : #endif
     748                 :            : 
     749                 :            :                 case SSL3_ST_SW_CHANGE_A:
     750                 :            :                 case SSL3_ST_SW_CHANGE_B:
     751                 :            : 
     752                 :          0 :                         s->session->cipher=s->s3->tmp.new_cipher;
     753         [ #  # ]:          0 :                         if (!s->method->ssl3_enc->setup_key_block(s))
     754                 :            :                                 { ret= -1; goto end; }
     755                 :            : 
     756                 :          0 :                         ret=dtls1_send_change_cipher_spec(s,
     757                 :            :                                 SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
     758                 :            : 
     759         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     760                 :            : 
     761                 :            : #ifndef OPENSSL_NO_SCTP
     762                 :            :                         if (!s->hit)
     763                 :            :                                 {
     764                 :            :                                 /* Change to new shared key of SCTP-Auth,
     765                 :            :                                  * will be ignored if no SCTP used.
     766                 :            :                                  */
     767                 :            :                                 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 0, NULL);
     768                 :            :                                 }
     769                 :            : #endif
     770                 :            : 
     771                 :          0 :                         s->state=SSL3_ST_SW_FINISHED_A;
     772                 :          0 :                         s->init_num=0;
     773                 :            : 
     774         [ #  # ]:          0 :                         if (!s->method->ssl3_enc->change_cipher_state(s,
     775                 :            :                                 SSL3_CHANGE_CIPHER_SERVER_WRITE))
     776                 :            :                                 {
     777                 :            :                                 ret= -1;
     778                 :            :                                 goto end;
     779                 :            :                                 }
     780                 :            : 
     781                 :          0 :                         dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
     782                 :          0 :                         break;
     783                 :            : 
     784                 :            :                 case SSL3_ST_SW_FINISHED_A:
     785                 :            :                 case SSL3_ST_SW_FINISHED_B:
     786                 :          0 :                         ret=ssl3_send_finished(s,
     787                 :            :                                 SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
     788                 :            :                                 s->method->ssl3_enc->server_finished_label,
     789                 :          0 :                                 s->method->ssl3_enc->server_finished_label_len);
     790         [ #  # ]:          0 :                         if (ret <= 0) goto end;
     791                 :          0 :                         s->state=SSL3_ST_SW_FLUSH;
     792         [ #  # ]:          0 :                         if (s->hit)
     793                 :            :                                 {
     794                 :          0 :                                 s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A;
     795                 :            : 
     796                 :            : #ifndef OPENSSL_NO_SCTP
     797                 :            :                                 /* Change to new shared key of SCTP-Auth,
     798                 :            :                                  * will be ignored if no SCTP used.
     799                 :            :                                  */
     800                 :            :                                 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 0, NULL);
     801                 :            : #endif
     802                 :            :                                 }
     803                 :            :                         else
     804                 :            :                                 {
     805                 :          0 :                                 s->s3->tmp.next_state=SSL_ST_OK;
     806                 :            : #ifndef OPENSSL_NO_SCTP
     807                 :            :                                 if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
     808                 :            :                                         {
     809                 :            :                                         s->d1->next_state = s->s3->tmp.next_state;
     810                 :            :                                         s->s3->tmp.next_state=DTLS1_SCTP_ST_SW_WRITE_SOCK;
     811                 :            :                                         }
     812                 :            : #endif
     813                 :            :                                 }
     814                 :          0 :                         s->init_num=0;
     815                 :          0 :                         break;
     816                 :            : 
     817                 :            :                 case SSL_ST_OK:
     818                 :            :                         /* clean a few things up */
     819                 :          0 :                         ssl3_cleanup_key_block(s);
     820                 :            : 
     821                 :            : #if 0
     822                 :            :                         BUF_MEM_free(s->init_buf);
     823                 :            :                         s->init_buf=NULL;
     824                 :            : #endif
     825                 :            : 
     826                 :            :                         /* remove buffering on output */
     827                 :          0 :                         ssl_free_wbio_buffer(s);
     828                 :            : 
     829                 :          0 :                         s->init_num=0;
     830                 :            : 
     831         [ #  # ]:          0 :                         if (s->renegotiate == 2) /* skipped if we just sent a HelloRequest */
     832                 :            :                                 {
     833                 :          0 :                                 s->renegotiate=0;
     834                 :          0 :                                 s->new_session=0;
     835                 :            :                                 
     836                 :          0 :                                 ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
     837                 :            :                                 
     838                 :          0 :                                 s->ctx->stats.sess_accept_good++;
     839                 :            :                                 /* s->server=1; */
     840                 :          0 :                                 s->handshake_func=dtls1_accept;
     841                 :            : 
     842         [ #  # ]:          0 :                                 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
     843                 :            :                                 }
     844                 :            :                         
     845                 :          0 :                         ret = 1;
     846                 :            : 
     847                 :            :                         /* done handshaking, next message is client hello */
     848                 :          0 :                         s->d1->handshake_read_seq = 0;
     849                 :            :                         /* next message is server hello */
     850                 :          0 :                         s->d1->handshake_write_seq = 0;
     851                 :          0 :                         s->d1->next_handshake_write_seq = 0;
     852                 :          0 :                         goto end;
     853                 :            :                         /* break; */
     854                 :            : 
     855                 :            :                 default:
     856                 :          0 :                         SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_UNKNOWN_STATE);
     857                 :          0 :                         ret= -1;
     858                 :          0 :                         goto end;
     859                 :            :                         /* break; */
     860                 :            :                         }
     861                 :            :                 
     862         [ #  # ]:          0 :                 if (!s->s3->tmp.reuse_message && !skip)
     863                 :            :                         {
     864         [ #  # ]:          0 :                         if (s->debug)
     865                 :            :                                 {
     866         [ #  # ]:          0 :                                 if ((ret=BIO_flush(s->wbio)) <= 0)
     867                 :            :                                         goto end;
     868                 :            :                                 }
     869                 :            : 
     870                 :            : 
     871 [ #  # ][ #  # ]:          0 :                         if ((cb != NULL) && (s->state != state))
     872                 :            :                                 {
     873                 :          0 :                                 new_state=s->state;
     874                 :          0 :                                 s->state=state;
     875                 :          0 :                                 cb(s,SSL_CB_ACCEPT_LOOP,1);
     876                 :          0 :                                 s->state=new_state;
     877                 :            :                                 }
     878                 :            :                         }
     879                 :            :                 skip=0;
     880                 :            :                 }
     881                 :            : end:
     882                 :            :         /* BIO_flush(s->wbio); */
     883                 :            : 
     884                 :          0 :         s->in_handshake--;
     885                 :            : #ifndef OPENSSL_NO_SCTP
     886                 :            :                 /* Notify SCTP BIO socket to leave handshake
     887                 :            :                  * mode and prevent stream identifier other
     888                 :            :                  * than 0. Will be ignored if no SCTP is used.
     889                 :            :                  */
     890                 :            :                 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE, s->in_handshake, NULL);
     891                 :            : #endif
     892                 :            : 
     893         [ #  # ]:          0 :         if (cb != NULL)
     894                 :          0 :                 cb(s,SSL_CB_ACCEPT_EXIT,ret);
     895                 :          0 :         return(ret);
     896                 :            :         }
     897                 :            : 
     898                 :          0 : int dtls1_send_hello_verify_request(SSL *s)
     899                 :            :         {
     900                 :            :         unsigned int msg_len;
     901                 :            :         unsigned char *msg, *buf, *p;
     902                 :            : 
     903         [ #  # ]:          0 :         if (s->state == DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A)
     904                 :            :                 {
     905                 :          0 :                 buf = (unsigned char *)s->init_buf->data;
     906                 :            : 
     907                 :          0 :                 msg = p = &(buf[DTLS1_HM_HEADER_LENGTH]);
     908                 :            :                 /* Always use DTLS 1.0 version: see RFC 6347 */
     909                 :          0 :                 *(p++) = DTLS1_VERSION >> 8;
     910                 :          0 :                 *(p++) = DTLS1_VERSION & 0xFF;
     911                 :            : 
     912   [ #  #  #  # ]:          0 :                 if (s->ctx->app_gen_cookie_cb == NULL ||
     913                 :          0 :                      s->ctx->app_gen_cookie_cb(s, s->d1->cookie,
     914                 :          0 :                          &(s->d1->cookie_len)) == 0)
     915                 :            :                         {
     916                 :          0 :                         SSLerr(SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST,ERR_R_INTERNAL_ERROR);
     917                 :          0 :                         return 0;
     918                 :            :                         }
     919                 :            : 
     920                 :          0 :                 *(p++) = (unsigned char) s->d1->cookie_len;
     921                 :          0 :                 memcpy(p, s->d1->cookie, s->d1->cookie_len);
     922                 :          0 :                 p += s->d1->cookie_len;
     923                 :          0 :                 msg_len = p - msg;
     924                 :            : 
     925                 :          0 :                 dtls1_set_message_header(s, buf,
     926                 :            :                         DTLS1_MT_HELLO_VERIFY_REQUEST, msg_len, 0, msg_len);
     927                 :            : 
     928                 :          0 :                 s->state=DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B;
     929                 :            :                 /* number of bytes to write */
     930                 :          0 :                 s->init_num=p-buf;
     931                 :          0 :                 s->init_off=0;
     932                 :            :                 }
     933                 :            : 
     934                 :            :         /* s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B */
     935                 :          0 :         return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
     936                 :            :         }

Generated by: LCOV version 1.9