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

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

Generated by: LCOV version 1.10