LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/ssl - s3_both.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 198 267 74.2 %
Date: 2014-08-02 Functions: 16 17 94.1 %
Branches: 94 178 52.8 %

           Branch data     Line data    Source code
       1                 :            : /* ssl/s3_both.c */
       2                 :            : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       3                 :            :  * All rights reserved.
       4                 :            :  *
       5                 :            :  * This package is an SSL implementation written
       6                 :            :  * by Eric Young (eay@cryptsoft.com).
       7                 :            :  * The implementation was written so as to conform with Netscapes SSL.
       8                 :            :  * 
       9                 :            :  * This library is free for commercial and non-commercial use as long as
      10                 :            :  * the following conditions are aheared to.  The following conditions
      11                 :            :  * apply to all code found in this distribution, be it the RC4, RSA,
      12                 :            :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      13                 :            :  * included with this distribution is covered by the same copyright terms
      14                 :            :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      15                 :            :  * 
      16                 :            :  * Copyright remains Eric Young's, and as such any Copyright notices in
      17                 :            :  * the code are not to be removed.
      18                 :            :  * If this package is used in a product, Eric Young should be given attribution
      19                 :            :  * as the author of the parts of the library used.
      20                 :            :  * This can be in the form of a textual message at program startup or
      21                 :            :  * in documentation (online or textual) provided with the package.
      22                 :            :  * 
      23                 :            :  * Redistribution and use in source and binary forms, with or without
      24                 :            :  * modification, are permitted provided that the following conditions
      25                 :            :  * are met:
      26                 :            :  * 1. Redistributions of source code must retain the copyright
      27                 :            :  *    notice, this list of conditions and the following disclaimer.
      28                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      29                 :            :  *    notice, this list of conditions and the following disclaimer in the
      30                 :            :  *    documentation and/or other materials provided with the distribution.
      31                 :            :  * 3. All advertising materials mentioning features or use of this software
      32                 :            :  *    must display the following acknowledgement:
      33                 :            :  *    "This product includes cryptographic software written by
      34                 :            :  *     Eric Young (eay@cryptsoft.com)"
      35                 :            :  *    The word 'cryptographic' can be left out if the rouines from the library
      36                 :            :  *    being used are not cryptographic related :-).
      37                 :            :  * 4. If you include any Windows specific code (or a derivative thereof) from 
      38                 :            :  *    the apps directory (application code) you must include an acknowledgement:
      39                 :            :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      40                 :            :  * 
      41                 :            :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      42                 :            :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      43                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      44                 :            :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      45                 :            :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      46                 :            :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      47                 :            :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      49                 :            :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      50                 :            :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      51                 :            :  * SUCH DAMAGE.
      52                 :            :  * 
      53                 :            :  * The licence and distribution terms for any publically available version or
      54                 :            :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
      55                 :            :  * copied and put under another distribution licence
      56                 :            :  * [including the GNU Public Licence.]
      57                 :            :  */
      58                 :            : /* ====================================================================
      59                 :            :  * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
      60                 :            :  *
      61                 :            :  * Redistribution and use in source and binary forms, with or without
      62                 :            :  * modification, are permitted provided that the following conditions
      63                 :            :  * are met:
      64                 :            :  *
      65                 :            :  * 1. Redistributions of source code must retain the above copyright
      66                 :            :  *    notice, this list of conditions and the following disclaimer. 
      67                 :            :  *
      68                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      69                 :            :  *    notice, this list of conditions and the following disclaimer in
      70                 :            :  *    the documentation and/or other materials provided with the
      71                 :            :  *    distribution.
      72                 :            :  *
      73                 :            :  * 3. All advertising materials mentioning features or use of this
      74                 :            :  *    software must display the following acknowledgment:
      75                 :            :  *    "This product includes software developed by the OpenSSL Project
      76                 :            :  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
      77                 :            :  *
      78                 :            :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      79                 :            :  *    endorse or promote products derived from this software without
      80                 :            :  *    prior written permission. For written permission, please contact
      81                 :            :  *    openssl-core@openssl.org.
      82                 :            :  *
      83                 :            :  * 5. Products derived from this software may not be called "OpenSSL"
      84                 :            :  *    nor may "OpenSSL" appear in their names without prior written
      85                 :            :  *    permission of the OpenSSL Project.
      86                 :            :  *
      87                 :            :  * 6. Redistributions of any form whatsoever must retain the following
      88                 :            :  *    acknowledgment:
      89                 :            :  *    "This product includes software developed by the OpenSSL Project
      90                 :            :  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
      91                 :            :  *
      92                 :            :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      93                 :            :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      94                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      95                 :            :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      96                 :            :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      97                 :            :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      98                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      99                 :            :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     100                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     101                 :            :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     102                 :            :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     103                 :            :  * OF THE POSSIBILITY OF SUCH DAMAGE.
     104                 :            :  * ====================================================================
     105                 :            :  *
     106                 :            :  * This product includes cryptographic software written by Eric Young
     107                 :            :  * (eay@cryptsoft.com).  This product includes software written by Tim
     108                 :            :  * Hudson (tjh@cryptsoft.com).
     109                 :            :  *
     110                 :            :  */
     111                 :            : /* ====================================================================
     112                 :            :  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
     113                 :            :  * ECC cipher suite support in OpenSSL originally developed by 
     114                 :            :  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
     115                 :            :  */
     116                 :            : 
     117                 :            : #include <limits.h>
     118                 :            : #include <string.h>
     119                 :            : #include <stdio.h>
     120                 :            : #include "ssl_locl.h"
     121                 :            : #include <openssl/buffer.h>
     122                 :            : #include <openssl/rand.h>
     123                 :            : #include <openssl/objects.h>
     124                 :            : #include <openssl/evp.h>
     125                 :            : #include <openssl/x509.h>
     126                 :            : 
     127                 :            : /* send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC) */
     128                 :      13999 : int ssl3_do_write(SSL *s, int type)
     129                 :            :         {
     130                 :            :         int ret;
     131                 :            : 
     132                 :      13999 :         ret=ssl3_write_bytes(s,type,&s->init_buf->data[s->init_off],
     133                 :            :                              s->init_num);
     134         [ +  + ]:      13999 :         if (ret < 0) return(-1);
     135         [ +  + ]:      11161 :         if (type == SSL3_RT_HANDSHAKE)
     136                 :            :                 /* should not be done for 'Hello Request's, but in that case
     137                 :            :                  * we'll ignore the result anyway */
     138                 :       9001 :                 ssl3_finish_mac(s,(unsigned char *)&s->init_buf->data[s->init_off],ret);
     139                 :            :         
     140         [ +  - ]:      11161 :         if (ret == s->init_num)
     141                 :            :                 {
     142         [ -  + ]:      11161 :                 if (s->msg_callback)
     143                 :          0 :                         s->msg_callback(1, s->version, type, s->init_buf->data, (size_t)(s->init_off + s->init_num), s, s->msg_callback_arg);
     144                 :            :                 return(1);
     145                 :            :                 }
     146                 :          0 :         s->init_off+=ret;
     147                 :          0 :         s->init_num-=ret;
     148                 :          0 :         return(0);
     149                 :            :         }
     150                 :            : 
     151                 :       2160 : int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
     152                 :            :         {
     153                 :            :         unsigned char *p;
     154                 :            :         int i;
     155                 :            :         unsigned long l;
     156                 :            : 
     157         [ +  - ]:       2160 :         if (s->state == a)
     158                 :            :                 {
     159                 :       2160 :                 p = ssl_handshake_start(s);
     160                 :            : 
     161                 :       2160 :                 i=s->method->ssl3_enc->final_finish_mac(s,
     162                 :       2160 :                         sender,slen,s->s3->tmp.finish_md);
     163         [ +  - ]:       2160 :                 if (i == 0)
     164                 :            :                         return 0;
     165                 :       2160 :                 s->s3->tmp.finish_md_len = i;
     166                 :       2160 :                 memcpy(p, s->s3->tmp.finish_md, i);
     167                 :       2160 :                 l=i;
     168                 :            : 
     169                 :            :                 /* Copy the finished so we can use it for
     170                 :            :                    renegotiation checks */
     171         [ +  + ]:       2160 :                 if(s->type == SSL_ST_CONNECT)
     172                 :            :                         {
     173         [ -  + ]:       1080 :                          OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
     174                 :       1080 :                          memcpy(s->s3->previous_client_finished, 
     175                 :       1080 :                              s->s3->tmp.finish_md, i);
     176                 :       1080 :                          s->s3->previous_client_finished_len=i;
     177                 :            :                         }
     178                 :            :                 else
     179                 :            :                         {
     180         [ -  + ]:       1080 :                         OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
     181                 :       1080 :                         memcpy(s->s3->previous_server_finished, 
     182                 :       1080 :                             s->s3->tmp.finish_md, i);
     183                 :       1080 :                         s->s3->previous_server_finished_len=i;
     184                 :            :                         }
     185                 :            : 
     186                 :            : #ifdef OPENSSL_SYS_WIN16
     187                 :            :                 /* MSVC 1.5 does not clear the top bytes of the word unless
     188                 :            :                  * I do this.
     189                 :            :                  */
     190                 :            :                 l&=0xffff;
     191                 :            : #endif
     192                 :       2160 :                 ssl_set_handshake_header(s, SSL3_MT_FINISHED, l);
     193                 :       2160 :                 s->state=b;
     194                 :            :                 }
     195                 :            : 
     196                 :            :         /* SSL3_ST_SEND_xxxxxx_HELLO_B */
     197                 :       2160 :         return ssl_do_write(s);
     198                 :            :         }
     199                 :            : 
     200                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
     201                 :            : /* ssl3_take_mac calculates the Finished MAC for the handshakes messages seen to far. */
     202                 :       2160 : static void ssl3_take_mac(SSL *s)
     203                 :            :         {
     204                 :            :         const char *sender;
     205                 :            :         int slen;
     206                 :            :         /* If no new cipher setup return immediately: other functions will
     207                 :            :          * set the appropriate error.
     208                 :            :          */
     209         [ +  - ]:       2160 :         if (s->s3->tmp.new_cipher == NULL)
     210                 :       2160 :                 return;
     211         [ +  + ]:       2160 :         if (s->state & SSL_ST_CONNECT)
     212                 :            :                 {
     213                 :       1080 :                 sender=s->method->ssl3_enc->server_finished_label;
     214                 :       1080 :                 slen=s->method->ssl3_enc->server_finished_label_len;
     215                 :            :                 }
     216                 :            :         else
     217                 :            :                 {
     218                 :       1080 :                 sender=s->method->ssl3_enc->client_finished_label;
     219                 :       1080 :                 slen=s->method->ssl3_enc->client_finished_label_len;
     220                 :            :                 }
     221                 :            : 
     222                 :       2160 :         s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
     223                 :       2160 :                 sender,slen,s->s3->tmp.peer_finish_md);
     224                 :            :         }
     225                 :            : #endif
     226                 :            : 
     227                 :       4725 : int ssl3_get_finished(SSL *s, int a, int b)
     228                 :            :         {
     229                 :            :         int al,i,ok;
     230                 :            :         long n;
     231                 :            :         unsigned char *p;
     232                 :            : 
     233                 :            : #ifdef OPENSSL_NO_NEXTPROTONEG
     234                 :            :         /* the mac has already been generated when we received the
     235                 :            :          * change cipher spec message and is in s->s3->tmp.peer_finish_md
     236                 :            :          */ 
     237                 :            : #endif
     238                 :            : 
     239                 :       4725 :         n=s->method->ssl_get_message(s,
     240                 :            :                 a,
     241                 :            :                 b,
     242                 :            :                 SSL3_MT_FINISHED,
     243                 :            :                 64, /* should actually be 36+4 :-) */
     244                 :            :                 &ok);
     245                 :            : 
     246         [ +  + ]:       4725 :         if (!ok) return((int)n);
     247                 :            : 
     248                 :            :         /* If this occurs, we have missed a message */
     249         [ -  + ]:       2160 :         if (!s->s3->change_cipher_spec)
     250                 :            :                 {
     251                 :          0 :                 al=SSL_AD_UNEXPECTED_MESSAGE;
     252                 :          0 :                 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_GOT_A_FIN_BEFORE_A_CCS);
     253                 :          0 :                 goto f_err;
     254                 :            :                 }
     255                 :       2160 :         s->s3->change_cipher_spec=0;
     256                 :            : 
     257                 :       2160 :         p = (unsigned char *)s->init_msg;
     258                 :       2160 :         i = s->s3->tmp.peer_finish_md_len;
     259                 :            : 
     260         [ -  + ]:       2160 :         if (i != n)
     261                 :            :                 {
     262                 :          0 :                 al=SSL_AD_DECODE_ERROR;
     263                 :          0 :                 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_BAD_DIGEST_LENGTH);
     264                 :          0 :                 goto f_err;
     265                 :            :                 }
     266                 :            : 
     267         [ -  + ]:       2160 :         if (CRYPTO_memcmp(p, s->s3->tmp.peer_finish_md, i) != 0)
     268                 :            :                 {
     269                 :          0 :                 al=SSL_AD_DECRYPT_ERROR;
     270                 :          0 :                 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED);
     271                 :          0 :                 goto f_err;
     272                 :            :                 }
     273                 :            : 
     274                 :            :         /* Copy the finished so we can use it for
     275                 :            :            renegotiation checks */
     276         [ +  + ]:       2160 :         if(s->type == SSL_ST_ACCEPT)
     277                 :            :                 {
     278         [ -  + ]:       1080 :                 OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
     279                 :       1080 :                 memcpy(s->s3->previous_client_finished, 
     280                 :       1080 :                     s->s3->tmp.peer_finish_md, i);
     281                 :       1080 :                 s->s3->previous_client_finished_len=i;
     282                 :            :                 }
     283                 :            :         else
     284                 :            :                 {
     285         [ -  + ]:       1080 :                 OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
     286                 :       1080 :                 memcpy(s->s3->previous_server_finished, 
     287                 :       1080 :                     s->s3->tmp.peer_finish_md, i);
     288                 :       1080 :                 s->s3->previous_server_finished_len=i;
     289                 :            :                 }
     290                 :            : 
     291                 :            :         return(1);
     292                 :            : f_err:
     293                 :          0 :         ssl3_send_alert(s,SSL3_AL_FATAL,al);
     294                 :          0 :         return(0);
     295                 :            :         }
     296                 :            : 
     297                 :            : /* for these 2 messages, we need to
     298                 :            :  * ssl->enc_read_ctx                 re-init
     299                 :            :  * ssl->s3->read_sequence         zero
     300                 :            :  * ssl->s3->read_mac_secret               re-init
     301                 :            :  * ssl->session->read_sym_enc             assign
     302                 :            :  * ssl->session->read_compression assign
     303                 :            :  * ssl->session->read_hash                assign
     304                 :            :  */
     305                 :       2160 : int ssl3_send_change_cipher_spec(SSL *s, int a, int b)
     306                 :            :         { 
     307                 :            :         unsigned char *p;
     308                 :            : 
     309         [ +  - ]:       2160 :         if (s->state == a)
     310                 :            :                 {
     311                 :       2160 :                 p=(unsigned char *)s->init_buf->data;
     312                 :       2160 :                 *p=SSL3_MT_CCS;
     313                 :       2160 :                 s->init_num=1;
     314                 :       2160 :                 s->init_off=0;
     315                 :            : 
     316                 :       2160 :                 s->state=b;
     317                 :            :                 }
     318                 :            : 
     319                 :            :         /* SSL3_ST_CW_CHANGE_B */
     320                 :       2160 :         return(ssl3_do_write(s,SSL3_RT_CHANGE_CIPHER_SPEC));
     321                 :            :         }
     322                 :            : 
     323                 :       1036 : unsigned long ssl3_output_cert_chain(SSL *s, CERT_PKEY *cpk)
     324                 :            :         {
     325                 :            :         unsigned char *p;
     326                 :       1036 :         unsigned long l = 3 + SSL_HM_HEADER_LENGTH(s);
     327                 :            : 
     328         [ +  - ]:       1036 :         if (!ssl_add_cert_chain(s, cpk, &l))
     329                 :            :                 return 0;
     330                 :            : 
     331                 :       1036 :         l -= 3 + SSL_HM_HEADER_LENGTH(s);
     332                 :       1036 :         p = ssl_handshake_start(s);
     333                 :       1036 :         l2n3(l,p);
     334                 :       1036 :         l += 3;
     335                 :       1036 :         ssl_set_handshake_header(s, SSL3_MT_CERTIFICATE, l);
     336                 :       1036 :         return l + SSL_HM_HEADER_LENGTH(s);
     337                 :            :         }
     338                 :            : 
     339                 :            : /* Obtain handshake message of message type 'mt' (any if mt == -1),
     340                 :            :  * maximum acceptable body length 'max'.
     341                 :            :  * The first four bytes (msg_type and length) are read in state 'st1',
     342                 :            :  * the body is read in state 'stn'.
     343                 :            :  */
     344                 :      67799 : long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
     345                 :            :         {
     346                 :            :         unsigned char *p;
     347                 :            :         unsigned long l;
     348                 :            :         long n;
     349                 :            :         int i,al;
     350                 :            : 
     351         [ +  + ]:      67799 :         if (s->s3->tmp.reuse_message)
     352                 :            :                 {
     353                 :       3352 :                 s->s3->tmp.reuse_message=0;
     354 [ +  + ][ -  + ]:       3352 :                 if ((mt >= 0) && (s->s3->tmp.message_type != mt))
     355                 :            :                         {
     356                 :          0 :                         al=SSL_AD_UNEXPECTED_MESSAGE;
     357                 :          0 :                         SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
     358                 :          0 :                         goto f_err;
     359                 :            :                         }
     360                 :       3352 :                 *ok=1;
     361                 :       3352 :                 s->init_msg = s->init_buf->data + 4;
     362                 :       3352 :                 s->init_num = (int)s->s3->tmp.message_size;
     363                 :       3352 :                 return s->init_num;
     364                 :            :                 }
     365                 :            : 
     366                 :      64447 :         p=(unsigned char *)s->init_buf->data;
     367                 :            : 
     368         [ +  - ]:      64447 :         if (s->state == st1) /* s->init_num < 4 */
     369                 :            :                 {
     370                 :            :                 int skip_message;
     371                 :            : 
     372                 :            :                 do
     373                 :            :                         {
     374         [ +  + ]:      73747 :                         while (s->init_num < 4)
     375                 :            :                                 {
     376                 :      64447 :                                 i=s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE,
     377                 :            :                                         &p[s->init_num],4 - s->init_num, 0);
     378         [ +  + ]:      64447 :                                 if (i <= 0)
     379                 :            :                                         {
     380                 :      55147 :                                         s->rwstate=SSL_READING;
     381                 :      55147 :                                         *ok = 0;
     382                 :      55147 :                                         return i;
     383                 :            :                                         }
     384                 :       9300 :                                 s->init_num+=i;
     385                 :            :                                 }
     386                 :            :                         
     387                 :       9300 :                         skip_message = 0;
     388         [ +  + ]:       9300 :                         if (!s->server)
     389         [ -  + ]:       5818 :                                 if (p[0] == SSL3_MT_HELLO_REQUEST)
     390                 :            :                                         /* The server may always send 'Hello Request' messages --
     391                 :            :                                          * we are doing a handshake anyway now, so ignore them
     392                 :            :                                          * if their format is correct. Does not count for
     393                 :            :                                          * 'Finished' MAC. */
     394 [ #  # ][ #  # ]:          0 :                                         if (p[1] == 0 && p[2] == 0 &&p[3] == 0)
                 [ #  # ]
     395                 :            :                                                 {
     396                 :          0 :                                                 s->init_num = 0;
     397                 :          0 :                                                 skip_message = 1;
     398                 :            : 
     399         [ #  # ]:          0 :                                                 if (s->msg_callback)
     400                 :          0 :                                                         s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, p, 4, s, s->msg_callback_arg);
     401                 :            :                                                 }
     402                 :            :                         }
     403         [ -  + ]:       9300 :                 while (skip_message);
     404                 :            : 
     405                 :            :                 /* s->init_num == 4 */
     406                 :            : 
     407 [ +  + ][ -  + ]:       9300 :                 if ((mt >= 0) && (*p != mt))
     408                 :            :                         {
     409                 :          0 :                         al=SSL_AD_UNEXPECTED_MESSAGE;
     410                 :          0 :                         SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
     411                 :          0 :                         goto f_err;
     412                 :            :                         }
     413 [ +  + ][ -  + ]:       9300 :                 if ((mt < 0) && (*p == SSL3_MT_CLIENT_HELLO) &&
     414         [ #  # ]:          0 :                                         (st1 == SSL3_ST_SR_CERT_A) &&
     415                 :          0 :                                         (stn == SSL3_ST_SR_CERT_B))
     416                 :            :                         {
     417                 :            :                         /* At this point we have got an MS SGC second client
     418                 :            :                          * hello (maybe we should always allow the client to
     419                 :            :                          * start a new handshake?). We need to restart the mac.
     420                 :            :                          * Don't increment {num,total}_renegotiations because
     421                 :            :                          * we have not completed the handshake. */
     422                 :          0 :                         ssl3_init_finished_mac(s);
     423                 :            :                         }
     424                 :            : 
     425                 :       9300 :                 s->s3->tmp.message_type= *(p++);
     426                 :            : 
     427                 :       9300 :                 n2l3(p,l);
     428         [ -  + ]:       9300 :                 if (l > (unsigned long)max)
     429                 :            :                         {
     430                 :          0 :                         al=SSL_AD_ILLEGAL_PARAMETER;
     431                 :          0 :                         SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE);
     432                 :          0 :                         goto f_err;
     433                 :            :                         }
     434         [ -  + ]:       9300 :                 if (l > (INT_MAX-4)) /* BUF_MEM_grow takes an 'int' parameter */
     435                 :            :                         {
     436                 :          0 :                         al=SSL_AD_ILLEGAL_PARAMETER;
     437                 :          0 :                         SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE);
     438                 :          0 :                         goto f_err;
     439                 :            :                         }
     440 [ +  + ][ -  + ]:       9300 :                 if (l && !BUF_MEM_grow_clean(s->init_buf,(int)l+4))
     441                 :            :                         {
     442                 :          0 :                         SSLerr(SSL_F_SSL3_GET_MESSAGE,ERR_R_BUF_LIB);
     443                 :          0 :                         goto err;
     444                 :            :                         }
     445                 :       9300 :                 s->s3->tmp.message_size=l;
     446                 :       9300 :                 s->state=stn;
     447                 :            : 
     448                 :       9300 :                 s->init_msg = s->init_buf->data + 4;
     449                 :       9300 :                 s->init_num = 0;
     450                 :            :                 }
     451                 :            : 
     452                 :            :         /* next state (stn) */
     453                 :       9300 :         p = s->init_msg;
     454                 :       9300 :         n = s->s3->tmp.message_size - s->init_num;
     455         [ +  + ]:      17531 :         while (n > 0)
     456                 :            :                 {
     457                 :       8231 :                 i=s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n,0);
     458         [ -  + ]:       8231 :                 if (i <= 0)
     459                 :            :                         {
     460                 :          0 :                         s->rwstate=SSL_READING;
     461                 :          0 :                         *ok = 0;
     462                 :          0 :                         return i;
     463                 :            :                         }
     464                 :       8231 :                 s->init_num += i;
     465                 :       8231 :                 n -= i;
     466                 :            :                 }
     467                 :            : 
     468                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
     469                 :            :         /* If receiving Finished, record MAC of prior handshake messages for
     470                 :            :          * Finished verification. */
     471         [ +  + ]:       9300 :         if (*s->init_buf->data == SSL3_MT_FINISHED)
     472                 :       2160 :                 ssl3_take_mac(s);
     473                 :            : #endif
     474                 :            : 
     475                 :            :         /* Feed this message into MAC computation. */
     476                 :       9300 :         ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, s->init_num + 4);
     477         [ -  + ]:       9300 :         if (s->msg_callback)
     478                 :          0 :                 s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data, (size_t)s->init_num + 4, s, s->msg_callback_arg);
     479                 :       9300 :         *ok=1;
     480                 :       9300 :         return s->init_num;
     481                 :            : f_err:
     482                 :          0 :         ssl3_send_alert(s,SSL3_AL_FATAL,al);
     483                 :            : err:
     484                 :          0 :         *ok=0;
     485                 :          0 :         return(-1);
     486                 :            :         }
     487                 :            : 
     488                 :       3009 : int ssl_cert_type(X509 *x, EVP_PKEY *pkey)
     489                 :            :         {
     490                 :            :         EVP_PKEY *pk;
     491                 :       3009 :         int ret= -1,i;
     492                 :            : 
     493         [ -  + ]:       3009 :         if (pkey == NULL)
     494                 :          0 :                 pk=X509_get_pubkey(x);
     495                 :            :         else
     496                 :            :                 pk=pkey;
     497         [ +  - ]:       3009 :         if (pk == NULL) goto err;
     498                 :            : 
     499                 :       3009 :         i=pk->type;
     500         [ -  + ]:       3009 :         if (i == EVP_PKEY_RSA)
     501                 :            :                 {
     502                 :            :                 ret=SSL_PKEY_RSA_ENC;
     503                 :            :                 }
     504         [ #  # ]:          0 :         else if (i == EVP_PKEY_DSA)
     505                 :            :                 {
     506                 :            :                 ret=SSL_PKEY_DSA_SIGN;
     507                 :            :                 }
     508                 :            : #ifndef OPENSSL_NO_EC
     509         [ #  # ]:          0 :         else if (i == EVP_PKEY_EC)
     510                 :            :                 {
     511                 :            :                 ret = SSL_PKEY_ECC;
     512                 :            :                 }       
     513                 :            : #endif
     514         [ #  # ]:          0 :         else if (i == NID_id_GostR3410_94 || i == NID_id_GostR3410_94_cc) 
     515                 :            :                 {
     516                 :            :                 ret = SSL_PKEY_GOST94;
     517                 :            :                 }
     518         [ #  # ]:          0 :         else if (i == NID_id_GostR3410_2001 || i == NID_id_GostR3410_2001_cc) 
     519                 :            :                 {
     520                 :            :                 ret = SSL_PKEY_GOST01;
     521                 :            :                 }
     522 [ #  # ][ #  # ]:          0 :         else if (x && (i == EVP_PKEY_DH || i == EVP_PKEY_DHX))
     523                 :            :                 {
     524                 :            :                 /* For DH two cases: DH certificate signed with RSA and
     525                 :            :                  * DH certificate signed with DSA.
     526                 :            :                  */
     527                 :          0 :                 i = X509_certificate_type(x, pk);
     528         [ #  # ]:          0 :                 if (i & EVP_PKS_RSA)
     529                 :            :                         ret = SSL_PKEY_DH_RSA;
     530         [ #  # ]:          0 :                 else if (i & EVP_PKS_DSA)
     531                 :          0 :                         ret = SSL_PKEY_DH_DSA;
     532                 :            :                 }
     533                 :            :                 
     534                 :            : err:
     535         [ -  + ]:       3009 :         if(!pkey) EVP_PKEY_free(pk);
     536                 :       3009 :         return(ret);
     537                 :            :         }
     538                 :            : 
     539                 :          0 : int ssl_verify_alarm_type(long type)
     540                 :            :         {
     541                 :            :         int al;
     542                 :            : 
     543         [ #  # ]:          0 :         switch(type)
     544                 :            :                 {
     545                 :            :         case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
     546                 :            :         case X509_V_ERR_UNABLE_TO_GET_CRL:
     547                 :            :         case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
     548                 :            :                 al=SSL_AD_UNKNOWN_CA;
     549                 :            :                 break;
     550                 :            :         case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
     551                 :            :         case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
     552                 :            :         case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
     553                 :            :         case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
     554                 :            :         case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
     555                 :            :         case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
     556                 :            :         case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
     557                 :            :         case X509_V_ERR_CERT_NOT_YET_VALID:
     558                 :            :         case X509_V_ERR_CRL_NOT_YET_VALID:
     559                 :            :         case X509_V_ERR_CERT_UNTRUSTED:
     560                 :            :         case X509_V_ERR_CERT_REJECTED:
     561                 :            :                 al=SSL_AD_BAD_CERTIFICATE;
     562                 :            :                 break;
     563                 :            :         case X509_V_ERR_CERT_SIGNATURE_FAILURE:
     564                 :            :         case X509_V_ERR_CRL_SIGNATURE_FAILURE:
     565                 :            :                 al=SSL_AD_DECRYPT_ERROR;
     566                 :            :                 break;
     567                 :            :         case X509_V_ERR_CERT_HAS_EXPIRED:
     568                 :            :         case X509_V_ERR_CRL_HAS_EXPIRED:
     569                 :            :                 al=SSL_AD_CERTIFICATE_EXPIRED;
     570                 :            :                 break;
     571                 :            :         case X509_V_ERR_CERT_REVOKED:
     572                 :            :                 al=SSL_AD_CERTIFICATE_REVOKED;
     573                 :            :                 break;
     574                 :            :         case X509_V_ERR_OUT_OF_MEM:
     575                 :            :                 al=SSL_AD_INTERNAL_ERROR;
     576                 :            :                 break;
     577                 :            :         case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
     578                 :            :         case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
     579                 :            :         case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
     580                 :            :         case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
     581                 :            :         case X509_V_ERR_CERT_CHAIN_TOO_LONG:
     582                 :            :         case X509_V_ERR_PATH_LENGTH_EXCEEDED:
     583                 :            :         case X509_V_ERR_INVALID_CA:
     584                 :            :                 al=SSL_AD_UNKNOWN_CA;
     585                 :            :                 break;
     586                 :            :         case X509_V_ERR_APPLICATION_VERIFICATION:
     587                 :            :                 al=SSL_AD_HANDSHAKE_FAILURE;
     588                 :            :                 break;
     589                 :            :         case X509_V_ERR_INVALID_PURPOSE:
     590                 :            :                 al=SSL_AD_UNSUPPORTED_CERTIFICATE;
     591                 :            :                 break;
     592                 :            :         default:
     593                 :            :                 al=SSL_AD_CERTIFICATE_UNKNOWN;
     594                 :            :                 break;
     595                 :            :                 }
     596                 :          0 :         return(al);
     597                 :            :         }
     598                 :            : 
     599                 :            : #ifndef OPENSSL_NO_BUF_FREELISTS
     600                 :            : /* On some platforms, malloc() performance is bad enough that you can't just
     601                 :            :  * free() and malloc() buffers all the time, so we need to use freelists from
     602                 :            :  * unused buffers.  Currently, each freelist holds memory chunks of only a
     603                 :            :  * given size (list->chunklen); other sized chunks are freed and malloced.
     604                 :            :  * This doesn't help much if you're using many different SSL option settings
     605                 :            :  * with a given context.  (The options affecting buffer size are
     606                 :            :  * max_send_fragment, read buffer vs write buffer,
     607                 :            :  * SSL_OP_MICROSOFT_BIG_WRITE_BUFFER, SSL_OP_NO_COMPRESSION, and
     608                 :            :  * SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS.)  Using a separate freelist for every
     609                 :            :  * possible size is not an option, since max_send_fragment can take on many
     610                 :            :  * different values.
     611                 :            :  *
     612                 :            :  * If you are on a platform with a slow malloc(), and you're using SSL
     613                 :            :  * connections with many different settings for these options, and you need to
     614                 :            :  * use the SSL_MOD_RELEASE_BUFFERS feature, you have a few options:
     615                 :            :  *    - Link against a faster malloc implementation.
     616                 :            :  *    - Use a separate SSL_CTX for each option set.
     617                 :            :  *    - Improve this code.
     618                 :            :  */
     619                 :            : static void *
     620                 :       6088 : freelist_extract(SSL_CTX *ctx, int for_read, int sz)
     621                 :            :         {
     622                 :            :         SSL3_BUF_FREELIST *list;
     623                 :       3044 :         SSL3_BUF_FREELIST_ENTRY *ent = NULL;
     624                 :       3044 :         void *result = NULL;
     625                 :            : 
     626                 :       3044 :         CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
     627         [ +  + ]:       3044 :         list = for_read ? ctx->rbuf_freelist : ctx->wbuf_freelist;
     628 [ +  - ][ -  + ]:       3044 :         if (list != NULL && sz == (int)list->chunklen)
     629                 :          0 :                 ent = list->head;
     630         [ -  + ]:       3044 :         if (ent != NULL)
     631                 :            :                 {
     632                 :          0 :                 list->head = ent->next;
     633                 :          0 :                 result = ent;
     634         [ #  # ]:          0 :                 if (--list->len == 0)
     635                 :          0 :                         list->chunklen = 0;
     636                 :            :                 }
     637                 :       3044 :         CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
     638         [ +  - ]:       3044 :         if (!result)
     639                 :       3044 :                 result = OPENSSL_malloc(sz);
     640                 :       3044 :         return result;
     641                 :            : }
     642                 :            : 
     643                 :            : static void
     644                 :       3044 : freelist_insert(SSL_CTX *ctx, int for_read, size_t sz, void *mem)
     645                 :            :         {
     646                 :            :         SSL3_BUF_FREELIST *list;
     647                 :            :         SSL3_BUF_FREELIST_ENTRY *ent;
     648                 :            : 
     649                 :       3044 :         CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
     650         [ +  + ]:       3044 :         list = for_read ? ctx->rbuf_freelist : ctx->wbuf_freelist;
     651 [ +  - ][ +  - ]:       3044 :         if (list != NULL &&
     652 [ +  - ][ +  - ]:       3044 :             (sz == list->chunklen || list->chunklen == 0) &&
     653         [ +  - ]:       3044 :             list->len < ctx->freelist_max_len &&
     654                 :            :             sz >= sizeof(*ent))
     655                 :            :                 {
     656                 :       3044 :                 list->chunklen = sz;
     657                 :       3044 :                 ent = mem;
     658                 :       3044 :                 ent->next = list->head;
     659                 :       3044 :                 list->head = ent;
     660                 :       3044 :                 ++list->len;
     661                 :       3044 :                 mem = NULL;
     662                 :            :                 }
     663                 :            : 
     664                 :       3044 :         CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
     665         [ -  + ]:       3044 :         if (mem)
     666                 :          0 :                 OPENSSL_free(mem);
     667                 :       3044 :         }
     668                 :            : #else
     669                 :            : #define freelist_extract(c,fr,sz) OPENSSL_malloc(sz)
     670                 :            : #define freelist_insert(c,fr,sz,m) OPENSSL_free(m)
     671                 :            : #endif
     672                 :            : 
     673                 :       2655 : int ssl3_setup_read_buffer(SSL *s)
     674                 :            :         {
     675                 :            :         unsigned char *p;
     676                 :       2655 :         size_t len,align=0,headerlen;
     677                 :            :         
     678 [ +  - ][ -  + ]:       2655 :         if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER)
     679                 :            :                 headerlen = DTLS1_RT_HEADER_LENGTH;
     680                 :            :         else
     681                 :            :                 headerlen = SSL3_RT_HEADER_LENGTH;
     682                 :            : 
     683                 :            : #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
     684                 :       2655 :         align = (-SSL3_RT_HEADER_LENGTH)&(SSL3_ALIGN_PAYLOAD-1);
     685                 :            : #endif
     686                 :            : 
     687         [ +  + ]:       2655 :         if (s->s3->rbuf.buf == NULL)
     688                 :            :                 {
     689                 :       1522 :                 len = SSL3_RT_MAX_PLAIN_LENGTH
     690                 :            :                         + SSL3_RT_MAX_ENCRYPTED_OVERHEAD
     691                 :            :                         + headerlen + align;
     692         [ -  + ]:       1522 :                 if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER)
     693                 :            :                         {
     694                 :          0 :                         s->s3->init_extra = 1;
     695                 :          0 :                         len += SSL3_RT_MAX_EXTRA;
     696                 :            :                         }
     697                 :            : #ifndef OPENSSL_NO_COMP
     698         [ +  - ]:       1522 :                 if (ssl_allow_compression(s))
     699                 :       1522 :                         len += SSL3_RT_MAX_COMPRESSED_OVERHEAD;
     700                 :            : #endif
     701         [ +  - ]:       1522 :                 if ((p=freelist_extract(s->ctx, 1, len)) == NULL)
     702                 :            :                         goto err;
     703                 :       1522 :                 s->s3->rbuf.buf = p;
     704                 :       1522 :                 s->s3->rbuf.len = len;
     705                 :            :                 }
     706                 :            : 
     707                 :       2655 :         s->packet= &(s->s3->rbuf.buf[0]);
     708                 :       2655 :         return 1;
     709                 :            : 
     710                 :            : err:
     711                 :          0 :         SSLerr(SSL_F_SSL3_SETUP_READ_BUFFER,ERR_R_MALLOC_FAILURE);
     712                 :          0 :         return 0;
     713                 :            :         }
     714                 :            : 
     715                 :       2424 : int ssl3_setup_write_buffer(SSL *s)
     716                 :            :         {
     717                 :            :         unsigned char *p;
     718                 :       2424 :         size_t len,align=0,headerlen;
     719                 :            : 
     720 [ +  - ][ -  + ]:       2424 :         if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER)
     721                 :            :                 headerlen = DTLS1_RT_HEADER_LENGTH + 1;
     722                 :            :         else
     723                 :            :                 headerlen = SSL3_RT_HEADER_LENGTH;
     724                 :            : 
     725                 :            : #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
     726                 :       2424 :         align = (-SSL3_RT_HEADER_LENGTH)&(SSL3_ALIGN_PAYLOAD-1);
     727                 :            : #endif
     728                 :            : 
     729         [ +  + ]:       2424 :         if (s->s3->wbuf.buf == NULL)
     730                 :            :                 {
     731                 :       3044 :                 len = s->max_send_fragment
     732                 :       1522 :                         + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD
     733                 :       1522 :                         + headerlen + align;
     734                 :            : #ifndef OPENSSL_NO_COMP
     735         [ +  - ]:       1522 :                 if (ssl_allow_compression(s))
     736                 :       1522 :                         len += SSL3_RT_MAX_COMPRESSED_OVERHEAD;
     737                 :            : #endif
     738         [ +  - ]:       1522 :                 if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS))
     739                 :       1522 :                         len += headerlen + align
     740                 :            :                                 + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD;
     741                 :            : 
     742         [ +  - ]:       1522 :                 if ((p=freelist_extract(s->ctx, 0, len)) == NULL)
     743                 :            :                         goto err;
     744                 :       1522 :                 s->s3->wbuf.buf = p;
     745                 :       1522 :                 s->s3->wbuf.len = len;
     746                 :            :                 }
     747                 :            : 
     748                 :            :         return 1;
     749                 :            : 
     750                 :            : err:
     751                 :          0 :         SSLerr(SSL_F_SSL3_SETUP_WRITE_BUFFER,ERR_R_MALLOC_FAILURE);
     752                 :          0 :         return 0;
     753                 :            :         }
     754                 :            : 
     755                 :            : 
     756                 :       2424 : int ssl3_setup_buffers(SSL *s)
     757                 :            :         {
     758         [ +  - ]:       2424 :         if (!ssl3_setup_read_buffer(s))
     759                 :            :                 return 0;
     760         [ +  - ]:       2424 :         if (!ssl3_setup_write_buffer(s))
     761                 :            :                 return 0;
     762                 :       2424 :         return 1;
     763                 :            :         }
     764                 :            : 
     765                 :       1522 : int ssl3_release_write_buffer(SSL *s)
     766                 :            :         {
     767         [ +  - ]:       1522 :         if (s->s3->wbuf.buf != NULL)
     768                 :            :                 {
     769                 :       1522 :                 freelist_insert(s->ctx, 0, s->s3->wbuf.len, s->s3->wbuf.buf);
     770                 :       1522 :                 s->s3->wbuf.buf = NULL;
     771                 :            :                 }
     772                 :       1522 :         return 1;
     773                 :            :         }
     774                 :            : 
     775                 :       1522 : int ssl3_release_read_buffer(SSL *s)
     776                 :            :         {
     777         [ +  - ]:       1522 :         if (s->s3->rbuf.buf != NULL)
     778                 :            :                 {
     779                 :       1522 :                 freelist_insert(s->ctx, 1, s->s3->rbuf.len, s->s3->rbuf.buf);
     780                 :       1522 :                 s->s3->rbuf.buf = NULL;
     781                 :            :                 }
     782                 :       1522 :         return 1;
     783                 :            :         }
     784                 :            : 
     785                 :       5193 : int ssl_allow_compression(SSL *s)
     786                 :            :         {
     787         [ +  - ]:       5193 :         if (s->options & SSL_OP_NO_COMPRESSION)
     788                 :            :                 return 0;
     789                 :       5193 :         return ssl_security(s, SSL_SECOP_COMPRESSION, 0, 0, NULL);
     790                 :            :         }
     791                 :            : 

Generated by: LCOV version 1.9