LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/ssl - t1_enc.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 310 414 74.9 %
Date: 2014-08-02 Functions: 11 12 91.7 %
Branches: 187 342 54.7 %

           Branch data     Line data    Source code
       1                 :            : /* ssl/t1_enc.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-2007 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 2005 Nokia. All rights reserved.
     113                 :            :  *
     114                 :            :  * The portions of the attached software ("Contribution") is developed by
     115                 :            :  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
     116                 :            :  * license.
     117                 :            :  *
     118                 :            :  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
     119                 :            :  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
     120                 :            :  * support (see RFC 4279) to OpenSSL.
     121                 :            :  *
     122                 :            :  * No patent licenses or other rights except those expressly stated in
     123                 :            :  * the OpenSSL open source license shall be deemed granted or received
     124                 :            :  * expressly, by implication, estoppel, or otherwise.
     125                 :            :  *
     126                 :            :  * No assurances are provided by Nokia that the Contribution does not
     127                 :            :  * infringe the patent or other intellectual property rights of any third
     128                 :            :  * party or that the license provides you with all the necessary rights
     129                 :            :  * to make use of the Contribution.
     130                 :            :  *
     131                 :            :  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
     132                 :            :  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
     133                 :            :  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
     134                 :            :  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
     135                 :            :  * OTHERWISE.
     136                 :            :  */
     137                 :            : 
     138                 :            : #include <stdio.h>
     139                 :            : #include "ssl_locl.h"
     140                 :            : #ifndef OPENSSL_NO_COMP
     141                 :            : #include <openssl/comp.h>
     142                 :            : #endif
     143                 :            : #include <openssl/evp.h>
     144                 :            : #include <openssl/hmac.h>
     145                 :            : #include <openssl/md5.h>
     146                 :            : #include <openssl/rand.h>
     147                 :            : #ifdef KSSL_DEBUG
     148                 :            : #include <openssl/des.h>
     149                 :            : #endif
     150                 :            : 
     151                 :            : /* seed1 through seed5 are virtually concatenated */
     152                 :      14496 : static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
     153                 :            :                         int sec_len,
     154                 :            :                         const void *seed1, int seed1_len,
     155                 :            :                         const void *seed2, int seed2_len,
     156                 :            :                         const void *seed3, int seed3_len,
     157                 :            :                         const void *seed4, int seed4_len,
     158                 :            :                         const void *seed5, int seed5_len,
     159                 :            :                         unsigned char *out, int olen)
     160                 :            :         {
     161                 :            :         int chunk;
     162                 :            :         size_t j;
     163                 :            :         EVP_MD_CTX ctx, ctx_tmp, ctx_init;
     164                 :            :         EVP_PKEY *mac_key;
     165                 :            :         unsigned char A1[EVP_MAX_MD_SIZE];
     166                 :            :         size_t A1_len;
     167                 :      14496 :         int ret = 0;
     168                 :            :         
     169                 :      14496 :         chunk=EVP_MD_size(md);
     170         [ -  + ]:      14496 :         OPENSSL_assert(chunk >= 0);
     171                 :            : 
     172                 :      14496 :         EVP_MD_CTX_init(&ctx);
     173                 :      14496 :         EVP_MD_CTX_init(&ctx_tmp);
     174                 :      14496 :         EVP_MD_CTX_init(&ctx_init);
     175                 :      14496 :         EVP_MD_CTX_set_flags(&ctx_init, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
     176                 :      14496 :         mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len);
     177         [ +  - ]:      14496 :         if (!mac_key)
     178                 :            :                 goto err;
     179         [ +  - ]:      14496 :         if (!EVP_DigestSignInit(&ctx_init,NULL,md, NULL, mac_key))
     180                 :            :                 goto err;
     181         [ +  - ]:      14496 :         if (!EVP_MD_CTX_copy_ex(&ctx,&ctx_init))
     182                 :            :                 goto err;
     183 [ +  - ][ +  - ]:      14496 :         if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
     184                 :            :                 goto err;
     185 [ +  - ][ +  - ]:      14496 :         if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
     186                 :            :                 goto err;
     187 [ +  + ][ +  - ]:      14496 :         if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
     188                 :            :                 goto err;
     189 [ +  + ][ +  - ]:      14496 :         if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
     190                 :            :                 goto err;
     191 [ -  + ][ #  # ]:      14496 :         if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
     192                 :            :                 goto err;
     193         [ +  - ]:      14496 :         if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
     194                 :            :                 goto err;
     195                 :            : 
     196                 :            :         for (;;)
     197                 :            :                 {
     198                 :            :                 /* Reinit mac contexts */
     199         [ +  - ]:      37744 :                 if (!EVP_MD_CTX_copy_ex(&ctx,&ctx_init))
     200                 :            :                         goto err;
     201         [ +  - ]:      37744 :                 if (!EVP_DigestSignUpdate(&ctx,A1,A1_len))
     202                 :            :                         goto err;
     203 [ +  + ][ +  - ]:      37744 :                 if (olen>chunk && !EVP_MD_CTX_copy_ex(&ctx_tmp,&ctx))
     204                 :            :                         goto err;
     205 [ +  - ][ +  - ]:      37744 :                 if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
     206                 :            :                         goto err;
     207 [ +  - ][ +  - ]:      37744 :                 if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
     208                 :            :                         goto err;
     209 [ +  + ][ +  - ]:      37744 :                 if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
     210                 :            :                         goto err;
     211 [ +  + ][ +  - ]:      37744 :                 if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
     212                 :            :                         goto err;
     213 [ -  + ][ #  # ]:      37744 :                 if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
     214                 :            :                         goto err;
     215                 :            : 
     216         [ +  + ]:      37744 :                 if (olen > chunk)
     217                 :            :                         {
     218         [ +  - ]:      23248 :                         if (!EVP_DigestSignFinal(&ctx,out,&j))
     219                 :            :                                 goto err;
     220                 :      23248 :                         out+=j;
     221                 :      23248 :                         olen-=j;
     222                 :            :                         /* calc the next A1 value */
     223         [ +  - ]:      23248 :                         if (!EVP_DigestSignFinal(&ctx_tmp,A1,&A1_len))
     224                 :            :                                 goto err;
     225                 :            :                         }
     226                 :            :                 else    /* last one */
     227                 :            :                         {
     228         [ +  - ]:      14496 :                         if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
     229                 :            :                                 goto err;
     230                 :      14496 :                         memcpy(out,A1,olen);
     231                 :            :                         break;
     232                 :            :                         }
     233                 :            :                 }
     234                 :      14496 :         ret = 1;
     235                 :            : err:
     236                 :      14496 :         EVP_PKEY_free(mac_key);
     237                 :      14496 :         EVP_MD_CTX_cleanup(&ctx);
     238                 :      14496 :         EVP_MD_CTX_cleanup(&ctx_tmp);
     239                 :      14496 :         EVP_MD_CTX_cleanup(&ctx_init);
     240                 :      14496 :         OPENSSL_cleanse(A1,sizeof(A1));
     241                 :      14496 :         return ret;
     242                 :            :         }
     243                 :            : 
     244                 :            : /* seed1 through seed5 are virtually concatenated */
     245                 :       8248 : static int tls1_PRF(long digest_mask,
     246                 :            :                      const void *seed1, int seed1_len,
     247                 :            :                      const void *seed2, int seed2_len,
     248                 :            :                      const void *seed3, int seed3_len,
     249                 :            :                      const void *seed4, int seed4_len,
     250                 :            :                      const void *seed5, int seed5_len,
     251                 :            :                      const unsigned char *sec, int slen,
     252                 :            :                      unsigned char *out1,
     253                 :            :                      unsigned char *out2, int olen)
     254                 :            :         {
     255                 :            :         int len,i,idx,count;
     256                 :            :         const unsigned char *S1;
     257                 :            :         long m;
     258                 :            :         const EVP_MD *md;
     259                 :       8248 :         int ret = 0;
     260                 :            : 
     261                 :            :         /* Count number of digests and partition sec evenly */
     262                 :       8248 :         count=0;
     263         [ +  + ]:      57736 :         for (idx=0;ssl_get_handshake_digest(idx,&m,&md);idx++) {
     264         [ +  + ]:      49488 :                 if ((m<<TLS1_PRF_DGST_SHIFT) & digest_mask) count++;
     265                 :            :         }       
     266                 :       8248 :         len=slen/count;
     267         [ +  + ]:       8248 :         if (count == 1)
     268                 :       2000 :                 slen = 0;
     269                 :       8248 :         S1=sec;
     270                 :       8248 :         memset(out1,0,olen);
     271         [ +  + ]:      57736 :         for (idx=0;ssl_get_handshake_digest(idx,&m,&md);idx++) {
     272         [ +  + ]:      49488 :                 if ((m<<TLS1_PRF_DGST_SHIFT) & digest_mask) {
     273         [ -  + ]:      14496 :                         if (!md) {
     274                 :          0 :                                 SSLerr(SSL_F_TLS1_PRF,
     275                 :            :                                 SSL_R_UNSUPPORTED_DIGEST_TYPE);
     276                 :          0 :                                 goto err;                               
     277                 :            :                         }
     278         [ +  - ]:      14496 :                         if (!tls1_P_hash(md ,S1,len+(slen&1),
     279                 :            :                                         seed1,seed1_len,seed2,seed2_len,seed3,seed3_len,seed4,seed4_len,seed5,seed5_len,
     280                 :            :                                         out2,olen))
     281                 :            :                                 goto err;
     282                 :      14496 :                         S1+=len;
     283         [ +  + ]:     636752 :                         for (i=0; i<olen; i++)
     284                 :            :                         {
     285                 :     622256 :                                 out1[i]^=out2[i];
     286                 :            :                         }
     287                 :            :                 }
     288                 :            :         }
     289                 :            :         ret = 1;
     290                 :            : err:
     291                 :       8248 :         return ret;
     292                 :            : }
     293                 :       1654 : static int tls1_generate_key_block(SSL *s, unsigned char *km,
     294                 :            :              unsigned char *tmp, int num)
     295                 :            :         {
     296                 :            :         int ret;
     297                 :       1654 :         ret = tls1_PRF(ssl_get_algorithm2(s),
     298                 :            :                  TLS_MD_KEY_EXPANSION_CONST,TLS_MD_KEY_EXPANSION_CONST_SIZE,
     299                 :       1654 :                  s->s3->server_random,SSL3_RANDOM_SIZE,
     300                 :       1654 :                  s->s3->client_random,SSL3_RANDOM_SIZE,
     301                 :            :                  NULL,0,NULL,0,
     302                 :       3308 :                  s->session->master_key,s->session->master_key_length,
     303                 :            :                  km,tmp,num);
     304                 :            : #ifdef KSSL_DEBUG
     305                 :            :         printf("tls1_generate_key_block() ==> %d byte master_key =\n\t",
     306                 :            :                 s->session->master_key_length);
     307                 :            :         {
     308                 :            :         int i;
     309                 :            :         for (i=0; i < s->session->master_key_length; i++)
     310                 :            :                 {
     311                 :            :                 printf("%02X", s->session->master_key[i]);
     312                 :            :                 }
     313                 :            :         printf("\n");  }
     314                 :            : #endif    /* KSSL_DEBUG */
     315                 :       1654 :         return ret;
     316                 :            :         }
     317                 :            : 
     318                 :       3308 : int tls1_change_cipher_state(SSL *s, int which)
     319                 :            :         {
     320                 :            :         static const unsigned char empty[]="";
     321                 :            :         unsigned char *p,*mac_secret;
     322                 :            :         unsigned char *exp_label;
     323                 :            :         unsigned char tmp1[EVP_MAX_KEY_LENGTH];
     324                 :            :         unsigned char tmp2[EVP_MAX_KEY_LENGTH];
     325                 :            :         unsigned char iv1[EVP_MAX_IV_LENGTH*2];
     326                 :            :         unsigned char iv2[EVP_MAX_IV_LENGTH*2];
     327                 :            :         unsigned char *ms,*key,*iv;
     328                 :            :         int client_write;
     329                 :            :         EVP_CIPHER_CTX *dd;
     330                 :            :         const EVP_CIPHER *c;
     331                 :            : #ifndef OPENSSL_NO_COMP
     332                 :            :         const SSL_COMP *comp;
     333                 :            : #endif
     334                 :            :         const EVP_MD *m;
     335                 :            :         int mac_type;
     336                 :            :         int *mac_secret_size;
     337                 :            :         EVP_MD_CTX *mac_ctx;
     338                 :            :         EVP_PKEY *mac_key;
     339                 :            :         int is_export,n,i,j,k,exp_label_len,cl;
     340                 :       3308 :         int reuse_dd = 0;
     341                 :            : 
     342                 :       3308 :         is_export=SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
     343                 :       3308 :         c=s->s3->tmp.new_sym_enc;
     344                 :       3308 :         m=s->s3->tmp.new_hash;
     345                 :       3308 :         mac_type = s->s3->tmp.new_mac_pkey_type;
     346                 :            : #ifndef OPENSSL_NO_COMP
     347                 :       3308 :         comp=s->s3->tmp.new_compression;
     348                 :            : #endif
     349                 :            : 
     350                 :            : #ifdef KSSL_DEBUG
     351                 :            :         printf("tls1_change_cipher_state(which= %d) w/\n", which);
     352                 :            :         printf("\talg= %ld/%ld, comp= %p\n",
     353                 :            :                s->s3->tmp.new_cipher->algorithm_mkey,
     354                 :            :                s->s3->tmp.new_cipher->algorithm_auth,
     355                 :            :                comp);
     356                 :            :         printf("\tevp_cipher == %p ==? &d_cbc_ede_cipher3\n", c);
     357                 :            :         printf("\tevp_cipher: nid, blksz= %d, %d, keylen=%d, ivlen=%d\n",
     358                 :            :                 c->nid,c->block_size,c->key_len,c->iv_len);
     359                 :            :         printf("\tkey_block: len= %d, data= ", s->s3->tmp.key_block_length);
     360                 :            :         {
     361                 :            :         int i;
     362                 :            :         for (i=0; i<s->s3->tmp.key_block_length; i++)
     363                 :            :                 printf("%02x", s->s3->tmp.key_block[i]);  printf("\n");
     364                 :            :         }
     365                 :            : #endif  /* KSSL_DEBUG */
     366                 :            : 
     367         [ +  + ]:       3308 :         if (which & SSL3_CC_READ)
     368                 :            :                 {
     369         [ -  + ]:       1654 :                 if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
     370                 :          0 :                         s->mac_flags |= SSL_MAC_FLAG_READ_MAC_STREAM;
     371                 :            :                 else
     372                 :       1654 :                         s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_STREAM;
     373                 :            : 
     374         [ +  - ]:       1654 :                 if (s->enc_read_ctx != NULL)
     375                 :            :                         reuse_dd = 1;
     376         [ +  - ]:       1654 :                 else if ((s->enc_read_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
     377                 :            :                         goto err;
     378                 :            :                 else
     379                 :            :                         /* make sure it's intialized in case we exit later with an error */
     380                 :       1654 :                         EVP_CIPHER_CTX_init(s->enc_read_ctx);
     381                 :       1654 :                 dd= s->enc_read_ctx;
     382                 :       1654 :                 mac_ctx=ssl_replace_hash(&s->read_hash,NULL);
     383                 :            : #ifndef OPENSSL_NO_COMP
     384         [ -  + ]:       1654 :                 if (s->expand != NULL)
     385                 :            :                         {
     386                 :          0 :                         COMP_CTX_free(s->expand);
     387                 :          0 :                         s->expand=NULL;
     388                 :            :                         }
     389         [ -  + ]:       1654 :                 if (comp != NULL)
     390                 :            :                         {
     391                 :          0 :                         s->expand=COMP_CTX_new(comp->method);
     392         [ #  # ]:          0 :                         if (s->expand == NULL)
     393                 :            :                                 {
     394                 :          0 :                                 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
     395                 :          0 :                                 goto err2;
     396                 :            :                                 }
     397         [ #  # ]:          0 :                         if (s->s3->rrec.comp == NULL)
     398                 :          0 :                                 s->s3->rrec.comp=(unsigned char *)
     399                 :          0 :                                         OPENSSL_malloc(SSL3_RT_MAX_ENCRYPTED_LENGTH);
     400         [ #  # ]:          0 :                         if (s->s3->rrec.comp == NULL)
     401                 :            :                                 goto err;
     402                 :            :                         }
     403                 :            : #endif
     404                 :            :                 /* this is done by dtls1_reset_seq_numbers for DTLS1_VERSION */
     405         [ +  - ]:       1654 :                 if (s->version != DTLS1_VERSION)
     406                 :       1654 :                         memset(&(s->s3->read_sequence[0]),0,8);
     407                 :       1654 :                 mac_secret= &(s->s3->read_mac_secret[0]);
     408                 :       1654 :                 mac_secret_size=&(s->s3->read_mac_secret_size);
     409                 :            :                 }
     410                 :            :         else
     411                 :            :                 {
     412         [ -  + ]:       1654 :                 if (s->s3->tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
     413                 :          0 :                         s->mac_flags |= SSL_MAC_FLAG_WRITE_MAC_STREAM;
     414                 :            :                         else
     415                 :       1654 :                         s->mac_flags &= ~SSL_MAC_FLAG_WRITE_MAC_STREAM;
     416 [ -  + ][ #  # ]:       1654 :                 if (s->enc_write_ctx != NULL && !SSL_IS_DTLS(s))
     417                 :            :                         reuse_dd = 1;
     418         [ +  - ]:       1654 :                 else if ((s->enc_write_ctx=EVP_CIPHER_CTX_new()) == NULL)
     419                 :            :                         goto err;
     420                 :       1654 :                 dd= s->enc_write_ctx;
     421         [ -  + ]:       1654 :                 if (SSL_IS_DTLS(s))
     422                 :            :                         {
     423                 :          0 :                         mac_ctx = EVP_MD_CTX_create();
     424         [ #  # ]:          0 :                         if (!mac_ctx)
     425                 :            :                                 goto err;
     426                 :          0 :                         s->write_hash = mac_ctx;
     427                 :            :                         }
     428                 :            :                 else
     429                 :       1654 :                         mac_ctx = ssl_replace_hash(&s->write_hash,NULL);
     430                 :            : #ifndef OPENSSL_NO_COMP
     431         [ -  + ]:       1654 :                 if (s->compress != NULL)
     432                 :            :                         {
     433                 :          0 :                         COMP_CTX_free(s->compress);
     434                 :          0 :                         s->compress=NULL;
     435                 :            :                         }
     436         [ -  + ]:       1654 :                 if (comp != NULL)
     437                 :            :                         {
     438                 :          0 :                         s->compress=COMP_CTX_new(comp->method);
     439         [ #  # ]:          0 :                         if (s->compress == NULL)
     440                 :            :                                 {
     441                 :          0 :                                 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,SSL_R_COMPRESSION_LIBRARY_ERROR);
     442                 :          0 :                                 goto err2;
     443                 :            :                                 }
     444                 :            :                         }
     445                 :            : #endif
     446                 :            :                 /* this is done by dtls1_reset_seq_numbers for DTLS1_VERSION */
     447         [ +  - ]:       1654 :                 if (s->version != DTLS1_VERSION)
     448                 :       1654 :                         memset(&(s->s3->write_sequence[0]),0,8);
     449                 :       1654 :                 mac_secret= &(s->s3->write_mac_secret[0]);
     450                 :       1654 :                 mac_secret_size = &(s->s3->write_mac_secret_size);
     451                 :            :                 }
     452                 :            : 
     453         [ -  + ]:       3308 :         if (reuse_dd)
     454                 :          0 :                 EVP_CIPHER_CTX_cleanup(dd);
     455                 :            : 
     456                 :       3308 :         p=s->s3->tmp.key_block;
     457                 :       3308 :         i=*mac_secret_size=s->s3->tmp.new_mac_secret_size;
     458                 :            : 
     459                 :       3308 :         cl=EVP_CIPHER_key_length(c);
     460                 :       3308 :         j=is_export ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ?
     461 [ -  + ][ #  # ]:       3308 :                        cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl;
                 [ #  # ]
     462                 :            :         /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */
     463                 :            :         /* If GCM mode only part of IV comes from PRF */
     464         [ +  + ]:       3308 :         if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
     465                 :            :                 k = EVP_GCM_TLS_FIXED_IV_LEN;
     466                 :            :         else
     467                 :       2736 :                 k=EVP_CIPHER_iv_length(c);
     468         [ +  + ]:       3308 :         if (    (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
     469                 :       3308 :                 (which == SSL3_CHANGE_CIPHER_SERVER_READ))
     470                 :            :                 {
     471                 :       1654 :                 ms=  &(p[ 0]); n=i+i;
     472                 :       1654 :                 key= &(p[ n]); n+=j+j;
     473                 :       1654 :                 iv=  &(p[ n]); n+=k+k;
     474                 :       1654 :                 exp_label=(unsigned char *)TLS_MD_CLIENT_WRITE_KEY_CONST;
     475                 :       1654 :                 exp_label_len=TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE;
     476                 :       1654 :                 client_write=1;
     477                 :            :                 }
     478                 :            :         else
     479                 :            :                 {
     480                 :       1654 :                 n=i;
     481                 :       1654 :                 ms=  &(p[ n]); n+=i+j;
     482                 :       1654 :                 key= &(p[ n]); n+=j+k;
     483                 :       1654 :                 iv=  &(p[ n]); n+=k;
     484                 :       1654 :                 exp_label=(unsigned char *)TLS_MD_SERVER_WRITE_KEY_CONST;
     485                 :       1654 :                 exp_label_len=TLS_MD_SERVER_WRITE_KEY_CONST_SIZE;
     486                 :       1654 :                 client_write=0;
     487                 :            :                 }
     488                 :            : 
     489         [ -  + ]:       3308 :         if (n > s->s3->tmp.key_block_length)
     490                 :            :                 {
     491                 :          0 :                 SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_INTERNAL_ERROR);
     492                 :          0 :                 goto err2;
     493                 :            :                 }
     494                 :            : 
     495                 :       3308 :         memcpy(mac_secret,ms,i);
     496                 :            : 
     497         [ +  + ]:       3308 :         if (!(EVP_CIPHER_flags(c)&EVP_CIPH_FLAG_AEAD_CIPHER))
     498                 :            :                 {
     499                 :       2472 :                 mac_key = EVP_PKEY_new_mac_key(mac_type, NULL,
     500                 :            :                                 mac_secret,*mac_secret_size);
     501                 :       2472 :                 EVP_DigestSignInit(mac_ctx,NULL,m,NULL,mac_key);
     502                 :       2472 :                 EVP_PKEY_free(mac_key);
     503                 :            :                 }
     504                 :            : #ifdef TLS_DEBUG
     505                 :            : printf("which = %04X\nmac key=",which);
     506                 :            : { int z; for (z=0; z<i; z++) printf("%02X%c",ms[z],((z+1)%16)?' ':'\n'); }
     507                 :            : #endif
     508         [ -  + ]:       3308 :         if (is_export)
     509                 :            :                 {
     510                 :            :                 /* In here I set both the read and write key/iv to the
     511                 :            :                  * same value since only the correct one will be used :-).
     512                 :            :                  */
     513         [ #  # ]:          0 :                 if (!tls1_PRF(ssl_get_algorithm2(s),
     514                 :            :                                 exp_label,exp_label_len,
     515                 :          0 :                                 s->s3->client_random,SSL3_RANDOM_SIZE,
     516                 :          0 :                                 s->s3->server_random,SSL3_RANDOM_SIZE,
     517                 :            :                                 NULL,0,NULL,0,
     518                 :            :                                 key,j,tmp1,tmp2,EVP_CIPHER_key_length(c)))
     519                 :            :                         goto err2;
     520                 :          0 :                 key=tmp1;
     521                 :            : 
     522         [ #  # ]:          0 :                 if (k > 0)
     523                 :            :                         {
     524         [ #  # ]:          0 :                         if (!tls1_PRF(ssl_get_algorithm2(s),
     525                 :            :                                         TLS_MD_IV_BLOCK_CONST,TLS_MD_IV_BLOCK_CONST_SIZE,
     526                 :          0 :                                         s->s3->client_random,SSL3_RANDOM_SIZE,
     527                 :          0 :                                         s->s3->server_random,SSL3_RANDOM_SIZE,
     528                 :            :                                         NULL,0,NULL,0,
     529                 :            :                                         empty,0,iv1,iv2,k*2))
     530                 :            :                                 goto err2;
     531         [ #  # ]:          0 :                         if (client_write)
     532                 :            :                                 iv=iv1;
     533                 :            :                         else
     534                 :          0 :                                 iv= &(iv1[k]);
     535                 :            :                         }
     536                 :            :                 }
     537                 :            : 
     538                 :       3308 :         s->session->key_arg_length=0;
     539                 :            : #ifdef KSSL_DEBUG
     540                 :            :         {
     541                 :            :         int i;
     542                 :            :         printf("EVP_CipherInit_ex(dd,c,key=,iv=,which)\n");
     543                 :            :         printf("\tkey= "); for (i=0; i<c->key_len; i++) printf("%02x", key[i]);
     544                 :            :         printf("\n");
     545                 :            :         printf("\t iv= "); for (i=0; i<c->iv_len; i++) printf("%02x", iv[i]);
     546                 :            :         printf("\n");
     547                 :            :         }
     548                 :            : #endif  /* KSSL_DEBUG */
     549                 :            : 
     550         [ +  + ]:       3308 :         if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
     551                 :            :                 {
     552                 :        572 :                 EVP_CipherInit_ex(dd,c,NULL,key,NULL,(which & SSL3_CC_WRITE));
     553                 :        572 :                 EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_GCM_SET_IV_FIXED, k, iv);
     554                 :            :                 }
     555                 :            :         else    
     556                 :       2736 :                 EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE));
     557                 :            : 
     558                 :            :         /* Needed for "composite" AEADs, such as RC4-HMAC-MD5 */
     559 [ +  + ][ +  + ]:       3308 :         if ((EVP_CIPHER_flags(c)&EVP_CIPH_FLAG_AEAD_CIPHER) && *mac_secret_size)
     560                 :        264 :                 EVP_CIPHER_CTX_ctrl(dd,EVP_CTRL_AEAD_SET_MAC_KEY,
     561                 :            :                                 *mac_secret_size,mac_secret);
     562                 :            : 
     563                 :            : #ifdef OPENSSL_SSL_TRACE_CRYPTO
     564                 :            :         if (s->msg_callback)
     565                 :            :                 {
     566                 :            :                 int wh = which & SSL3_CC_WRITE ? TLS1_RT_CRYPTO_WRITE : 0;
     567                 :            :                 if (*mac_secret_size)
     568                 :            :                         s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_MAC,
     569                 :            :                                                 mac_secret, *mac_secret_size,
     570                 :            :                                                 s, s->msg_callback_arg);
     571                 :            :                 if (c->key_len)
     572                 :            :                         s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_KEY,
     573                 :            :                                                 key, c->key_len,
     574                 :            :                                                 s, s->msg_callback_arg);
     575                 :            :                 if (k)
     576                 :            :                         {
     577                 :            :                         if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
     578                 :            :                                 wh |= TLS1_RT_CRYPTO_FIXED_IV;
     579                 :            :                         else
     580                 :            :                                 wh |= TLS1_RT_CRYPTO_IV;
     581                 :            :                         s->msg_callback(2, s->version, wh, iv, k,
     582                 :            :                                                 s, s->msg_callback_arg);
     583                 :            :                         }
     584                 :            :                 }
     585                 :            : #endif
     586                 :            : 
     587                 :            : #ifdef TLS_DEBUG
     588                 :            : printf("which = %04X\nkey=",which);
     589                 :            : { int z; for (z=0; z<EVP_CIPHER_key_length(c); z++) printf("%02X%c",key[z],((z+1)%16)?' ':'\n'); }
     590                 :            : printf("\niv=");
     591                 :            : { int z; for (z=0; z<k; z++) printf("%02X%c",iv[z],((z+1)%16)?' ':'\n'); }
     592                 :            : printf("\n");
     593                 :            : #endif
     594                 :            : 
     595                 :       3308 :         OPENSSL_cleanse(tmp1,sizeof(tmp1));
     596                 :       3308 :         OPENSSL_cleanse(tmp2,sizeof(tmp1));
     597                 :       3308 :         OPENSSL_cleanse(iv1,sizeof(iv1));
     598                 :       3308 :         OPENSSL_cleanse(iv2,sizeof(iv2));
     599                 :       3308 :         return(1);
     600                 :            : err:
     601                 :          0 :         SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE,ERR_R_MALLOC_FAILURE);
     602                 :            : err2:
     603                 :            :         return(0);
     604                 :            :         }
     605                 :            : 
     606                 :       2481 : int tls1_setup_key_block(SSL *s)
     607                 :            :         {
     608                 :       2481 :         unsigned char *p1,*p2=NULL;
     609                 :            :         const EVP_CIPHER *c;
     610                 :            :         const EVP_MD *hash;
     611                 :            :         int num;
     612                 :            :         SSL_COMP *comp;
     613                 :       2481 :         int mac_type= NID_undef,mac_secret_size=0;
     614                 :       2481 :         int ret=0;
     615                 :            : 
     616                 :            : #ifdef KSSL_DEBUG
     617                 :            :         printf ("tls1_setup_key_block()\n");
     618                 :            : #endif  /* KSSL_DEBUG */
     619                 :            : 
     620         [ +  + ]:       2481 :         if (s->s3->tmp.key_block_length != 0)
     621                 :            :                 return(1);
     622                 :            : 
     623         [ -  + ]:       1654 :         if (!ssl_cipher_get_evp(s->session,&c,&hash,&mac_type,&mac_secret_size,&comp, SSL_USE_ETM(s)))
     624                 :            :                 {
     625                 :          0 :                 SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
     626                 :          0 :                 return(0);
     627                 :            :                 }
     628                 :            : 
     629                 :       1654 :         s->s3->tmp.new_sym_enc=c;
     630                 :       1654 :         s->s3->tmp.new_hash=hash;
     631                 :       1654 :         s->s3->tmp.new_mac_pkey_type = mac_type;
     632                 :       1654 :         s->s3->tmp.new_mac_secret_size = mac_secret_size;
     633                 :       1654 :         num=EVP_CIPHER_key_length(c)+mac_secret_size+EVP_CIPHER_iv_length(c);
     634                 :       1654 :         num*=2;
     635                 :            : 
     636                 :       1654 :         ssl3_cleanup_key_block(s);
     637                 :            : 
     638         [ -  + ]:       1654 :         if ((p1=(unsigned char *)OPENSSL_malloc(num)) == NULL)
     639                 :            :                 {
     640                 :          0 :                 SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
     641                 :          0 :                 goto err;
     642                 :            :                 }
     643                 :            : 
     644                 :       1654 :         s->s3->tmp.key_block_length=num;
     645                 :       1654 :         s->s3->tmp.key_block=p1;
     646                 :            : 
     647         [ -  + ]:       1654 :         if ((p2=(unsigned char *)OPENSSL_malloc(num)) == NULL)
     648                 :            :                 {
     649                 :          0 :                 SSLerr(SSL_F_TLS1_SETUP_KEY_BLOCK,ERR_R_MALLOC_FAILURE);
     650                 :          0 :                 goto err;
     651                 :            :                 }
     652                 :            : 
     653                 :            : #ifdef TLS_DEBUG
     654                 :            : printf("client random\n");
     655                 :            : { int z; for (z=0; z<SSL3_RANDOM_SIZE; z++) printf("%02X%c",s->s3->client_random[z],((z+1)%16)?' ':'\n'); }
     656                 :            : printf("server random\n");
     657                 :            : { int z; for (z=0; z<SSL3_RANDOM_SIZE; z++) printf("%02X%c",s->s3->server_random[z],((z+1)%16)?' ':'\n'); }
     658                 :            : printf("master key\n");
     659                 :            : { int z; for (z=0; z<s->session->master_key_length; z++) printf("%02X%c",s->session->master_key[z],((z+1)%16)?' ':'\n'); }
     660                 :            : #endif
     661         [ +  - ]:       1654 :         if (!tls1_generate_key_block(s,p1,p2,num))
     662                 :            :                 goto err;
     663                 :            : #ifdef TLS_DEBUG
     664                 :            : printf("\nkey block\n");
     665                 :            : { int z; for (z=0; z<num; z++) printf("%02X%c",p1[z],((z+1)%16)?' ':'\n'); }
     666                 :            : #endif
     667                 :            : 
     668         [ +  - ]:       1654 :         if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)
     669         [ +  + ]:       1654 :                 && s->method->version <= TLS1_VERSION)
     670                 :            :                 {
     671                 :            :                 /* enable vulnerability countermeasure for CBC ciphers with
     672                 :            :                  * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt)
     673                 :            :                  */
     674                 :       1254 :                 s->s3->need_empty_fragments = 1;
     675                 :            : 
     676         [ +  - ]:       1254 :                 if (s->session->cipher != NULL)
     677                 :            :                         {
     678         [ -  + ]:       1254 :                         if (s->session->cipher->algorithm_enc == SSL_eNULL)
     679                 :          0 :                                 s->s3->need_empty_fragments = 0;
     680                 :            :                         
     681                 :            : #ifndef OPENSSL_NO_RC4
     682         [ -  + ]:       1254 :                         if (s->session->cipher->algorithm_enc == SSL_RC4)
     683                 :          0 :                                 s->s3->need_empty_fragments = 0;
     684                 :            : #endif
     685                 :            :                         }
     686                 :            :                 }
     687                 :            :                 
     688                 :            :         ret = 1;
     689                 :            : err:
     690         [ +  - ]:       1654 :         if (p2)
     691                 :            :                 {
     692                 :       1654 :                 OPENSSL_cleanse(p2,num);
     693                 :       1654 :                 OPENSSL_free(p2);
     694                 :            :                 }
     695                 :       1654 :         return(ret);
     696                 :            :         }
     697                 :            : 
     698                 :            : /* tls1_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|, respectively.
     699                 :            :  *
     700                 :            :  * Returns:
     701                 :            :  *   0: (in non-constant time) if the record is publically invalid (i.e. too
     702                 :            :  *       short etc).
     703                 :            :  *   1: if the record's padding is valid / the encryption was successful.
     704                 :            :  *   -1: if the record's padding/AEAD-authenticator is invalid or, if sending,
     705                 :            :  *       an internal error occurred.
     706                 :            :  */
     707                 :      42596 : int tls1_enc(SSL *s, int send)
     708                 :            :         {
     709                 :            :         SSL3_RECORD *rec;
     710                 :            :         EVP_CIPHER_CTX *ds;
     711                 :            :         unsigned long l;
     712                 :      42596 :         int bs,i,j,k,pad=0,ret,mac_size=0;
     713                 :            :         const EVP_CIPHER *enc;
     714                 :            : 
     715         [ +  + ]:      42596 :         if (send)
     716                 :            :                 {
     717         [ +  + ]:      22025 :                 if (EVP_MD_CTX_md(s->write_hash))
     718                 :            :                         {
     719                 :      13673 :                         int n=EVP_MD_CTX_size(s->write_hash);
     720         [ -  + ]:      13673 :                         OPENSSL_assert(n >= 0);
     721                 :            :                         }
     722                 :      22025 :                 ds=s->enc_write_ctx;
     723                 :      22025 :                 rec= &(s->s3->wrec);
     724         [ +  + ]:      22025 :                 if (s->enc_write_ctx == NULL)
     725                 :            :                         enc=NULL;
     726                 :            :                 else
     727                 :            :                         {
     728                 :            :                         int ivlen;
     729                 :      15059 :                         enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
     730                 :            :                         /* For TLSv1.1 and later explicit IV */
     731         [ +  + ]:      15059 :                         if (SSL_USE_EXPLICIT_IV(s)
     732         [ +  + ]:       9988 :                                 && EVP_CIPHER_mode(enc) == EVP_CIPH_CBC_MODE)
     733                 :       9064 :                                 ivlen = EVP_CIPHER_iv_length(enc);
     734                 :            :                         else
     735                 :            :                                 ivlen = 0;
     736         [ +  + ]:      15059 :                         if (ivlen > 1)
     737                 :            :                                 {
     738         [ -  + ]:       9064 :                                 if ( rec->data != rec->input)
     739                 :            :                                         /* we can't write into the input stream:
     740                 :            :                                          * Can this ever happen?? (steve)
     741                 :            :                                          */
     742                 :          0 :                                         fprintf(stderr,
     743                 :            :                                                 "%s:%d: rec->data != rec->input\n",
     744                 :            :                                                 __FILE__, __LINE__);
     745         [ +  - ]:       9064 :                                 else if (RAND_bytes(rec->input, ivlen) <= 0)
     746                 :            :                                         return -1;
     747                 :            :                                 }
     748                 :            :                         }
     749                 :            :                 }
     750                 :            :         else
     751                 :            :                 {
     752         [ +  + ]:      20571 :                 if (EVP_MD_CTX_md(s->read_hash))
     753                 :            :                         {
     754                 :      12437 :                         int n=EVP_MD_CTX_size(s->read_hash);
     755         [ -  + ]:      12437 :                         OPENSSL_assert(n >= 0);
     756                 :            :                         }
     757                 :      20571 :                 ds=s->enc_read_ctx;
     758                 :      20571 :                 rec= &(s->s3->rrec);
     759         [ +  + ]:      20571 :                 if (s->enc_read_ctx == NULL)
     760                 :            :                         enc=NULL;
     761                 :            :                 else
     762                 :      13405 :                         enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
     763                 :            :                 }
     764                 :            : 
     765                 :            : #ifdef KSSL_DEBUG
     766                 :            :         printf("tls1_enc(%d)\n", send);
     767                 :            : #endif    /* KSSL_DEBUG */
     768                 :            : 
     769 [ +  + ][ +  + ]:      42596 :         if ((s->session == NULL) || (ds == NULL) || (enc == NULL))
     770                 :            :                 {
     771                 :      14132 :                 memmove(rec->data,rec->input,rec->length);
     772                 :      14132 :                 rec->input=rec->data;
     773                 :      14132 :                 ret = 1;
     774                 :            :                 }
     775                 :            :         else
     776                 :            :                 {
     777                 :      28464 :                 l=rec->length;
     778                 :      28464 :                 bs=EVP_CIPHER_block_size(ds->cipher);
     779                 :            : 
     780         [ +  + ]:      28464 :                 if (EVP_CIPHER_flags(ds->cipher)&EVP_CIPH_FLAG_AEAD_CIPHER)
     781                 :            :                         {
     782                 :            :                         unsigned char buf[13],*seq;
     783                 :            : 
     784         [ +  + ]:       2354 :                         seq = send?s->s3->write_sequence:s->s3->read_sequence;
     785                 :            : 
     786         [ -  + ]:       2354 :                         if (SSL_IS_DTLS(s))
     787                 :            :                                 {
     788                 :          0 :                                 unsigned char dtlsseq[9],*p=dtlsseq;
     789                 :            : 
     790 [ #  # ][ #  # ]:          0 :                                 s2n(send?s->d1->w_epoch:s->d1->r_epoch,p);
     791                 :          0 :                                 memcpy(p,&seq[2],6);
     792                 :            :                                 memcpy(buf,dtlsseq,8);
     793                 :            :                                 }
     794                 :            :                         else
     795                 :            :                                 {
     796                 :            :                                 memcpy(buf,seq,8);
     797         [ +  - ]:       2354 :                                 for (i=7; i>=0; i--) /* increment */
     798                 :            :                                         {
     799                 :       2354 :                                         ++seq[i];
     800         [ -  + ]:       2354 :                                         if (seq[i] != 0) break; 
     801                 :            :                                         }
     802                 :            :                                 }
     803                 :            : 
     804                 :       2354 :                         buf[8]=rec->type;
     805                 :       2354 :                         buf[9]=(unsigned char)(s->version>>8);
     806                 :       2354 :                         buf[10]=(unsigned char)(s->version);
     807                 :       2354 :                         buf[11]=rec->length>>8;
     808                 :       2354 :                         buf[12]=rec->length&0xff;
     809                 :       2354 :                         pad=EVP_CIPHER_CTX_ctrl(ds,EVP_CTRL_AEAD_TLS1_AAD,13,buf);
     810         [ +  + ]:       2354 :                         if (send)
     811                 :            :                                 {
     812                 :       1386 :                                 l+=pad;
     813                 :       2354 :                                 rec->length+=pad;
     814                 :            :                                 }
     815                 :            :                         }
     816         [ +  + ]:      26110 :                 else if ((bs != 1) && send)
     817                 :            :                         {
     818                 :      13607 :                         i=bs-((int)l%bs);
     819                 :            : 
     820                 :            :                         /* Add weird padding of upto 256 bytes */
     821                 :            : 
     822                 :            :                         /* we need to add 'i' padding bytes of value j */
     823                 :      13607 :                         j=i-1;
     824         [ -  + ]:      13607 :                         if (s->options & SSL_OP_TLS_BLOCK_PADDING_BUG)
     825                 :            :                                 {
     826         [ #  # ]:          0 :                                 if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
     827                 :          0 :                                         j++;
     828                 :            :                                 }
     829         [ +  + ]:     164191 :                         for (k=(int)l; k<(int)(l+i); k++)
     830                 :     150584 :                                 rec->input[k]=j;
     831                 :      13607 :                         l+=i;
     832                 :      13607 :                         rec->length+=i;
     833                 :            :                         }
     834                 :            : 
     835                 :            : #ifdef KSSL_DEBUG
     836                 :            :                 {
     837                 :            :                 unsigned long ui;
     838                 :            :                 printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n",
     839                 :            :                         ds,rec->data,rec->input,l);
     840                 :            :                 printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n",
     841                 :            :                         ds->buf_len, ds->cipher->key_len,
     842                 :            :                         DES_KEY_SZ, DES_SCHEDULE_SZ,
     843                 :            :                         ds->cipher->iv_len);
     844                 :            :                 printf("\t\tIV: ");
     845                 :            :                 for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]);
     846                 :            :                 printf("\n");
     847                 :            :                 printf("\trec->input=");
     848                 :            :                 for (ui=0; ui<l; ui++) printf(" %02x", rec->input[ui]);
     849                 :            :                 printf("\n");
     850                 :            :                 }
     851                 :            : #endif  /* KSSL_DEBUG */
     852                 :            : 
     853         [ +  + ]:      28464 :                 if (!send)
     854                 :            :                         {
     855 [ +  - ][ +  - ]:      13405 :                         if (l == 0 || l%bs != 0)
     856                 :            :                                 return 0;
     857                 :            :                         }
     858                 :            :                 
     859                 :      28464 :                 i = EVP_Cipher(ds,rec->data,rec->input,l);
     860 [ +  + ][ +  - ]:      28464 :                 if ((EVP_CIPHER_flags(ds->cipher)&EVP_CIPH_FLAG_CUSTOM_CIPHER)
     861                 :            :                                                 ?(i<0)
     862                 :            :                                                 :(i==0))
     863                 :            :                         return -1;      /* AEAD can fail to verify MAC */
     864 [ +  + ][ +  + ]:      28464 :                 if (EVP_CIPHER_mode(enc) == EVP_CIPH_GCM_MODE && !send)
     865                 :            :                         {
     866                 :        572 :                         rec->data += EVP_GCM_TLS_EXPLICIT_IV_LEN;
     867                 :        572 :                         rec->input += EVP_GCM_TLS_EXPLICIT_IV_LEN;
     868                 :        572 :                         rec->length -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
     869                 :            :                         }
     870                 :            : 
     871                 :            : #ifdef KSSL_DEBUG
     872                 :            :                 {
     873                 :            :                 unsigned long i;
     874                 :            :                 printf("\trec->data=");
     875                 :            :                 for (i=0; i<l; i++)
     876                 :            :                         printf(" %02x", rec->data[i]);  printf("\n");
     877                 :            :                 }
     878                 :            : #endif  /* KSSL_DEBUG */
     879                 :            : 
     880                 :      28464 :                 ret = 1;
     881 [ +  + ][ -  + ]:      28464 :                 if (!SSL_USE_ETM(s) && EVP_MD_CTX_md(s->read_hash) != NULL)
     882                 :          0 :                         mac_size = EVP_MD_CTX_size(s->read_hash);
     883         [ +  + ]:      28464 :                 if ((bs != 1) && !send)
     884                 :      12789 :                         ret = tls1_cbc_remove_padding(s, rec, bs, mac_size);
     885         [ +  + ]:      28464 :                 if (pad && !send)
     886                 :        968 :                         rec->length -= pad;
     887                 :            :                 }
     888                 :      42596 :         return ret;
     889                 :            :         }
     890                 :            : 
     891                 :       1232 : int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out)
     892                 :            :         {
     893                 :            :         unsigned int ret;
     894                 :       1232 :         EVP_MD_CTX ctx, *d=NULL;
     895                 :            :         int i;
     896                 :            : 
     897         [ -  + ]:       1232 :         if (s->s3->handshake_buffer) 
     898         [ #  # ]:       1232 :                 if (!ssl3_digest_cached_records(s))
     899                 :            :                         return 0;
     900                 :            : 
     901         [ +  - ]:       1848 :         for (i=0;i<SSL_MAX_DIGEST;i++) 
     902                 :            :                 {
     903 [ +  - ][ +  + ]:       1848 :                   if (s->s3->handshake_dgst[i]&&EVP_MD_CTX_type(s->s3->handshake_dgst[i])==md_nid) 
     904                 :            :                         {
     905                 :       1232 :                         d=s->s3->handshake_dgst[i];
     906                 :       1232 :                         break;
     907                 :            :                         }
     908                 :            :                 }
     909         [ -  + ]:       1232 :         if (!d) {
     910                 :          0 :                 SSLerr(SSL_F_TLS1_CERT_VERIFY_MAC,SSL_R_NO_REQUIRED_DIGEST);
     911                 :          0 :                 return 0;
     912                 :            :         }       
     913                 :            : 
     914                 :       1232 :         EVP_MD_CTX_init(&ctx);
     915                 :       1232 :         EVP_MD_CTX_copy_ex(&ctx,d);
     916                 :       1232 :         EVP_DigestFinal_ex(&ctx,out,&ret);
     917                 :       1232 :         EVP_MD_CTX_cleanup(&ctx);
     918                 :       1232 :         return((int)ret);
     919                 :            :         }
     920                 :            : 
     921                 :       4962 : int tls1_final_finish_mac(SSL *s,
     922                 :            :              const char *str, int slen, unsigned char *out)
     923                 :            :         {
     924                 :            :         unsigned int i;
     925                 :            :         EVP_MD_CTX ctx;
     926                 :            :         unsigned char buf[2*EVP_MAX_MD_SIZE];
     927                 :            :         unsigned char *q,buf2[12];
     928                 :            :         int idx;
     929                 :            :         long mask;
     930                 :       4962 :         int err=0;
     931                 :            :         const EVP_MD *md; 
     932                 :            : 
     933                 :       4962 :         q=buf;
     934                 :            : 
     935         [ -  + ]:       4962 :         if (s->s3->handshake_buffer) 
     936         [ #  # ]:          0 :                 if (!ssl3_digest_cached_records(s))
     937                 :            :                         return 0;
     938                 :            : 
     939                 :       4962 :         EVP_MD_CTX_init(&ctx);
     940                 :            : 
     941         [ +  + ]:      34734 :         for (idx=0;ssl_get_handshake_digest(idx,&mask,&md);idx++)
     942                 :            :                 {
     943         [ +  + ]:      29772 :                 if (mask & ssl_get_algorithm2(s))
     944                 :            :                         {
     945                 :       8724 :                         int hashsize = EVP_MD_size(md);
     946                 :       8724 :                         EVP_MD_CTX *hdgst = s->s3->handshake_dgst[idx];
     947 [ +  - ][ +  - ]:       8724 :                         if (!hdgst || hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf)))
     948                 :            :                                 {
     949                 :            :                                 /* internal error: 'buf' is too small for this cipersuite! */
     950                 :            :                                 err = 1;
     951                 :            :                                 }
     952                 :            :                         else
     953                 :            :                                 {
     954   [ +  -  +  - ]:      17448 :                                 if (!EVP_MD_CTX_copy_ex(&ctx, hdgst) ||
     955         [ -  + ]:      17448 :                                         !EVP_DigestFinal_ex(&ctx,q,&i) ||
     956                 :       8724 :                                         (i != (unsigned int)hashsize))
     957                 :            :                                         err = 1;
     958                 :       8724 :                                 q+=hashsize;
     959                 :            :                                 }
     960                 :            :                         }
     961                 :            :                 }
     962                 :            :                 
     963         [ -  + ]:       4962 :         if (!tls1_PRF(ssl_get_algorithm2(s),
     964                 :       4962 :                         str,slen, buf,(int)(q-buf), NULL,0, NULL,0, NULL,0,
     965                 :       9924 :                         s->session->master_key,s->session->master_key_length,
     966                 :            :                         out,buf2,sizeof buf2))
     967                 :          0 :                 err = 1;
     968                 :       4962 :         EVP_MD_CTX_cleanup(&ctx);
     969                 :            : 
     970         [ +  - ]:       4962 :         if (err)
     971                 :            :                 return 0;
     972                 :            :         else
     973                 :       4962 :                 return sizeof buf2;
     974                 :            :         }
     975                 :            : 
     976                 :      26110 : int tls1_mac(SSL *ssl, unsigned char *md, int send)
     977                 :            :         {
     978                 :            :         SSL3_RECORD *rec;
     979                 :            :         unsigned char *seq;
     980                 :            :         EVP_MD_CTX *hash;
     981                 :            :         size_t md_size;
     982                 :            :         int i;
     983                 :            :         EVP_MD_CTX hmac, *mac_ctx;
     984                 :            :         unsigned char header[13];
     985         [ +  + ]:      26110 :         int stream_mac = (send?(ssl->mac_flags & SSL_MAC_FLAG_WRITE_MAC_STREAM):(ssl->mac_flags&SSL_MAC_FLAG_READ_MAC_STREAM));
     986                 :            :         int t;
     987                 :            : 
     988         [ +  + ]:      26110 :         if (send)
     989                 :            :                 {
     990                 :      13673 :                 rec= &(ssl->s3->wrec);
     991                 :      13673 :                 seq= &(ssl->s3->write_sequence[0]);
     992                 :      13673 :                 hash=ssl->write_hash;
     993                 :            :                 }
     994                 :            :         else
     995                 :            :                 {
     996                 :      12437 :                 rec= &(ssl->s3->rrec);
     997                 :      12437 :                 seq= &(ssl->s3->read_sequence[0]);
     998                 :      12437 :                 hash=ssl->read_hash;
     999                 :            :                 }
    1000                 :            : 
    1001                 :      26110 :         t=EVP_MD_CTX_size(hash);
    1002         [ -  + ]:      26110 :         OPENSSL_assert(t >= 0);
    1003                 :      26110 :         md_size=t;
    1004                 :            : 
    1005                 :            :         /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */
    1006         [ +  - ]:      26110 :         if (stream_mac) 
    1007                 :            :                 {
    1008                 :            :                         mac_ctx = hash;
    1009                 :            :                 }
    1010                 :            :                 else
    1011                 :            :                 {
    1012         [ +  - ]:      26110 :                         if (!EVP_MD_CTX_copy(&hmac,hash))
    1013                 :            :                                 return -1;
    1014                 :            :                         mac_ctx = &hmac;
    1015                 :            :                 }
    1016                 :            : 
    1017         [ -  + ]:      26110 :         if (SSL_IS_DTLS(ssl))
    1018                 :            :                 {
    1019                 :          0 :                 unsigned char dtlsseq[8],*p=dtlsseq;
    1020                 :            : 
    1021 [ #  # ][ #  # ]:          0 :                 s2n(send?ssl->d1->w_epoch:ssl->d1->r_epoch, p);
    1022                 :          0 :                 memcpy (p,&seq[2],6);
    1023                 :            : 
    1024                 :            :                 memcpy(header, dtlsseq, 8);
    1025                 :            :                 }
    1026                 :            :         else
    1027                 :            :                 memcpy(header, seq, 8);
    1028                 :            : 
    1029                 :      26110 :         header[8]=rec->type;
    1030                 :      26110 :         header[9]=(unsigned char)(ssl->version>>8);
    1031                 :      26110 :         header[10]=(unsigned char)(ssl->version);
    1032                 :      26110 :         header[11]=(rec->length)>>8;
    1033                 :      26110 :         header[12]=(rec->length)&0xff;
    1034                 :            : 
    1035         [ +  + ]:      26110 :         if (!send && !SSL_USE_ETM(ssl) &&
           [ -  +  #  # ]
    1036         [ #  # ]:          0 :             EVP_CIPHER_CTX_mode(ssl->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
    1037                 :          0 :             ssl3_cbc_record_digest_supported(mac_ctx))
    1038                 :            :                 {
    1039                 :            :                 /* This is a CBC-encrypted record. We must avoid leaking any
    1040                 :            :                  * timing-side channel information about how many blocks of
    1041                 :            :                  * data we are hashing because that gives an attacker a
    1042                 :            :                  * timing-oracle. */
    1043                 :          0 :                 ssl3_cbc_digest_record(
    1044                 :            :                         mac_ctx,
    1045                 :            :                         md, &md_size,
    1046                 :          0 :                         header, rec->input,
    1047                 :          0 :                         rec->length + md_size, rec->orig_len,
    1048                 :          0 :                         ssl->s3->read_mac_secret,
    1049                 :          0 :                         ssl->s3->read_mac_secret_size,
    1050                 :            :                         0 /* not SSLv3 */);
    1051                 :            :                 }
    1052                 :            :         else
    1053                 :            :                 {
    1054                 :      26110 :                 EVP_DigestSignUpdate(mac_ctx,header,sizeof(header));
    1055                 :      26110 :                 EVP_DigestSignUpdate(mac_ctx,rec->input,rec->length);
    1056                 :      26110 :                 t=EVP_DigestSignFinal(mac_ctx,md,&md_size);
    1057         [ -  + ]:      26110 :                 OPENSSL_assert(t > 0);
    1058                 :            : #ifdef OPENSSL_FIPS
    1059                 :            :                 if (!send && !SSL_USE_ETM(ssl) && FIPS_mode())
    1060                 :            :                         tls_fips_digest_extra(
    1061                 :            :                                         ssl->enc_read_ctx,
    1062                 :            :                                         mac_ctx, rec->input,
    1063                 :            :                                         rec->length, rec->orig_len);
    1064                 :            : #endif
    1065                 :            :                 }
    1066                 :            :                 
    1067         [ +  - ]:      26110 :         if (!stream_mac)
    1068                 :      26110 :                 EVP_MD_CTX_cleanup(&hmac);
    1069                 :            : #ifdef TLS_DEBUG
    1070                 :            : printf("seq=");
    1071                 :            : {int z; for (z=0; z<8; z++) printf("%02X ",seq[z]); printf("\n"); }
    1072                 :            : printf("rec=");
    1073                 :            : {unsigned int z; for (z=0; z<rec->length; z++) printf("%02X ",rec->data[z]); printf("\n"); }
    1074                 :            : #endif
    1075                 :            : 
    1076         [ +  - ]:      26110 :         if (!SSL_IS_DTLS(ssl))
    1077                 :            :                 {
    1078         [ +  - ]:      26174 :                 for (i=7; i>=0; i--)
    1079                 :            :                         {
    1080                 :      26174 :                         ++seq[i];
    1081         [ +  + ]:      26174 :                         if (seq[i] != 0) break; 
    1082                 :            :                         }
    1083                 :            :                 }
    1084                 :            : 
    1085                 :            : #ifdef TLS_DEBUG
    1086                 :            : {unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",md[z]); printf("\n"); }
    1087                 :            : #endif
    1088                 :      26110 :         return(md_size);
    1089                 :            :         }
    1090                 :            : 
    1091                 :       1632 : int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
    1092                 :            :              int len)
    1093                 :            :         {
    1094                 :            :         unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH];
    1095                 :       1632 :         const void *co = NULL, *so = NULL;
    1096                 :       1632 :         int col = 0, sol = 0;
    1097                 :            : 
    1098                 :            : 
    1099                 :            : #ifdef KSSL_DEBUG
    1100                 :            :         printf ("tls1_generate_master_secret(%p,%p, %p, %d)\n", s,out, p,len);
    1101                 :            : #endif  /* KSSL_DEBUG */
    1102                 :            : 
    1103                 :            : #ifdef TLSEXT_TYPE_opaque_prf_input
    1104                 :            :         if (s->s3->client_opaque_prf_input != NULL && s->s3->server_opaque_prf_input != NULL &&
    1105                 :            :             s->s3->client_opaque_prf_input_len > 0 &&
    1106                 :            :             s->s3->client_opaque_prf_input_len == s->s3->server_opaque_prf_input_len)
    1107                 :            :                 {
    1108                 :            :                 co = s->s3->client_opaque_prf_input;
    1109                 :            :                 col = s->s3->server_opaque_prf_input_len;
    1110                 :            :                 so = s->s3->server_opaque_prf_input;
    1111                 :            :                 sol = s->s3->client_opaque_prf_input_len; /* must be same as col (see draft-rescorla-tls-opaque-prf-input-00.txt, section 3.1) */
    1112                 :            :                 }
    1113                 :            : #endif
    1114                 :            : 
    1115                 :       1632 :         tls1_PRF(ssl_get_algorithm2(s),
    1116                 :            :                 TLS_MD_MASTER_SECRET_CONST,TLS_MD_MASTER_SECRET_CONST_SIZE,
    1117                 :       1632 :                 s->s3->client_random,SSL3_RANDOM_SIZE,
    1118                 :            :                 co, col,
    1119                 :       1632 :                 s->s3->server_random,SSL3_RANDOM_SIZE,
    1120                 :            :                 so, sol,
    1121                 :            :                 p,len,
    1122                 :       1632 :                 s->session->master_key,buff,sizeof buff);
    1123                 :            : #ifdef SSL_DEBUG
    1124                 :            :         fprintf(stderr, "Premaster Secret:\n");
    1125                 :            :         BIO_dump_fp(stderr, (char *)p, len);
    1126                 :            :         fprintf(stderr, "Client Random:\n");
    1127                 :            :         BIO_dump_fp(stderr, (char *)s->s3->client_random, SSL3_RANDOM_SIZE);
    1128                 :            :         fprintf(stderr, "Server Random:\n");
    1129                 :            :         BIO_dump_fp(stderr, (char *)s->s3->server_random, SSL3_RANDOM_SIZE);
    1130                 :            :         fprintf(stderr, "Master Secret:\n");
    1131                 :            :         BIO_dump_fp(stderr, (char *)s->session->master_key, SSL3_MASTER_SECRET_SIZE);
    1132                 :            : #endif
    1133                 :            : 
    1134                 :            : #ifdef OPENSSL_SSL_TRACE_CRYPTO
    1135                 :            :         if (s->msg_callback)
    1136                 :            :                 {
    1137                 :            :                 s->msg_callback(2, s->version, TLS1_RT_CRYPTO_PREMASTER,
    1138                 :            :                                                 p, len, s, s->msg_callback_arg);
    1139                 :            :                 s->msg_callback(2, s->version, TLS1_RT_CRYPTO_CLIENT_RANDOM,
    1140                 :            :                                         s->s3->client_random, SSL3_RANDOM_SIZE,
    1141                 :            :                                                 s, s->msg_callback_arg);
    1142                 :            :                 s->msg_callback(2, s->version, TLS1_RT_CRYPTO_SERVER_RANDOM,
    1143                 :            :                                         s->s3->server_random, SSL3_RANDOM_SIZE,
    1144                 :            :                                         s, s->msg_callback_arg);
    1145                 :            :                 s->msg_callback(2, s->version, TLS1_RT_CRYPTO_MASTER,
    1146                 :            :                                         s->session->master_key,
    1147                 :            :                                         SSL3_MASTER_SECRET_SIZE,
    1148                 :            :                                         s, s->msg_callback_arg);
    1149                 :            :                 }
    1150                 :            : #endif
    1151                 :            : 
    1152                 :            : #ifdef KSSL_DEBUG
    1153                 :            :         printf ("tls1_generate_master_secret() complete\n");
    1154                 :            : #endif  /* KSSL_DEBUG */
    1155                 :       1632 :         return(SSL3_MASTER_SECRET_SIZE);
    1156                 :            :         }
    1157                 :            : 
    1158                 :          0 : int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen,
    1159                 :            :          const char *label, size_t llen, const unsigned char *context,
    1160                 :            :          size_t contextlen, int use_context)
    1161                 :            :         {
    1162                 :            :         unsigned char *buff;
    1163                 :          0 :         unsigned char *val = NULL;
    1164                 :            :         size_t vallen, currentvalpos;
    1165                 :            :         int rv;
    1166                 :            : 
    1167                 :            : #ifdef KSSL_DEBUG
    1168                 :            :         printf ("tls1_export_keying_material(%p,%p,%d,%s,%d,%p,%d)\n", s, out, olen, label, llen, context, contextlen);
    1169                 :            : #endif  /* KSSL_DEBUG */
    1170                 :            : 
    1171                 :          0 :         buff = OPENSSL_malloc(olen);
    1172         [ #  # ]:          0 :         if (buff == NULL) goto err2;
    1173                 :            : 
    1174                 :            :         /* construct PRF arguments
    1175                 :            :          * we construct the PRF argument ourself rather than passing separate
    1176                 :            :          * values into the TLS PRF to ensure that the concatenation of values
    1177                 :            :          * does not create a prohibited label.
    1178                 :            :          */
    1179                 :          0 :         vallen = llen + SSL3_RANDOM_SIZE * 2;
    1180         [ #  # ]:          0 :         if (use_context)
    1181                 :            :                 {
    1182                 :          0 :                 vallen += 2 + contextlen;
    1183                 :            :                 }
    1184                 :            : 
    1185                 :          0 :         val = OPENSSL_malloc(vallen);
    1186         [ #  # ]:          0 :         if (val == NULL) goto err2;
    1187                 :          0 :         currentvalpos = 0;
    1188                 :          0 :         memcpy(val + currentvalpos, (unsigned char *) label, llen);
    1189                 :          0 :         currentvalpos += llen;
    1190                 :          0 :         memcpy(val + currentvalpos, s->s3->client_random, SSL3_RANDOM_SIZE);
    1191                 :          0 :         currentvalpos += SSL3_RANDOM_SIZE;
    1192                 :          0 :         memcpy(val + currentvalpos, s->s3->server_random, SSL3_RANDOM_SIZE);
    1193                 :          0 :         currentvalpos += SSL3_RANDOM_SIZE;
    1194                 :            : 
    1195         [ #  # ]:          0 :         if (use_context)
    1196                 :            :                 {
    1197                 :          0 :                 val[currentvalpos] = (contextlen >> 8) & 0xff;
    1198                 :          0 :                 currentvalpos++;
    1199                 :          0 :                 val[currentvalpos] = contextlen & 0xff;
    1200                 :          0 :                 currentvalpos++;
    1201         [ #  # ]:          0 :                 if ((contextlen > 0) || (context != NULL))
    1202                 :            :                         {
    1203                 :          0 :                         memcpy(val + currentvalpos, context, contextlen);
    1204                 :            :                         }
    1205                 :            :                 }
    1206                 :            : 
    1207                 :            :         /* disallow prohibited labels
    1208                 :            :          * note that SSL3_RANDOM_SIZE > max(prohibited label len) =
    1209                 :            :          * 15, so size of val > max(prohibited label len) = 15 and the
    1210                 :            :          * comparisons won't have buffer overflow
    1211                 :            :          */
    1212         [ #  # ]:          0 :         if (memcmp(val, TLS_MD_CLIENT_FINISH_CONST,
    1213                 :            :                  TLS_MD_CLIENT_FINISH_CONST_SIZE) == 0) goto err1;
    1214         [ #  # ]:          0 :         if (memcmp(val, TLS_MD_SERVER_FINISH_CONST,
    1215                 :            :                  TLS_MD_SERVER_FINISH_CONST_SIZE) == 0) goto err1;
    1216         [ #  # ]:          0 :         if (memcmp(val, TLS_MD_MASTER_SECRET_CONST,
    1217                 :            :                  TLS_MD_MASTER_SECRET_CONST_SIZE) == 0) goto err1;
    1218         [ #  # ]:          0 :         if (memcmp(val, TLS_MD_KEY_EXPANSION_CONST,
    1219                 :            :                  TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0) goto err1;
    1220                 :            : 
    1221                 :          0 :         rv = tls1_PRF(ssl_get_algorithm2(s),
    1222                 :            :                       val, vallen,
    1223                 :            :                       NULL, 0,
    1224                 :            :                       NULL, 0,
    1225                 :            :                       NULL, 0,
    1226                 :            :                       NULL, 0,
    1227                 :          0 :                       s->session->master_key,s->session->master_key_length,
    1228                 :            :                       out,buff,olen);
    1229                 :            : 
    1230                 :            : #ifdef KSSL_DEBUG
    1231                 :            :         printf ("tls1_export_keying_material() complete\n");
    1232                 :            : #endif  /* KSSL_DEBUG */
    1233                 :          0 :         goto ret;
    1234                 :            : err1:
    1235                 :          0 :         SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL);
    1236                 :          0 :         rv = 0;
    1237                 :          0 :         goto ret;
    1238                 :            : err2:
    1239                 :          0 :         SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, ERR_R_MALLOC_FAILURE);
    1240                 :          0 :         rv = 0;
    1241                 :            : ret:
    1242         [ #  # ]:          0 :         if (buff != NULL) OPENSSL_free(buff);
    1243         [ #  # ]:          0 :         if (val != NULL) OPENSSL_free(val);
    1244                 :          0 :         return(rv);
    1245                 :            :         }
    1246                 :            : 
    1247         [ -  + ]:       3308 : int tls1_alert_code(int code)
    1248                 :            :         {
    1249                 :            :         switch (code)
    1250                 :            :                 {
    1251                 :            :         case SSL_AD_CLOSE_NOTIFY:       return(SSL3_AD_CLOSE_NOTIFY);
    1252                 :            :         case SSL_AD_UNEXPECTED_MESSAGE: return(SSL3_AD_UNEXPECTED_MESSAGE);
    1253                 :            :         case SSL_AD_BAD_RECORD_MAC:     return(SSL3_AD_BAD_RECORD_MAC);
    1254                 :            :         case SSL_AD_DECRYPTION_FAILED:  return(TLS1_AD_DECRYPTION_FAILED);
    1255                 :            :         case SSL_AD_RECORD_OVERFLOW:    return(TLS1_AD_RECORD_OVERFLOW);
    1256                 :            :         case SSL_AD_DECOMPRESSION_FAILURE:return(SSL3_AD_DECOMPRESSION_FAILURE);
    1257                 :            :         case SSL_AD_HANDSHAKE_FAILURE:  return(SSL3_AD_HANDSHAKE_FAILURE);
    1258                 :            :         case SSL_AD_NO_CERTIFICATE:     return(-1);
    1259                 :            :         case SSL_AD_BAD_CERTIFICATE:    return(SSL3_AD_BAD_CERTIFICATE);
    1260                 :            :         case SSL_AD_UNSUPPORTED_CERTIFICATE:return(SSL3_AD_UNSUPPORTED_CERTIFICATE);
    1261                 :            :         case SSL_AD_CERTIFICATE_REVOKED:return(SSL3_AD_CERTIFICATE_REVOKED);
    1262                 :            :         case SSL_AD_CERTIFICATE_EXPIRED:return(SSL3_AD_CERTIFICATE_EXPIRED);
    1263                 :            :         case SSL_AD_CERTIFICATE_UNKNOWN:return(SSL3_AD_CERTIFICATE_UNKNOWN);
    1264                 :            :         case SSL_AD_ILLEGAL_PARAMETER:  return(SSL3_AD_ILLEGAL_PARAMETER);
    1265                 :            :         case SSL_AD_UNKNOWN_CA:         return(TLS1_AD_UNKNOWN_CA);
    1266                 :            :         case SSL_AD_ACCESS_DENIED:      return(TLS1_AD_ACCESS_DENIED);
    1267                 :            :         case SSL_AD_DECODE_ERROR:       return(TLS1_AD_DECODE_ERROR);
    1268                 :            :         case SSL_AD_DECRYPT_ERROR:      return(TLS1_AD_DECRYPT_ERROR);
    1269                 :            :         case SSL_AD_EXPORT_RESTRICTION: return(TLS1_AD_EXPORT_RESTRICTION);
    1270                 :            :         case SSL_AD_PROTOCOL_VERSION:   return(TLS1_AD_PROTOCOL_VERSION);
    1271                 :            :         case SSL_AD_INSUFFICIENT_SECURITY:return(TLS1_AD_INSUFFICIENT_SECURITY);
    1272                 :            :         case SSL_AD_INTERNAL_ERROR:     return(TLS1_AD_INTERNAL_ERROR);
    1273                 :            :         case SSL_AD_USER_CANCELLED:     return(TLS1_AD_USER_CANCELLED);
    1274                 :            :         case SSL_AD_NO_RENEGOTIATION:   return(TLS1_AD_NO_RENEGOTIATION);
    1275                 :            :         case SSL_AD_UNSUPPORTED_EXTENSION: return(TLS1_AD_UNSUPPORTED_EXTENSION);
    1276                 :            :         case SSL_AD_CERTIFICATE_UNOBTAINABLE: return(TLS1_AD_CERTIFICATE_UNOBTAINABLE);
    1277                 :            :         case SSL_AD_UNRECOGNIZED_NAME:  return(TLS1_AD_UNRECOGNIZED_NAME);
    1278                 :            :         case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE: return(TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE);
    1279                 :            :         case SSL_AD_BAD_CERTIFICATE_HASH_VALUE: return(TLS1_AD_BAD_CERTIFICATE_HASH_VALUE);
    1280                 :            :         case SSL_AD_UNKNOWN_PSK_IDENTITY:return(TLS1_AD_UNKNOWN_PSK_IDENTITY);
    1281                 :            : #if 0 /* not appropriate for TLS, not used for DTLS */
    1282                 :            :         case DTLS1_AD_MISSING_HANDSHAKE_MESSAGE: return 
    1283                 :            :                                           (DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
    1284                 :            : #endif
    1285                 :            :         default:                        return(-1);
    1286                 :            :                 }
    1287                 :            :         }

Generated by: LCOV version 1.9