LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/ssl - t1_lib.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 837 1728 48.4 %
Date: 2014-08-02 Functions: 54 70 77.1 %
Branches: 525 1477 35.5 %

           Branch data     Line data    Source code
       1                 :            : /* ssl/t1_lib.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                 :            : #include <stdio.h>
     113                 :            : #include <openssl/objects.h>
     114                 :            : #include <openssl/evp.h>
     115                 :            : #include <openssl/hmac.h>
     116                 :            : #include <openssl/ocsp.h>
     117                 :            : #include <openssl/rand.h>
     118                 :            : #ifndef OPENSSL_NO_DH
     119                 :            : #include <openssl/dh.h>
     120                 :            : #include <openssl/bn.h>
     121                 :            : #endif
     122                 :            : #include "ssl_locl.h"
     123                 :            : 
     124                 :            : const char tls1_version_str[]="TLSv1" OPENSSL_VERSION_PTEXT;
     125                 :            : 
     126                 :            : #ifndef OPENSSL_NO_TLSEXT
     127                 :            : static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen,
     128                 :            :                                 const unsigned char *sess_id, int sesslen,
     129                 :            :                                 SSL_SESSION **psess);
     130                 :            : static int ssl_check_clienthello_tlsext_early(SSL *s);
     131                 :            : int ssl_check_serverhello_tlsext(SSL *s);
     132                 :            : #endif
     133                 :            : 
     134                 :            : SSL3_ENC_METHOD const TLSv1_enc_data={
     135                 :            :         tls1_enc,
     136                 :            :         tls1_mac,
     137                 :            :         tls1_setup_key_block,
     138                 :            :         tls1_generate_master_secret,
     139                 :            :         tls1_change_cipher_state,
     140                 :            :         tls1_final_finish_mac,
     141                 :            :         TLS1_FINISH_MAC_LENGTH,
     142                 :            :         tls1_cert_verify_mac,
     143                 :            :         TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
     144                 :            :         TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
     145                 :            :         tls1_alert_code,
     146                 :            :         tls1_export_keying_material,
     147                 :            :         0,
     148                 :            :         SSL3_HM_HEADER_LENGTH,
     149                 :            :         ssl3_set_handshake_header,
     150                 :            :         ssl3_handshake_write
     151                 :            :         };
     152                 :            : 
     153                 :            : SSL3_ENC_METHOD const TLSv1_1_enc_data={
     154                 :            :         tls1_enc,
     155                 :            :         tls1_mac,
     156                 :            :         tls1_setup_key_block,
     157                 :            :         tls1_generate_master_secret,
     158                 :            :         tls1_change_cipher_state,
     159                 :            :         tls1_final_finish_mac,
     160                 :            :         TLS1_FINISH_MAC_LENGTH,
     161                 :            :         tls1_cert_verify_mac,
     162                 :            :         TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
     163                 :            :         TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
     164                 :            :         tls1_alert_code,
     165                 :            :         tls1_export_keying_material,
     166                 :            :         SSL_ENC_FLAG_EXPLICIT_IV,
     167                 :            :         SSL3_HM_HEADER_LENGTH,
     168                 :            :         ssl3_set_handshake_header,
     169                 :            :         ssl3_handshake_write
     170                 :            :         };
     171                 :            : 
     172                 :            : SSL3_ENC_METHOD const TLSv1_2_enc_data={
     173                 :            :         tls1_enc,
     174                 :            :         tls1_mac,
     175                 :            :         tls1_setup_key_block,
     176                 :            :         tls1_generate_master_secret,
     177                 :            :         tls1_change_cipher_state,
     178                 :            :         tls1_final_finish_mac,
     179                 :            :         TLS1_FINISH_MAC_LENGTH,
     180                 :            :         tls1_cert_verify_mac,
     181                 :            :         TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE,
     182                 :            :         TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE,
     183                 :            :         tls1_alert_code,
     184                 :            :         tls1_export_keying_material,
     185                 :            :         SSL_ENC_FLAG_EXPLICIT_IV|SSL_ENC_FLAG_SIGALGS|SSL_ENC_FLAG_SHA256_PRF
     186                 :            :                 |SSL_ENC_FLAG_TLS1_2_CIPHERS,
     187                 :            :         SSL3_HM_HEADER_LENGTH,
     188                 :            :         ssl3_set_handshake_header,
     189                 :            :         ssl3_handshake_write
     190                 :            :         };
     191                 :            : 
     192                 :        616 : long tls1_default_timeout(void)
     193                 :            :         {
     194                 :            :         /* 2 hours, the 24 hours mentioned in the TLSv1 spec
     195                 :            :          * is way too long for http, the cache would over fill */
     196                 :        616 :         return(60*60*2);
     197                 :            :         }
     198                 :            : 
     199                 :       1038 : int tls1_new(SSL *s)
     200                 :            :         {
     201         [ +  - ]:       1038 :         if (!ssl3_new(s)) return(0);
     202                 :       1038 :         s->method->ssl_clear(s);
     203                 :       1038 :         return(1);
     204                 :            :         }
     205                 :            : 
     206                 :       1038 : void tls1_free(SSL *s)
     207                 :            :         {
     208                 :            : #ifndef OPENSSL_NO_TLSEXT
     209         [ -  + ]:       1038 :         if (s->tlsext_session_ticket)
     210                 :            :                 {
     211                 :          0 :                 OPENSSL_free(s->tlsext_session_ticket);
     212                 :            :                 }
     213                 :            : #endif /* OPENSSL_NO_TLSEXT */
     214                 :       1038 :         ssl3_free(s);
     215                 :       1038 :         }
     216                 :            : 
     217                 :       4768 : void tls1_clear(SSL *s)
     218                 :            :         {
     219                 :       4768 :         ssl3_clear(s);
     220                 :       4768 :         s->version = s->method->version;
     221                 :       4768 :         }
     222                 :            : 
     223                 :            : #ifndef OPENSSL_NO_EC
     224                 :            : 
     225                 :            : typedef struct
     226                 :            :         {
     227                 :            :         int nid;                /* Curve NID */
     228                 :            :         int secbits;            /* Bits of security (from SP800-57) */
     229                 :            :         unsigned int flags;     /* Flags: currently just field type */
     230                 :            :         } tls_curve_info;
     231                 :            : 
     232                 :            : #define TLS_CURVE_CHAR2         0x1
     233                 :            : #define TLS_CURVE_PRIME         0x0
     234                 :            : 
     235                 :            : static tls_curve_info nid_list[] =
     236                 :            :         {
     237                 :            :                 {NID_sect163k1, 80, TLS_CURVE_CHAR2},/* sect163k1 (1) */
     238                 :            :                 {NID_sect163r1, 80, TLS_CURVE_CHAR2},/* sect163r1 (2) */
     239                 :            :                 {NID_sect163r2, 80, TLS_CURVE_CHAR2},/* sect163r2 (3) */
     240                 :            :                 {NID_sect193r1, 80, TLS_CURVE_CHAR2},/* sect193r1 (4) */ 
     241                 :            :                 {NID_sect193r2, 80, TLS_CURVE_CHAR2},/* sect193r2 (5) */ 
     242                 :            :                 {NID_sect233k1, 112, TLS_CURVE_CHAR2},/* sect233k1 (6) */
     243                 :            :                 {NID_sect233r1, 112, TLS_CURVE_CHAR2},/* sect233r1 (7) */ 
     244                 :            :                 {NID_sect239k1, 112, TLS_CURVE_CHAR2},/* sect239k1 (8) */ 
     245                 :            :                 {NID_sect283k1, 128, TLS_CURVE_CHAR2},/* sect283k1 (9) */
     246                 :            :                 {NID_sect283r1, 128, TLS_CURVE_CHAR2},/* sect283r1 (10) */ 
     247                 :            :                 {NID_sect409k1, 192, TLS_CURVE_CHAR2},/* sect409k1 (11) */ 
     248                 :            :                 {NID_sect409r1, 192, TLS_CURVE_CHAR2},/* sect409r1 (12) */
     249                 :            :                 {NID_sect571k1, 256, TLS_CURVE_CHAR2},/* sect571k1 (13) */ 
     250                 :            :                 {NID_sect571r1, 256, TLS_CURVE_CHAR2},/* sect571r1 (14) */ 
     251                 :            :                 {NID_secp160k1, 80, TLS_CURVE_PRIME},/* secp160k1 (15) */
     252                 :            :                 {NID_secp160r1, 80, TLS_CURVE_PRIME},/* secp160r1 (16) */ 
     253                 :            :                 {NID_secp160r2, 80, TLS_CURVE_PRIME},/* secp160r2 (17) */ 
     254                 :            :                 {NID_secp192k1, 80, TLS_CURVE_PRIME},/* secp192k1 (18) */
     255                 :            :                 {NID_X9_62_prime192v1, 80, TLS_CURVE_PRIME},/* secp192r1 (19) */ 
     256                 :            :                 {NID_secp224k1, 112, TLS_CURVE_PRIME},/* secp224k1 (20) */ 
     257                 :            :                 {NID_secp224r1, 112, TLS_CURVE_PRIME},/* secp224r1 (21) */
     258                 :            :                 {NID_secp256k1, 128, TLS_CURVE_PRIME},/* secp256k1 (22) */ 
     259                 :            :                 {NID_X9_62_prime256v1, 128, TLS_CURVE_PRIME},/* secp256r1 (23) */ 
     260                 :            :                 {NID_secp384r1, 192, TLS_CURVE_PRIME},/* secp384r1 (24) */
     261                 :            :                 {NID_secp521r1, 256, TLS_CURVE_PRIME},/* secp521r1 (25) */      
     262                 :            :                 {NID_brainpoolP256r1, 128, TLS_CURVE_PRIME}, /* brainpoolP256r1 (26) */ 
     263                 :            :                 {NID_brainpoolP384r1, 192, TLS_CURVE_PRIME}, /* brainpoolP384r1 (27) */ 
     264                 :            :                 {NID_brainpoolP512r1, 256, TLS_CURVE_PRIME},/* brainpool512r1 (28) */   
     265                 :            :         };
     266                 :            : 
     267                 :            : 
     268                 :            : static const unsigned char ecformats_default[] = 
     269                 :            :         {
     270                 :            :         TLSEXT_ECPOINTFORMAT_uncompressed,
     271                 :            :         TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime,
     272                 :            :         TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2
     273                 :            :         };
     274                 :            : 
     275                 :            : static const unsigned char eccurves_default[] =
     276                 :            :         {
     277                 :            :                 0,14, /* sect571r1 (14) */ 
     278                 :            :                 0,13, /* sect571k1 (13) */ 
     279                 :            :                 0,25, /* secp521r1 (25) */      
     280                 :            :                 0,28, /* brainpool512r1 (28) */ 
     281                 :            :                 0,11, /* sect409k1 (11) */ 
     282                 :            :                 0,12, /* sect409r1 (12) */
     283                 :            :                 0,27, /* brainpoolP384r1 (27) */        
     284                 :            :                 0,24, /* secp384r1 (24) */
     285                 :            :                 0,9,  /* sect283k1 (9) */
     286                 :            :                 0,10, /* sect283r1 (10) */ 
     287                 :            :                 0,26, /* brainpoolP256r1 (26) */        
     288                 :            :                 0,22, /* secp256k1 (22) */ 
     289                 :            :                 0,23, /* secp256r1 (23) */ 
     290                 :            :                 0,8,  /* sect239k1 (8) */ 
     291                 :            :                 0,6,  /* sect233k1 (6) */
     292                 :            :                 0,7,  /* sect233r1 (7) */ 
     293                 :            :                 0,20, /* secp224k1 (20) */ 
     294                 :            :                 0,21, /* secp224r1 (21) */
     295                 :            :                 0,4,  /* sect193r1 (4) */ 
     296                 :            :                 0,5,  /* sect193r2 (5) */ 
     297                 :            :                 0,18, /* secp192k1 (18) */
     298                 :            :                 0,19, /* secp192r1 (19) */ 
     299                 :            :                 0,1,  /* sect163k1 (1) */
     300                 :            :                 0,2,  /* sect163r1 (2) */
     301                 :            :                 0,3,  /* sect163r2 (3) */
     302                 :            :                 0,15, /* secp160k1 (15) */
     303                 :            :                 0,16, /* secp160r1 (16) */ 
     304                 :            :                 0,17, /* secp160r2 (17) */ 
     305                 :            :         };
     306                 :            : 
     307                 :            : static const unsigned char suiteb_curves[] =
     308                 :            :         {
     309                 :            :                 0, TLSEXT_curve_P_256,
     310                 :            :                 0, TLSEXT_curve_P_384
     311                 :            :         };
     312                 :            : 
     313                 :        462 : int tls1_ec_curve_id2nid(int curve_id)
     314                 :            :         {
     315                 :            :         /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
     316         [ +  - ]:        462 :         if ((curve_id < 1) || ((unsigned int)curve_id >
     317                 :            :                                 sizeof(nid_list)/sizeof(nid_list[0])))
     318                 :            :                 return 0;
     319                 :        462 :         return nid_list[curve_id-1].nid;
     320                 :            :         }
     321                 :            : 
     322                 :       1012 : int tls1_ec_nid2curve_id(int nid)
     323                 :            :         {
     324                 :            :         /* ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) */
     325   [ -  +  -  -  :       1012 :         switch (nid)
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
             -  -  -  -  
                      - ]
     326                 :            :                 {
     327                 :            :         case NID_sect163k1: /* sect163k1 (1) */
     328                 :            :                 return 1;
     329                 :            :         case NID_sect163r1: /* sect163r1 (2) */
     330                 :          0 :                 return 2;
     331                 :            :         case NID_sect163r2: /* sect163r2 (3) */
     332                 :       1012 :                 return 3;
     333                 :            :         case NID_sect193r1: /* sect193r1 (4) */ 
     334                 :          0 :                 return 4;
     335                 :            :         case NID_sect193r2: /* sect193r2 (5) */ 
     336                 :          0 :                 return 5;
     337                 :            :         case NID_sect233k1: /* sect233k1 (6) */
     338                 :          0 :                 return 6;
     339                 :            :         case NID_sect233r1: /* sect233r1 (7) */ 
     340                 :          0 :                 return 7;
     341                 :            :         case NID_sect239k1: /* sect239k1 (8) */ 
     342                 :          0 :                 return 8;
     343                 :            :         case NID_sect283k1: /* sect283k1 (9) */
     344                 :          0 :                 return 9;
     345                 :            :         case NID_sect283r1: /* sect283r1 (10) */ 
     346                 :          0 :                 return 10;
     347                 :            :         case NID_sect409k1: /* sect409k1 (11) */ 
     348                 :          0 :                 return 11;
     349                 :            :         case NID_sect409r1: /* sect409r1 (12) */
     350                 :          0 :                 return 12;
     351                 :            :         case NID_sect571k1: /* sect571k1 (13) */ 
     352                 :          0 :                 return 13;
     353                 :            :         case NID_sect571r1: /* sect571r1 (14) */ 
     354                 :          0 :                 return 14;
     355                 :            :         case NID_secp160k1: /* secp160k1 (15) */
     356                 :          0 :                 return 15;
     357                 :            :         case NID_secp160r1: /* secp160r1 (16) */ 
     358                 :          0 :                 return 16;
     359                 :            :         case NID_secp160r2: /* secp160r2 (17) */ 
     360                 :          0 :                 return 17;
     361                 :            :         case NID_secp192k1: /* secp192k1 (18) */
     362                 :          0 :                 return 18;
     363                 :            :         case NID_X9_62_prime192v1: /* secp192r1 (19) */ 
     364                 :          0 :                 return 19;
     365                 :            :         case NID_secp224k1: /* secp224k1 (20) */ 
     366                 :          0 :                 return 20;
     367                 :            :         case NID_secp224r1: /* secp224r1 (21) */
     368                 :          0 :                 return 21;
     369                 :            :         case NID_secp256k1: /* secp256k1 (22) */ 
     370                 :          0 :                 return 22;
     371                 :            :         case NID_X9_62_prime256v1: /* secp256r1 (23) */ 
     372                 :          0 :                 return 23;
     373                 :            :         case NID_secp384r1: /* secp384r1 (24) */
     374                 :          0 :                 return 24;
     375                 :            :         case NID_secp521r1:  /* secp521r1 (25) */       
     376                 :          0 :                 return 25;
     377                 :            :         case NID_brainpoolP256r1:  /* brainpoolP256r1 (26) */
     378                 :          0 :                 return 26;
     379                 :            :         case NID_brainpoolP384r1:  /* brainpoolP384r1 (27) */
     380                 :          0 :                 return 27;
     381                 :            :         case NID_brainpoolP512r1:  /* brainpool512r1 (28) */
     382                 :          0 :                 return 28;
     383                 :            :         default:
     384                 :          0 :                 return 0;
     385                 :            :                 }
     386                 :            :         }
     387                 :            : /* Get curves list, if "sess" is set return client curves otherwise
     388                 :            :  * preferred list
     389                 :            :  */
     390                 :       2156 : static void tls1_get_curvelist(SSL *s, int sess,
     391                 :            :                                         const unsigned char **pcurves,
     392                 :            :                                         size_t *pcurveslen)
     393                 :            :         {
     394         [ +  + ]:       2156 :         if (sess)
     395                 :            :                 {
     396                 :        550 :                 *pcurves = s->session->tlsext_ellipticcurvelist;
     397                 :        550 :                 *pcurveslen = s->session->tlsext_ellipticcurvelist_length;
     398                 :        550 :                 return;
     399                 :            :                 }
     400                 :            :         /* For Suite B mode only include P-256, P-384 */
     401   [ -  -  -  + ]:       1606 :         switch (tls1_suiteb(s))
     402                 :            :                 {
     403                 :            :         case SSL_CERT_FLAG_SUITEB_128_LOS:
     404                 :          0 :                 *pcurves = suiteb_curves;
     405                 :          0 :                 *pcurveslen = sizeof(suiteb_curves);
     406                 :          0 :                 break;
     407                 :            : 
     408                 :            :         case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY:
     409                 :          0 :                 *pcurves = suiteb_curves;
     410                 :          0 :                 *pcurveslen = 2;
     411                 :          0 :                 break;
     412                 :            : 
     413                 :            :         case SSL_CERT_FLAG_SUITEB_192_LOS:
     414                 :          0 :                 *pcurves = suiteb_curves + 2;
     415                 :          0 :                 *pcurveslen = 2;
     416                 :          0 :                 break;
     417                 :            :         default:
     418                 :       1606 :                 *pcurves = s->tlsext_ellipticcurvelist;
     419                 :       1606 :                 *pcurveslen = s->tlsext_ellipticcurvelist_length;
     420                 :            :                 }
     421         [ +  - ]:       1606 :         if (!*pcurves)
     422                 :            :                 {
     423                 :       1606 :                 *pcurves = eccurves_default;
     424                 :       1606 :                 *pcurveslen = sizeof(eccurves_default);
     425                 :            :                 }
     426                 :            :         }
     427                 :            : 
     428                 :            : /* See if curve is allowed by security callback */
     429                 :      17094 : static int tls_curve_allowed(SSL *s, const unsigned char *curve, int op)
     430                 :            :         {
     431                 :            :         tls_curve_info *cinfo;
     432         [ +  - ]:      17094 :         if (curve[0])
     433                 :            :                 return 1;
     434         [ +  - ]:      17094 :         if ((curve[1] < 1) || ((size_t)curve[1] >
     435                 :            :                                 sizeof(nid_list)/sizeof(nid_list[0])))
     436                 :            :                 return 0;
     437                 :      17094 :         cinfo = &nid_list[curve[1]-1];
     438                 :      17094 :         return ssl_security(s, op, cinfo->secbits, cinfo->nid, (void *)curve);
     439                 :            :         }
     440                 :            : 
     441                 :            : /* Check a curve is one of our preferences */
     442                 :        462 : int tls1_check_curve(SSL *s, const unsigned char *p, size_t len)
     443                 :            :         {
     444                 :            :         const unsigned char *curves;
     445                 :            :         size_t curveslen, i;
     446                 :        462 :         unsigned int suiteb_flags = tls1_suiteb(s);
     447 [ +  - ][ +  - ]:        462 :         if (len != 3 || p[0] != NAMED_CURVE_TYPE)
     448                 :            :                 return 0;
     449                 :            :         /* Check curve matches Suite B preferences */
     450         [ -  + ]:        462 :         if (suiteb_flags)
     451                 :            :                 {
     452                 :          0 :                 unsigned long cid = s->s3->tmp.new_cipher->id;
     453         [ #  # ]:          0 :                 if (p[1])
     454                 :            :                         return 0;
     455         [ #  # ]:          0 :                 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
     456                 :            :                         {
     457         [ #  # ]:          0 :                         if (p[2] != TLSEXT_curve_P_256)
     458                 :            :                                 return 0;
     459                 :            :                         }
     460         [ #  # ]:          0 :                 else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
     461                 :            :                         {
     462         [ #  # ]:          0 :                         if (p[2] != TLSEXT_curve_P_384)
     463                 :            :                                 return 0;
     464                 :            :                         }
     465                 :            :                 else    /* Should never happen */
     466                 :            :                         return 0;
     467                 :            :                 }
     468                 :        462 :         tls1_get_curvelist(s, 0, &curves, &curveslen);
     469         [ +  - ]:      11550 :         for (i = 0; i < curveslen; i += 2, curves += 2)
     470                 :            :                 {
     471 [ +  - ][ +  + ]:      11550 :                 if (p[1] == curves[0] && p[2] == curves[1])
     472                 :        462 :                         return tls_curve_allowed(s, p + 1, SSL_SECOP_CURVE_CHECK);
     473                 :            :                 }
     474                 :            :         return 0;
     475                 :            :         }
     476                 :            : 
     477                 :            : /* Return nth shared curve. If nmatch == -1 return number of
     478                 :            :  * matches. For nmatch == -2 return the NID of the curve to use for
     479                 :            :  * an EC tmp key.
     480                 :            :  */
     481                 :            : 
     482                 :          0 : int tls1_shared_curve(SSL *s, int nmatch)
     483                 :            :         {
     484                 :            :         const unsigned char *pref, *supp;
     485                 :            :         size_t preflen, supplen, i, j;
     486                 :            :         int k;
     487                 :            :         /* Can't do anything on client side */
     488         [ #  # ]:          0 :         if (s->server == 0)
     489                 :            :                 return -1;
     490         [ #  # ]:          0 :         if (nmatch == -2)
     491                 :            :                 {
     492         [ #  # ]:          0 :                 if (tls1_suiteb(s))
     493                 :            :                         {
     494                 :            :                         /* For Suite B ciphersuite determines curve: we 
     495                 :            :                          * already know these are acceptable due to previous
     496                 :            :                          * checks.
     497                 :            :                          */
     498                 :          0 :                         unsigned long cid = s->s3->tmp.new_cipher->id;
     499         [ #  # ]:          0 :                         if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
     500                 :            :                                 return NID_X9_62_prime256v1; /* P-256 */
     501         [ #  # ]:          0 :                         if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
     502                 :            :                                 return NID_secp384r1; /* P-384 */
     503                 :            :                         /* Should never happen */
     504                 :          0 :                         return NID_undef;
     505                 :            :                         }
     506                 :            :                 /* If not Suite B just return first preference shared curve */
     507                 :            :                 nmatch = 0;
     508                 :            :                 }
     509                 :          0 :         tls1_get_curvelist(s, !!(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE),
     510                 :            :                                 &supp, &supplen);
     511                 :          0 :         tls1_get_curvelist(s, !(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE),
     512                 :            :                                 &pref, &preflen);
     513                 :          0 :         preflen /= 2;
     514                 :          0 :         supplen /= 2;
     515                 :          0 :         k = 0;
     516         [ #  # ]:          0 :         for (i = 0; i < preflen; i++, pref+=2)
     517                 :            :                 {
     518                 :          0 :                 const unsigned char *tsupp = supp;
     519         [ #  # ]:          0 :                 for (j = 0; j < supplen; j++, tsupp+=2)
     520                 :            :                         {
     521 [ #  # ][ #  # ]:          0 :                         if (pref[0] == tsupp[0] && pref[1] == tsupp[1])
     522                 :            :                                 {
     523         [ #  # ]:          0 :                                 if (!tls_curve_allowed(s, pref, SSL_SECOP_CURVE_SHARED))
     524                 :          0 :                                         continue;
     525         [ #  # ]:          0 :                                 if (nmatch == k)
     526                 :            :                                         {
     527                 :          0 :                                         int id = (pref[0] << 8) | pref[1];
     528                 :          0 :                                         return tls1_ec_curve_id2nid(id);
     529                 :            :                                         }
     530                 :          0 :                                 k++;
     531                 :            :                                 }
     532                 :            :                         }
     533                 :            :                 }
     534         [ #  # ]:          0 :         if (nmatch == -1)
     535                 :          0 :                 return k;
     536                 :            :         return 0;
     537                 :            :         }
     538                 :            : 
     539                 :          0 : int tls1_set_curves(unsigned char **pext, size_t *pextlen,
     540                 :            :                         int *curves, size_t ncurves)
     541                 :            :         {
     542                 :            :         unsigned char *clist, *p;
     543                 :            :         size_t i;
     544                 :            :         /* Bitmap of curves included to detect duplicates: only works
     545                 :            :          * while curve ids < 32 
     546                 :            :          */
     547                 :          0 :         unsigned long dup_list = 0;
     548                 :          0 :         clist = OPENSSL_malloc(ncurves * 2);
     549         [ #  # ]:          0 :         if (!clist)
     550                 :            :                 return 0;
     551         [ #  # ]:          0 :         for (i = 0, p = clist; i < ncurves; i++)
     552                 :            :                 {
     553                 :            :                 unsigned long idmask;
     554                 :            :                 int id;
     555                 :          0 :                 id = tls1_ec_nid2curve_id(curves[i]);
     556                 :          0 :                 idmask = 1L << id;
     557 [ #  # ][ #  # ]:          0 :                 if (!id || (dup_list & idmask))
     558                 :            :                         {
     559                 :          0 :                         OPENSSL_free(clist);
     560                 :          0 :                         return 0;
     561                 :            :                         }
     562                 :          0 :                 dup_list |= idmask;
     563                 :          0 :                 s2n(id, p);
     564                 :            :                 }
     565         [ #  # ]:          0 :         if (*pext)
     566                 :          0 :                 OPENSSL_free(*pext);
     567                 :          0 :         *pext = clist;
     568                 :          0 :         *pextlen = ncurves * 2;
     569                 :          0 :         return 1;
     570                 :            :         }
     571                 :            : 
     572                 :            : #define MAX_CURVELIST   28
     573                 :            : 
     574                 :            : typedef struct
     575                 :            :         {
     576                 :            :         size_t nidcnt;
     577                 :            :         int nid_arr[MAX_CURVELIST];
     578                 :            :         } nid_cb_st;
     579                 :            : 
     580                 :          0 : static int nid_cb(const char *elem, int len, void *arg)
     581                 :            :         {
     582                 :          0 :         nid_cb_st *narg = arg;
     583                 :            :         size_t i;
     584                 :            :         int nid;
     585                 :            :         char etmp[20];
     586         [ #  # ]:          0 :         if (narg->nidcnt == MAX_CURVELIST)
     587                 :            :                 return 0;
     588         [ #  # ]:          0 :         if (len > (int)(sizeof(etmp) - 1))
     589                 :            :                 return 0;
     590                 :          0 :         memcpy(etmp, elem, len);
     591                 :          0 :         etmp[len] = 0;
     592                 :          0 :         nid = EC_curve_nist2nid(etmp);
     593         [ #  # ]:          0 :         if (nid == NID_undef)
     594                 :          0 :                 nid = OBJ_sn2nid(etmp);
     595         [ #  # ]:          0 :         if (nid == NID_undef)
     596                 :          0 :                 nid = OBJ_ln2nid(etmp);
     597         [ #  # ]:          0 :         if (nid == NID_undef)
     598                 :            :                 return 0;
     599         [ #  # ]:          0 :         for (i = 0; i < narg->nidcnt; i++)
     600         [ #  # ]:          0 :                 if (narg->nid_arr[i] == nid)
     601                 :            :                         return 0;
     602                 :          0 :         narg->nid_arr[narg->nidcnt++] = nid;
     603                 :          0 :         return 1;
     604                 :            :         }
     605                 :            : /* Set curves based on a colon separate list */
     606                 :          0 : int tls1_set_curves_list(unsigned char **pext, size_t *pextlen, 
     607                 :            :                                 const char *str)
     608                 :            :         {
     609                 :            :         nid_cb_st ncb;
     610                 :          0 :         ncb.nidcnt = 0;
     611         [ #  # ]:          0 :         if (!CONF_parse_list(str, ':', 1, nid_cb, &ncb))
     612                 :            :                 return 0;
     613         [ #  # ]:          0 :         if (pext == NULL)
     614                 :            :                 return 1;
     615                 :          0 :         return tls1_set_curves(pext, pextlen, ncb.nid_arr, ncb.nidcnt);
     616                 :            :         }
     617                 :            : /* For an EC key set TLS id and required compression based on parameters */
     618                 :        550 : static int tls1_set_ec_id(unsigned char *curve_id, unsigned char *comp_id,
     619                 :            :                                 EC_KEY *ec)
     620                 :            :         {
     621                 :            :         int is_prime, id;
     622                 :            :         const EC_GROUP *grp;
     623                 :            :         const EC_METHOD *meth;
     624         [ +  - ]:        550 :         if (!ec)
     625                 :            :                 return 0;
     626                 :            :         /* Determine if it is a prime field */
     627                 :        550 :         grp = EC_KEY_get0_group(ec);
     628         [ +  - ]:        550 :         if (!grp)
     629                 :            :                 return 0;
     630                 :        550 :         meth = EC_GROUP_method_of(grp);
     631         [ +  - ]:        550 :         if (!meth)
     632                 :            :                 return 0;
     633         [ +  - ]:        550 :         if (EC_METHOD_get_field_type(meth) == NID_X9_62_prime_field)
     634                 :            :                 is_prime = 1;
     635                 :            :         else
     636                 :        550 :                 is_prime = 0;
     637                 :            :         /* Determine curve ID */
     638                 :        550 :         id = EC_GROUP_get_curve_name(grp);
     639                 :        550 :         id = tls1_ec_nid2curve_id(id);
     640                 :            :         /* If we have an ID set it, otherwise set arbitrary explicit curve */
     641         [ +  - ]:        550 :         if (id)
     642                 :            :                 {
     643                 :        550 :                 curve_id[0] = 0;
     644                 :        550 :                 curve_id[1] = (unsigned char)id;
     645                 :            :                 }
     646                 :            :         else
     647                 :            :                 {
     648                 :          0 :                 curve_id[0] = 0xff;
     649         [ #  # ]:          0 :                 if (is_prime)
     650                 :          0 :                         curve_id[1] = 0x01;
     651                 :            :                 else
     652                 :          0 :                         curve_id[1] = 0x02;
     653                 :            :                 }
     654         [ -  + ]:        550 :         if (comp_id)
     655                 :            :                 {
     656         [ #  # ]:          0 :                 if (EC_KEY_get0_public_key(ec) == NULL)
     657                 :            :                         return 0;
     658         [ #  # ]:          0 :                 if (EC_KEY_get_conv_form(ec) == POINT_CONVERSION_COMPRESSED)
     659                 :            :                         {
     660         [ #  # ]:          0 :                         if (is_prime)
     661                 :          0 :                                 *comp_id = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime;
     662                 :            :                         else
     663                 :          0 :                                 *comp_id = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2;
     664                 :            :                         }
     665                 :            :                 else
     666                 :          0 :                         *comp_id = TLSEXT_ECPOINTFORMAT_uncompressed;
     667                 :            :                 }
     668                 :            :         return 1;
     669                 :            :         }
     670                 :            : /* Check an EC key is compatible with extensions */
     671                 :        550 : static int tls1_check_ec_key(SSL *s,
     672                 :            :                         unsigned char *curve_id, unsigned char *comp_id)
     673                 :            :         {
     674                 :            :         const unsigned char *p;
     675                 :            :         size_t plen, i;
     676                 :            :         int j;
     677                 :            :         /* If point formats extension present check it, otherwise everything
     678                 :            :          * is supported (see RFC4492).
     679                 :            :          */
     680 [ -  + ][ #  # ]:        550 :         if (comp_id && s->session->tlsext_ecpointformatlist)
     681                 :            :                 {
     682                 :          0 :                 p = s->session->tlsext_ecpointformatlist;
     683                 :          0 :                 plen = s->session->tlsext_ecpointformatlist_length;
     684         [ #  # ]:          0 :                 for (i = 0; i < plen; i++, p++)
     685                 :            :                         {
     686         [ #  # ]:          0 :                         if (*comp_id == *p)
     687                 :            :                                 break;
     688                 :            :                         }
     689         [ #  # ]:          0 :                 if (i == plen)
     690                 :            :                         return 0;
     691                 :            :                 }
     692         [ +  - ]:        550 :         if (!curve_id)
     693                 :            :                 return 1;
     694                 :            :         /* Check curve is consistent with client and server preferences */
     695         [ +  + ]:       1562 :         for (j = 0; j <= 1; j++)
     696                 :            :                 {
     697                 :       1100 :                 tls1_get_curvelist(s, j, &p, &plen);
     698         [ +  + ]:      25388 :                 for (i = 0; i < plen; i+=2, p+=2)
     699                 :            :                         {
     700 [ +  - ][ +  + ]:      25300 :                         if (p[0] == curve_id[0] && p[1] == curve_id[1])
     701                 :            :                                 break;
     702                 :            :                         }
     703         [ +  + ]:       1100 :                 if (i == plen)
     704                 :            :                         return 0;
     705                 :            :                 /* For clients can only check sent curve list */
     706         [ +  - ]:       1012 :                 if (!s->server)
     707                 :            :                         break;
     708                 :            :                 }
     709                 :            :         return 1;
     710                 :            :         }
     711                 :            : 
     712                 :       1056 : static void tls1_get_formatlist(SSL *s, const unsigned char **pformats,
     713                 :            :                                         size_t *pformatslen)
     714                 :            :         {
     715                 :            :         /* If we have a custom point format list use it otherwise
     716                 :            :          * use default */
     717         [ -  + ]:       1056 :         if (s->tlsext_ecpointformatlist)
     718                 :            :                 {
     719                 :          0 :                 *pformats = s->tlsext_ecpointformatlist;
     720                 :          0 :                 *pformatslen = s->tlsext_ecpointformatlist_length;
     721                 :            :                 }
     722                 :            :         else
     723                 :            :                 {
     724                 :       1056 :                 *pformats = ecformats_default;
     725                 :            :                 /* For Suite B we don't support char2 fields */
     726         [ -  + ]:       1056 :                 if (tls1_suiteb(s))
     727                 :          0 :                         *pformatslen = sizeof(ecformats_default) - 1;
     728                 :            :                 else
     729                 :       1056 :                         *pformatslen = sizeof(ecformats_default);
     730                 :            :                 }
     731                 :       1056 :         }
     732                 :            : 
     733                 :            : /* Check cert parameters compatible with extensions: currently just checks
     734                 :            :  * EC certificates have compatible curves and compression.
     735                 :            :  */
     736                 :       1069 : static int tls1_check_cert_param(SSL *s, X509 *x, int set_ee_md)
     737                 :            :         {
     738                 :            :         unsigned char comp_id, curve_id[2];
     739                 :            :         EVP_PKEY *pkey;
     740                 :            :         int rv;
     741                 :       1069 :         pkey = X509_get_pubkey(x);
     742         [ +  - ]:       1069 :         if (!pkey)
     743                 :            :                 return 0;
     744                 :            :         /* If not EC nothing to do */
     745         [ +  - ]:       1069 :         if (pkey->type != EVP_PKEY_EC)
     746                 :            :                 {
     747                 :       1069 :                 EVP_PKEY_free(pkey);
     748                 :       1069 :                 return 1;
     749                 :            :                 }
     750                 :          0 :         rv = tls1_set_ec_id(curve_id, &comp_id, pkey->pkey.ec);
     751                 :          0 :         EVP_PKEY_free(pkey);
     752         [ #  # ]:          0 :         if (!rv)
     753                 :            :                 return 0;
     754                 :            :         /* Can't check curve_id for client certs as we don't have a
     755                 :            :          * supported curves extension.
     756                 :            :          */
     757         [ #  # ]:          0 :         rv = tls1_check_ec_key(s, s->server ? curve_id : NULL, &comp_id);
     758         [ #  # ]:          0 :         if (!rv)
     759                 :            :                 return 0;
     760                 :            :         /* Special case for suite B. We *MUST* sign using SHA256+P-256 or
     761                 :            :          * SHA384+P-384, adjust digest if necessary.
     762                 :            :          */
     763 [ #  # ][ #  # ]:          0 :         if (set_ee_md && tls1_suiteb(s))
     764                 :            :                 {
     765                 :            :                 int check_md;
     766                 :            :                 size_t i;
     767                 :          0 :                 CERT *c = s->cert;
     768         [ #  # ]:          0 :                 if (curve_id[0])
     769                 :            :                         return 0;
     770                 :            :                 /* Check to see we have necessary signing algorithm */
     771         [ #  # ]:          0 :                 if (curve_id[1] == TLSEXT_curve_P_256)
     772                 :            :                         check_md = NID_ecdsa_with_SHA256;
     773         [ #  # ]:          0 :                 else if (curve_id[1] == TLSEXT_curve_P_384)
     774                 :            :                         check_md = NID_ecdsa_with_SHA384;
     775                 :            :                 else
     776                 :            :                         return 0; /* Should never happen */
     777         [ #  # ]:          0 :                 for (i = 0; i < c->shared_sigalgslen; i++)
     778         [ #  # ]:          0 :                         if (check_md == c->shared_sigalgs[i].signandhash_nid)
     779                 :            :                                 break;
     780         [ #  # ]:          0 :                 if (i == c->shared_sigalgslen)
     781                 :            :                         return 0;
     782         [ #  # ]:          0 :                 if (set_ee_md == 2)
     783                 :            :                         {
     784         [ #  # ]:          0 :                         if (check_md == NID_ecdsa_with_SHA256)
     785                 :          0 :                                 c->pkeys[SSL_PKEY_ECC].digest = EVP_sha256();
     786                 :            :                         else
     787                 :          0 :                                 c->pkeys[SSL_PKEY_ECC].digest = EVP_sha384();
     788                 :            :                         }
     789                 :            :                 }
     790                 :          0 :         return rv;
     791                 :            :         }
     792                 :            : /* Check EC temporary key is compatible with client extensions */
     793                 :        550 : int tls1_check_ec_tmp_key(SSL *s, unsigned long cid)
     794                 :            :         {
     795                 :            :         unsigned char curve_id[2];
     796                 :        550 :         EC_KEY *ec = s->cert->ecdh_tmp;
     797                 :            : #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
     798                 :            :         /* Allow any curve: not just those peer supports */
     799                 :            :         if (s->cert->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
     800                 :            :                 return 1;
     801                 :            : #endif
     802                 :            :         /* If Suite B, AES128 MUST use P-256 and AES256 MUST use P-384,
     803                 :            :          * no other curves permitted.
     804                 :            :          */
     805         [ -  + ]:        550 :         if (tls1_suiteb(s))
     806                 :            :                 {
     807                 :            :                 /* Curve to check determined by ciphersuite */
     808         [ #  # ]:          0 :                 if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
     809                 :          0 :                         curve_id[1] = TLSEXT_curve_P_256;
     810         [ #  # ]:          0 :                 else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
     811                 :          0 :                         curve_id[1] = TLSEXT_curve_P_384;
     812                 :            :                 else
     813                 :            :                         return 0;
     814                 :          0 :                 curve_id[0] = 0;
     815                 :            :                 /* Check this curve is acceptable */
     816         [ #  # ]:          0 :                 if (!tls1_check_ec_key(s, curve_id, NULL))
     817                 :            :                         return 0;
     818                 :            :                 /* If auto or setting curve from callback assume OK */
     819 [ #  # ][ #  # ]:          0 :                 if (s->cert->ecdh_tmp_auto || s->cert->ecdh_tmp_cb)
     820                 :            :                         return 1;
     821                 :            :                 /* Otherwise check curve is acceptable */
     822                 :            :                 else 
     823                 :            :                         {
     824                 :            :                         unsigned char curve_tmp[2];
     825         [ #  # ]:          0 :                         if (!ec)
     826                 :            :                                 return 0;
     827         [ #  # ]:          0 :                         if (!tls1_set_ec_id(curve_tmp, NULL, ec))
     828                 :            :                                 return 0;
     829 [ #  # ][ #  # ]:          0 :                         if (!curve_tmp[0] || curve_tmp[1] == curve_id[1])
     830                 :            :                                 return 1;
     831                 :          0 :                         return 0;
     832                 :            :                         }
     833                 :            :                         
     834                 :            :                 }
     835         [ -  + ]:        550 :         if (s->cert->ecdh_tmp_auto)
     836                 :            :                 {
     837                 :            :                 /* Need a shared curve */
     838         [ #  # ]:          0 :                 if (tls1_shared_curve(s, 0))
     839                 :            :                         return 1;
     840                 :          0 :                 else return 0;
     841                 :            :                 }
     842         [ -  + ]:        550 :         if (!ec)
     843                 :            :                 {
     844         [ #  # ]:          0 :                 if (s->cert->ecdh_tmp_cb)
     845                 :            :                         return 1;
     846                 :            :                 else
     847                 :          0 :                         return 0;
     848                 :            :                 }
     849         [ +  - ]:        550 :         if (!tls1_set_ec_id(curve_id, NULL, ec))
     850                 :            :                 return 0;
     851                 :            : /* Set this to allow use of invalid curves for testing */
     852                 :            : #if 0
     853                 :            :         return 1;
     854                 :            : #else
     855                 :        550 :         return tls1_check_ec_key(s, curve_id, NULL);
     856                 :            : #endif
     857                 :            :         }
     858                 :            : 
     859                 :            : #else
     860                 :            : 
     861                 :            : static int tls1_check_cert_param(SSL *s, X509 *x, int set_ee_md)
     862                 :            :         {
     863                 :            :         return 1;
     864                 :            :         }
     865                 :            : 
     866                 :            : #endif /* OPENSSL_NO_EC */
     867                 :            : 
     868                 :            : #ifndef OPENSSL_NO_TLSEXT
     869                 :            : 
     870                 :            : /* List of supported signature algorithms and hashes. Should make this
     871                 :            :  * customisable at some point, for now include everything we support.
     872                 :            :  */
     873                 :            : 
     874                 :            : #ifdef OPENSSL_NO_RSA
     875                 :            : #define tlsext_sigalg_rsa(md) /* */
     876                 :            : #else
     877                 :            : #define tlsext_sigalg_rsa(md) md, TLSEXT_signature_rsa,
     878                 :            : #endif
     879                 :            : 
     880                 :            : #ifdef OPENSSL_NO_DSA
     881                 :            : #define tlsext_sigalg_dsa(md) /* */
     882                 :            : #else
     883                 :            : #define tlsext_sigalg_dsa(md) md, TLSEXT_signature_dsa,
     884                 :            : #endif
     885                 :            : 
     886                 :            : #ifdef OPENSSL_NO_ECDSA
     887                 :            : #define tlsext_sigalg_ecdsa(md) /* */
     888                 :            : #else
     889                 :            : #define tlsext_sigalg_ecdsa(md) md, TLSEXT_signature_ecdsa,
     890                 :            : #endif
     891                 :            : 
     892                 :            : #define tlsext_sigalg(md) \
     893                 :            :                 tlsext_sigalg_rsa(md) \
     894                 :            :                 tlsext_sigalg_dsa(md) \
     895                 :            :                 tlsext_sigalg_ecdsa(md)
     896                 :            : 
     897                 :            : static unsigned char tls12_sigalgs[] = {
     898                 :            : #ifndef OPENSSL_NO_SHA512
     899                 :            :         tlsext_sigalg(TLSEXT_hash_sha512)
     900                 :            :         tlsext_sigalg(TLSEXT_hash_sha384)
     901                 :            : #endif
     902                 :            : #ifndef OPENSSL_NO_SHA256
     903                 :            :         tlsext_sigalg(TLSEXT_hash_sha256)
     904                 :            :         tlsext_sigalg(TLSEXT_hash_sha224)
     905                 :            : #endif
     906                 :            : #ifndef OPENSSL_NO_SHA
     907                 :            :         tlsext_sigalg(TLSEXT_hash_sha1)
     908                 :            : #endif
     909                 :            : };
     910                 :            : #ifndef OPENSSL_NO_ECDSA
     911                 :            : static unsigned char suiteb_sigalgs[] = {
     912                 :            :         tlsext_sigalg_ecdsa(TLSEXT_hash_sha256)
     913                 :            :         tlsext_sigalg_ecdsa(TLSEXT_hash_sha384)
     914                 :            : };
     915                 :            : #endif
     916                 :       2714 : size_t tls12_get_psigalgs(SSL *s, const unsigned char **psigs)
     917                 :            :         {
     918                 :            :         /* If Suite B mode use Suite B sigalgs only, ignore any other
     919                 :            :          * preferences.
     920                 :            :          */
     921                 :            : #ifndef OPENSSL_NO_EC
     922   [ -  -  -  + ]:       2714 :         switch (tls1_suiteb(s))
     923                 :            :                 {
     924                 :            :         case SSL_CERT_FLAG_SUITEB_128_LOS:
     925                 :          0 :                 *psigs = suiteb_sigalgs;
     926                 :          0 :                 return sizeof(suiteb_sigalgs);
     927                 :            : 
     928                 :            :         case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY:
     929                 :          0 :                 *psigs = suiteb_sigalgs;
     930                 :          0 :                 return 2;
     931                 :            : 
     932                 :            :         case SSL_CERT_FLAG_SUITEB_192_LOS:
     933                 :          0 :                 *psigs = suiteb_sigalgs + 2;
     934                 :          0 :                 return 2;
     935                 :            :                 }
     936                 :            : #endif
     937                 :            :         /* If server use client authentication sigalgs if not NULL */
     938 [ +  + ][ -  + ]:       2714 :         if (s->server && s->cert->client_sigalgs)
     939                 :            :                 {
     940                 :          0 :                 *psigs = s->cert->client_sigalgs;
     941                 :          0 :                 return s->cert->client_sigalgslen;
     942                 :            :                 }
     943         [ -  + ]:       2714 :         else if (s->cert->conf_sigalgs)
     944                 :            :                 {
     945                 :          0 :                 *psigs = s->cert->conf_sigalgs;
     946                 :          0 :                 return s->cert->conf_sigalgslen;
     947                 :            :                 }
     948                 :            :         else
     949                 :            :                 {
     950                 :       2714 :                 *psigs = tls12_sigalgs;
     951                 :       2714 :                 return sizeof(tls12_sigalgs);
     952                 :            :                 }
     953                 :            :         }
     954                 :            : /* Check signature algorithm is consistent with sent supported signature
     955                 :            :  * algorithms and if so return relevant digest.
     956                 :            :  */
     957                 :        165 : int tls12_check_peer_sigalg(const EVP_MD **pmd, SSL *s,
     958                 :            :                                 const unsigned char *sig, EVP_PKEY *pkey)
     959                 :            :         {
     960                 :            :         const unsigned char *sent_sigs;
     961                 :            :         size_t sent_sigslen, i;
     962                 :        165 :         int sigalg = tls12_get_sigid(pkey);
     963                 :            :         /* Should never happen */
     964         [ +  - ]:        165 :         if (sigalg == -1)
     965                 :            :                 return -1;
     966                 :            :         /* Check key type is consistent with signature */
     967         [ -  + ]:        165 :         if (sigalg != (int)sig[1])
     968                 :            :                 {
     969                 :          0 :                 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,SSL_R_WRONG_SIGNATURE_TYPE);
     970                 :          0 :                 return 0;
     971                 :            :                 }
     972                 :            : #ifndef OPENSSL_NO_EC
     973         [ -  + ]:        165 :         if (pkey->type == EVP_PKEY_EC)
     974                 :            :                 {
     975                 :            :                 unsigned char curve_id[2], comp_id;
     976                 :            :                 /* Check compression and curve matches extensions */
     977         [ #  # ]:          0 :                 if (!tls1_set_ec_id(curve_id, &comp_id, pkey->pkey.ec))
     978                 :          0 :                         return 0;
     979 [ #  # ][ #  # ]:          0 :                 if (!s->server && !tls1_check_ec_key(s, curve_id, &comp_id))
     980                 :            :                         {
     981                 :          0 :                         SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,SSL_R_WRONG_CURVE);
     982                 :          0 :                         return 0;
     983                 :            :                         }
     984                 :            :                 /* If Suite B only P-384+SHA384 or P-256+SHA-256 allowed */
     985         [ #  # ]:          0 :                 if (tls1_suiteb(s))
     986                 :            :                         {
     987         [ #  # ]:          0 :                         if (curve_id[0])
     988                 :            :                                 return 0;
     989         [ #  # ]:          0 :                         if (curve_id[1] == TLSEXT_curve_P_256)
     990                 :            :                                 {
     991         [ #  # ]:          0 :                                 if (sig[0] != TLSEXT_hash_sha256)
     992                 :            :                                         {
     993                 :          0 :                                         SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,
     994                 :            :                                                 SSL_R_ILLEGAL_SUITEB_DIGEST);
     995                 :          0 :                                         return 0;
     996                 :            :                                         }
     997                 :            :                                 }
     998         [ #  # ]:          0 :                         else if (curve_id[1] == TLSEXT_curve_P_384)
     999                 :            :                                 {
    1000         [ #  # ]:          0 :                                 if (sig[0] != TLSEXT_hash_sha384)
    1001                 :            :                                         {
    1002                 :          0 :                                         SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,
    1003                 :            :                                                 SSL_R_ILLEGAL_SUITEB_DIGEST);
    1004                 :          0 :                                         return 0;
    1005                 :            :                                         }
    1006                 :            :                                 }
    1007                 :            :                         else
    1008                 :            :                                 return 0;
    1009                 :            :                         }
    1010                 :            :                 }
    1011         [ +  - ]:        165 :         else if (tls1_suiteb(s))
    1012                 :            :                 return 0;
    1013                 :            : #endif
    1014                 :            : 
    1015                 :            :         /* Check signature matches a type we sent */
    1016                 :        165 :         sent_sigslen = tls12_get_psigalgs(s, &sent_sigs);
    1017         [ +  - ]:        165 :         for (i = 0; i < sent_sigslen; i+=2, sent_sigs+=2)
    1018                 :            :                 {
    1019 [ +  - ][ -  + ]:        165 :                 if (sig[0] == sent_sigs[0] && sig[1] == sent_sigs[1])
    1020                 :            :                         break;
    1021                 :            :                 }
    1022                 :            :         /* Allow fallback to SHA1 if not strict mode */
    1023 [ -  + ][ #  # ]:        165 :         if (i == sent_sigslen && (sig[0] != TLSEXT_hash_sha1 || s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT))
                 [ #  # ]
    1024                 :            :                 {
    1025                 :          0 :                 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,SSL_R_WRONG_SIGNATURE_TYPE);
    1026                 :          0 :                 return 0;
    1027                 :            :                 }
    1028                 :        165 :         *pmd = tls12_get_hash(sig[0]);
    1029         [ -  + ]:        165 :         if (*pmd == NULL)
    1030                 :            :                 {
    1031                 :          0 :                 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,SSL_R_UNKNOWN_DIGEST);
    1032                 :          0 :                 return 0;
    1033                 :            :                 }
    1034                 :            :         /* Make sure security callback allows algorithm */
    1035         [ -  + ]:        330 :         if (!ssl_security(s, SSL_SECOP_SIGALG_CHECK,
    1036                 :        165 :                                 EVP_MD_size(*pmd) * 4, EVP_MD_type(*pmd),
    1037                 :            :                                                                 (void *)sig))
    1038                 :            :                 {
    1039                 :          0 :                 SSLerr(SSL_F_TLS12_CHECK_PEER_SIGALG,SSL_R_WRONG_SIGNATURE_TYPE);
    1040                 :          0 :                 return 0;
    1041                 :            :                 }
    1042                 :            :         /* Store the digest used so applications can retrieve it if they
    1043                 :            :          * wish.
    1044                 :            :          */
    1045 [ +  - ][ +  - ]:        165 :         if (s->session && s->session->sess_cert)
    1046                 :        165 :                 s->session->sess_cert->peer_key->digest = *pmd;
    1047                 :            :         return 1;
    1048                 :            :         }
    1049                 :            : 
    1050                 :            : /* Get a mask of disabled algorithms: an algorithm is disabled
    1051                 :            :  * if it isn't supported or doesn't appear in supported signature
    1052                 :            :  * algorithms. Unlike ssl_cipher_get_disabled this applies to a specific
    1053                 :            :  * session and not global settings.
    1054                 :            :  * 
    1055                 :            :  */
    1056                 :       1940 : void ssl_set_client_disabled(SSL *s)
    1057                 :            :         {
    1058                 :       1940 :         CERT *c = s->cert;
    1059                 :       1940 :         c->mask_a = 0;
    1060                 :       1940 :         c->mask_k = 0;
    1061                 :            :         /* Don't allow TLS 1.2 only ciphers if we don't suppport them */
    1062 [ -  + ][ #  # ]:       1940 :         if (!SSL_CLIENT_USE_TLS1_2_CIPHERS(s))
         [ +  - ][ +  + ]
    1063                 :       1144 :                 c->mask_ssl = SSL_TLSV1_2;
    1064                 :            :         else
    1065                 :        796 :                 c->mask_ssl = 0;
    1066                 :       1940 :         ssl_set_sig_mask(&c->mask_a, s, SSL_SECOP_SIGALG_MASK);
    1067                 :            :         /* Disable static DH if we don't include any appropriate
    1068                 :            :          * signature algorithms.
    1069                 :            :          */
    1070         [ -  + ]:       1940 :         if (c->mask_a & SSL_aRSA)
    1071                 :          0 :                 c->mask_k |= SSL_kDHr|SSL_kECDHr;
    1072         [ -  + ]:       1940 :         if (c->mask_a & SSL_aDSS)
    1073                 :          0 :                 c->mask_k |= SSL_kDHd;
    1074         [ -  + ]:       1940 :         if (c->mask_a & SSL_aECDSA)
    1075                 :          0 :                 c->mask_k |= SSL_kECDHe;
    1076                 :            : #ifndef OPENSSL_NO_KRB5
    1077                 :            :         if (!kssl_tgt_is_available(s->kssl_ctx))
    1078                 :            :                 {
    1079                 :            :                 c->mask_a |= SSL_aKRB5;
    1080                 :            :                 c->mask_k |= SSL_kKRB5;
    1081                 :            :                 }
    1082                 :            : #endif
    1083                 :            : #ifndef OPENSSL_NO_PSK
    1084                 :            :         /* with PSK there must be client callback set */
    1085         [ +  + ]:       1940 :         if (!s->psk_client_callback)
    1086                 :            :                 {
    1087                 :       1918 :                 c->mask_a |= SSL_aPSK;
    1088                 :       1918 :                 c->mask_k |= SSL_kPSK;
    1089                 :            :                 }
    1090                 :            : #endif /* OPENSSL_NO_PSK */
    1091                 :       1940 :         c->valid = 1;
    1092                 :       1940 :         }
    1093                 :            : 
    1094                 :     149177 : int ssl_cipher_disabled(SSL *s, const SSL_CIPHER *c, int op)
    1095                 :            :         {
    1096                 :     149177 :         CERT *ct = s->cert;
    1097 [ +  + ][ +  + ]:     149177 :         if (c->algorithm_ssl & ct->mask_ssl || c->algorithm_mkey & ct->mask_k || c->algorithm_auth & ct->mask_a)
                 [ +  - ]
    1098                 :            :                 return 1;
    1099                 :     117915 :         return !ssl_security(s, op, c->strength_bits, 0, (void *)c);
    1100                 :            :         }
    1101                 :            : 
    1102                 :       3539 : static int tls_use_ticket(SSL *s)
    1103                 :            :         {
    1104         [ +  - ]:       3539 :         if (s->options & SSL_OP_NO_TICKET)
    1105                 :            :                 return 0;
    1106                 :       3539 :         return ssl_security(s, SSL_SECOP_TICKET, 0, 0, NULL);
    1107                 :            :         }
    1108                 :            : 
    1109                 :       1080 : unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf, unsigned char *limit, int *al)
    1110                 :            :         {
    1111                 :       1080 :         int extdatalen=0;
    1112                 :       1080 :         unsigned char *orig = buf;
    1113                 :       1080 :         unsigned char *ret = buf;
    1114                 :            : #ifndef OPENSSL_NO_EC
    1115                 :            :         /* See if we support any ECC ciphersuites */
    1116                 :       1080 :         int using_ecc = 0;
    1117 [ +  + ][ -  + ]:       1080 :         if (s->version >= TLS1_VERSION || SSL_IS_DTLS(s))
    1118                 :            :                 {
    1119                 :            :                 int i;
    1120                 :            :                 unsigned long alg_k, alg_a;
    1121                 :        827 :                 STACK_OF(SSL_CIPHER) *cipher_stack = SSL_get_ciphers(s);
    1122                 :            : 
    1123         [ +  + ]:       2952 :                 for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++)
    1124                 :            :                         {
    1125                 :       2719 :                         SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
    1126                 :            : 
    1127                 :       2719 :                         alg_k = c->algorithm_mkey;
    1128                 :       2719 :                         alg_a = c->algorithm_auth;
    1129         [ +  + ]:       2719 :                         if ((alg_k & (SSL_kECDHE|SSL_kECDHr|SSL_kECDHe)
    1130         [ +  - ]:       2125 :                                 || (alg_a & SSL_aECDSA)))
    1131                 :            :                                 {
    1132                 :            :                                 using_ecc = 1;
    1133                 :            :                                 break;
    1134                 :            :                                 }
    1135                 :            :                         }
    1136                 :            :                 }
    1137                 :            : #endif
    1138                 :            : 
    1139                 :            :         /* don't add extensions for SSLv3 unless doing secure renegotiation */
    1140         [ +  + ]:       1080 :         if (s->client_version == SSL3_VERSION
    1141         [ -  + ]:        253 :                                         && !s->s3->send_connection_binding)
    1142                 :            :                 return orig;
    1143                 :            : 
    1144                 :        827 :         ret+=2;
    1145                 :            : 
    1146         [ +  - ]:        827 :         if (ret>=limit) return NULL; /* this really never occurs, but ... */
    1147                 :            : 
    1148         [ -  + ]:        827 :         if (s->tlsext_hostname != NULL)
    1149                 :            :                 { 
    1150                 :            :                 /* Add TLS extension servername to the Client Hello message */
    1151                 :            :                 unsigned long size_str;
    1152                 :            :                 long lenmax; 
    1153                 :            : 
    1154                 :            :                 /* check for enough space.
    1155                 :            :                    4 for the servername type and entension length
    1156                 :            :                    2 for servernamelist length
    1157                 :            :                    1 for the hostname type
    1158                 :            :                    2 for hostname length
    1159                 :            :                    + hostname length 
    1160                 :            :                 */
    1161                 :            :                    
    1162         [ #  # ]:          0 :                 if ((lenmax = limit - ret - 9) < 0 
    1163         [ #  # ]:          0 :                     || (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax) 
    1164                 :            :                         return NULL;
    1165                 :            :                         
    1166                 :            :                 /* extension type and length */
    1167                 :          0 :                 s2n(TLSEXT_TYPE_server_name,ret); 
    1168                 :          0 :                 s2n(size_str+5,ret);
    1169                 :            :                 
    1170                 :            :                 /* length of servername list */
    1171                 :          0 :                 s2n(size_str+3,ret);
    1172                 :            :         
    1173                 :            :                 /* hostname type, length and hostname */
    1174                 :          0 :                 *(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name;
    1175                 :          0 :                 s2n(size_str,ret);
    1176                 :          0 :                 memcpy(ret, s->tlsext_hostname, size_str);
    1177                 :          0 :                 ret+=size_str;
    1178                 :            :                 }
    1179                 :            : 
    1180                 :            :         /* Add RI if renegotiating */
    1181         [ -  + ]:        827 :         if (s->renegotiate)
    1182                 :            :           {
    1183                 :            :           int el;
    1184                 :            :           
    1185         [ #  # ]:          0 :           if(!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0))
    1186                 :            :               {
    1187                 :          0 :               SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
    1188                 :          0 :               return NULL;
    1189                 :            :               }
    1190                 :            : 
    1191         [ #  # ]:          0 :           if((limit - ret - 4 - el) < 0) return NULL;
    1192                 :            :           
    1193                 :          0 :           s2n(TLSEXT_TYPE_renegotiate,ret);
    1194                 :          0 :           s2n(el,ret);
    1195                 :            : 
    1196         [ #  # ]:          0 :           if(!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el))
    1197                 :            :               {
    1198                 :          0 :               SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
    1199                 :          0 :               return NULL;
    1200                 :            :               }
    1201                 :            : 
    1202                 :          0 :           ret += el;
    1203                 :            :         }
    1204                 :            : 
    1205                 :            : #ifndef OPENSSL_NO_SRP
    1206                 :            :         /* Add SRP username if there is one */
    1207         [ +  + ]:        827 :         if (s->srp_ctx.login != NULL)
    1208                 :            :                 { /* Add TLS extension SRP username to the Client Hello message */
    1209                 :            : 
    1210                 :         22 :                 int login_len = strlen(s->srp_ctx.login);    
    1211         [ -  + ]:         22 :                 if (login_len > 255 || login_len == 0)
    1212                 :            :                         {
    1213                 :          0 :                         SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
    1214                 :          0 :                         return NULL;
    1215                 :            :                         } 
    1216                 :            : 
    1217                 :            :                 /* check for enough space.
    1218                 :            :                    4 for the srp type type and entension length
    1219                 :            :                    1 for the srp user identity
    1220                 :            :                    + srp user identity length 
    1221                 :            :                 */
    1222         [ +  - ]:         22 :                 if ((limit - ret - 5 - login_len) < 0) return NULL; 
    1223                 :            : 
    1224                 :            :                 /* fill in the extension */
    1225                 :         22 :                 s2n(TLSEXT_TYPE_srp,ret);
    1226                 :         22 :                 s2n(login_len+1,ret);
    1227                 :         22 :                 (*ret++) = (unsigned char) login_len;
    1228                 :         22 :                 memcpy(ret, s->srp_ctx.login, login_len);
    1229                 :         22 :                 ret+=login_len;
    1230                 :            :                 }
    1231                 :            : #endif
    1232                 :            : 
    1233                 :            : #ifndef OPENSSL_NO_EC
    1234         [ +  + ]:        827 :         if (using_ecc)
    1235                 :            :                 {
    1236                 :            :                 /* Add TLS extension ECPointFormats to the ClientHello message */
    1237                 :            :                 long lenmax; 
    1238                 :            :                 const unsigned char *plist;
    1239                 :            :                 size_t plistlen;
    1240                 :            :                 size_t i;
    1241                 :            :                 unsigned char *etmp;
    1242                 :            : 
    1243                 :        594 :                 tls1_get_formatlist(s, &plist, &plistlen);
    1244                 :            : 
    1245         [ +  - ]:        594 :                 if ((lenmax = limit - ret - 5) < 0) return NULL; 
    1246         [ +  - ]:        594 :                 if (plistlen > (size_t)lenmax) return NULL;
    1247         [ -  + ]:        594 :                 if (plistlen > 255)
    1248                 :            :                         {
    1249                 :          0 :                         SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
    1250                 :          0 :                         return NULL;
    1251                 :            :                         }
    1252                 :            :                 
    1253                 :        594 :                 s2n(TLSEXT_TYPE_ec_point_formats,ret);
    1254                 :        594 :                 s2n(plistlen + 1,ret);
    1255                 :        594 :                 *(ret++) = (unsigned char)plistlen ;
    1256                 :        594 :                 memcpy(ret, plist, plistlen);
    1257                 :        594 :                 ret+=plistlen;
    1258                 :            : 
    1259                 :            :                 /* Add TLS extension EllipticCurves to the ClientHello message */
    1260                 :        594 :                 plist = s->tlsext_ellipticcurvelist;
    1261                 :        594 :                 tls1_get_curvelist(s, 0, &plist, &plistlen);
    1262                 :            : 
    1263         [ +  - ]:        594 :                 if ((lenmax = limit - ret - 6) < 0) return NULL; 
    1264         [ +  - ]:        594 :                 if (plistlen > (size_t)lenmax) return NULL;
    1265         [ -  + ]:        594 :                 if (plistlen > 65532)
    1266                 :            :                         {
    1267                 :          0 :                         SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
    1268                 :          0 :                         return NULL;
    1269                 :            :                         }
    1270                 :            : 
    1271                 :            :                 
    1272                 :        594 :                 s2n(TLSEXT_TYPE_elliptic_curves,ret);
    1273                 :        594 :                 etmp = ret + 4;
    1274                 :            :                 /* Copy curve ID if supported */
    1275         [ +  + ]:      17226 :                 for (i = 0; i < plistlen; i += 2, plist += 2)
    1276                 :            :                         {
    1277         [ +  - ]:      16632 :                         if (tls_curve_allowed(s, plist, SSL_SECOP_CURVE_SUPPORTED))
    1278                 :            :                                 {
    1279                 :      16632 :                                 *etmp++ = plist[0];
    1280                 :      16632 :                                 *etmp++ = plist[1];
    1281                 :            :                                 }
    1282                 :            :                         }
    1283                 :            : 
    1284                 :        594 :                 plistlen = etmp - ret - 4;
    1285                 :            : 
    1286                 :            :                 /* NB: draft-ietf-tls-ecc-12.txt uses a one-byte prefix for
    1287                 :            :                  * elliptic_curve_list, but the examples use two bytes.
    1288                 :            :                  * http://www1.ietf.org/mail-archive/web/tls/current/msg00538.html
    1289                 :            :                  * resolves this to two bytes.
    1290                 :            :                  */
    1291                 :        594 :                 s2n(plistlen + 2, ret);
    1292                 :        594 :                 s2n(plistlen, ret);
    1293                 :        594 :                 ret+=plistlen;
    1294                 :            :                 }
    1295                 :            : #endif /* OPENSSL_NO_EC */
    1296                 :            : 
    1297         [ +  - ]:        827 :         if (tls_use_ticket(s))
    1298                 :            :                 {
    1299                 :            :                 int ticklen;
    1300 [ +  - ][ +  + ]:        827 :                 if (!s->new_session && s->session && s->session->tlsext_tick)
                 [ +  + ]
    1301                 :         11 :                         ticklen = s->session->tlsext_ticklen;
    1302 [ +  + ][ -  + ]:        816 :                 else if (s->session && s->tlsext_session_ticket &&
                 [ #  # ]
    1303                 :          0 :                          s->tlsext_session_ticket->data)
    1304                 :            :                         {
    1305                 :          0 :                         ticklen = s->tlsext_session_ticket->length;
    1306                 :          0 :                         s->session->tlsext_tick = OPENSSL_malloc(ticklen);
    1307         [ #  # ]:          0 :                         if (!s->session->tlsext_tick)
    1308                 :            :                                 return NULL;
    1309                 :          0 :                         memcpy(s->session->tlsext_tick,
    1310                 :          0 :                                s->tlsext_session_ticket->data,
    1311                 :            :                                ticklen);
    1312                 :          0 :                         s->session->tlsext_ticklen = ticklen;
    1313                 :            :                         }
    1314                 :            :                 else
    1315                 :            :                         ticklen = 0;
    1316 [ +  + ][ -  + ]:        827 :                 if (ticklen == 0 && s->tlsext_session_ticket &&
                 [ #  # ]
    1317                 :          0 :                     s->tlsext_session_ticket->data == NULL)
    1318                 :            :                         goto skip_ext;
    1319                 :            :                 /* Check for enough room 2 for extension type, 2 for len
    1320                 :            :                  * rest for ticket
    1321                 :            :                  */
    1322         [ +  - ]:        827 :                 if ((long)(limit - ret - 4 - ticklen) < 0) return NULL;
    1323                 :        827 :                 s2n(TLSEXT_TYPE_session_ticket,ret); 
    1324                 :        827 :                 s2n(ticklen,ret);
    1325         [ +  + ]:        827 :                 if (ticklen)
    1326                 :            :                         {
    1327                 :         11 :                         memcpy(ret, s->session->tlsext_tick, ticklen);
    1328                 :         11 :                         ret += ticklen;
    1329                 :            :                         }
    1330                 :            :                 }
    1331                 :            :                 skip_ext:
    1332                 :            : 
    1333         [ +  + ]:        827 :         if (SSL_USE_SIGALGS(s))
    1334                 :            :                 {
    1335                 :            :                 size_t salglen;
    1336                 :            :                 const unsigned char *salg;
    1337                 :            :                 unsigned char *etmp;
    1338                 :        200 :                 salglen = tls12_get_psigalgs(s, &salg);
    1339         [ -  + ]:        200 :                 if ((size_t)(limit - ret) < salglen + 6)
    1340                 :          0 :                         return NULL; 
    1341                 :        200 :                 s2n(TLSEXT_TYPE_signature_algorithms,ret);
    1342                 :        200 :                 etmp = ret;
    1343                 :            :                 /* Skip over lengths for now */
    1344                 :        200 :                 ret += 4;
    1345                 :        200 :                 salglen = tls12_copy_sigalgs(s, ret, salg, salglen);
    1346                 :            :                 /* Fill in lengths */
    1347                 :        200 :                 s2n(salglen + 2, etmp);
    1348                 :        200 :                 s2n(salglen, etmp);
    1349                 :        200 :                 ret += salglen;
    1350                 :            :                 }
    1351                 :            : 
    1352                 :            : #ifdef TLSEXT_TYPE_opaque_prf_input
    1353                 :            :         if (s->s3->client_opaque_prf_input != NULL)
    1354                 :            :                 {
    1355                 :            :                 size_t col = s->s3->client_opaque_prf_input_len;
    1356                 :            :                 
    1357                 :            :                 if ((long)(limit - ret - 6 - col) < 0)
    1358                 :            :                         return NULL;
    1359                 :            :                 if (col > 0xFFFD) /* can't happen */
    1360                 :            :                         return NULL;
    1361                 :            : 
    1362                 :            :                 s2n(TLSEXT_TYPE_opaque_prf_input, ret); 
    1363                 :            :                 s2n(col + 2, ret);
    1364                 :            :                 s2n(col, ret);
    1365                 :            :                 memcpy(ret, s->s3->client_opaque_prf_input, col);
    1366                 :            :                 ret += col;
    1367                 :            :                 }
    1368                 :            : #endif
    1369                 :            : 
    1370         [ -  + ]:        827 :         if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
    1371                 :            :                 {
    1372                 :            :                 int i;
    1373                 :            :                 long extlen, idlen, itmp;
    1374                 :            :                 OCSP_RESPID *id;
    1375                 :            : 
    1376                 :            :                 idlen = 0;
    1377         [ #  # ]:          0 :                 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
    1378                 :            :                         {
    1379                 :          0 :                         id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
    1380                 :          0 :                         itmp = i2d_OCSP_RESPID(id, NULL);
    1381         [ #  # ]:          0 :                         if (itmp <= 0)
    1382                 :            :                                 return NULL;
    1383                 :          0 :                         idlen += itmp + 2;
    1384                 :            :                         }
    1385                 :            : 
    1386         [ #  # ]:          0 :                 if (s->tlsext_ocsp_exts)
    1387                 :            :                         {
    1388                 :          0 :                         extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL);
    1389         [ #  # ]:          0 :                         if (extlen < 0)
    1390                 :            :                                 return NULL;
    1391                 :            :                         }
    1392                 :            :                 else
    1393                 :            :                         extlen = 0;
    1394                 :            :                         
    1395         [ #  # ]:          0 :                 if ((long)(limit - ret - 7 - extlen - idlen) < 0) return NULL;
    1396                 :          0 :                 s2n(TLSEXT_TYPE_status_request, ret);
    1397         [ #  # ]:          0 :                 if (extlen + idlen > 0xFFF0)
    1398                 :            :                         return NULL;
    1399                 :          0 :                 s2n(extlen + idlen + 5, ret);
    1400                 :          0 :                 *(ret++) = TLSEXT_STATUSTYPE_ocsp;
    1401                 :          0 :                 s2n(idlen, ret);
    1402         [ #  # ]:          0 :                 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++)
    1403                 :            :                         {
    1404                 :            :                         /* save position of id len */
    1405                 :          0 :                         unsigned char *q = ret;
    1406                 :          0 :                         id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
    1407                 :            :                         /* skip over id len */
    1408                 :          0 :                         ret += 2;
    1409                 :          0 :                         itmp = i2d_OCSP_RESPID(id, &ret);
    1410                 :            :                         /* write id len */
    1411                 :          0 :                         s2n(itmp, q);
    1412                 :            :                         }
    1413                 :          0 :                 s2n(extlen, ret);
    1414         [ #  # ]:          0 :                 if (extlen > 0)
    1415                 :          0 :                         i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
    1416                 :            :                 }
    1417                 :            : 
    1418                 :            : #ifndef OPENSSL_NO_HEARTBEATS
    1419                 :            :         /* Add Heartbeat extension */
    1420         [ +  - ]:        827 :         if ((limit - ret - 4 - 1) < 0)
    1421                 :            :                 return NULL;
    1422                 :        827 :         s2n(TLSEXT_TYPE_heartbeat,ret);
    1423                 :        827 :         s2n(1,ret);
    1424                 :            :         /* Set mode:
    1425                 :            :          * 1: peer may send requests
    1426                 :            :          * 2: peer not allowed to send requests
    1427                 :            :          */
    1428         [ -  + ]:        827 :         if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
    1429                 :          0 :                 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
    1430                 :            :         else
    1431                 :        827 :                 *(ret++) = SSL_TLSEXT_HB_ENABLED;
    1432                 :            : #endif
    1433                 :            : 
    1434                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
    1435 [ +  + ][ +  - ]:        827 :         if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len)
    1436                 :            :                 {
    1437                 :            :                 /* The client advertises an emtpy extension to indicate its
    1438                 :            :                  * support for Next Protocol Negotiation */
    1439         [ +  - ]:         77 :                 if (limit - ret - 4 < 0)
    1440                 :            :                         return NULL;
    1441                 :         77 :                 s2n(TLSEXT_TYPE_next_proto_neg,ret);
    1442                 :         77 :                 s2n(0,ret);
    1443                 :            :                 }
    1444                 :            : #endif
    1445                 :            : 
    1446 [ +  + ][ +  - ]:        827 :         if (s->alpn_client_proto_list && !s->s3->tmp.finish_md_len)
    1447                 :            :                 {
    1448         [ +  - ]:         88 :                 if ((size_t)(limit - ret) < 6 + s->alpn_client_proto_list_len)
    1449                 :            :                         return NULL;
    1450                 :         88 :                 s2n(TLSEXT_TYPE_application_layer_protocol_negotiation,ret);
    1451                 :         88 :                 s2n(2 + s->alpn_client_proto_list_len,ret);
    1452                 :         88 :                 s2n(s->alpn_client_proto_list_len,ret);
    1453                 :         88 :                 memcpy(ret, s->alpn_client_proto_list,
    1454                 :         88 :                        s->alpn_client_proto_list_len);
    1455                 :         88 :                 ret += s->alpn_client_proto_list_len;
    1456                 :            :                 }
    1457                 :            : 
    1458         [ -  + ]:        827 :         if(SSL_get_srtp_profiles(s))
    1459                 :            :                 {
    1460                 :            :                 int el;
    1461                 :            : 
    1462                 :          0 :                 ssl_add_clienthello_use_srtp_ext(s, 0, &el, 0);
    1463                 :            :                 
    1464         [ #  # ]:          0 :                 if((limit - ret - 4 - el) < 0) return NULL;
    1465                 :            : 
    1466                 :          0 :                 s2n(TLSEXT_TYPE_use_srtp,ret);
    1467                 :          0 :                 s2n(el,ret);
    1468                 :            : 
    1469         [ #  # ]:          0 :                 if(ssl_add_clienthello_use_srtp_ext(s, ret, &el, el))
    1470                 :            :                         {
    1471                 :          0 :                         SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
    1472                 :          0 :                         return NULL;
    1473                 :            :                         }
    1474                 :          0 :                 ret += el;
    1475                 :            :                 }
    1476                 :            : 
    1477                 :            :         /* Add custom TLS Extensions to ClientHello */
    1478         [ +  + ]:        827 :         if (s->ctx->custom_cli_ext_records_count)
    1479                 :            :                 {
    1480                 :            :                 size_t i;
    1481                 :            :                 custom_cli_ext_record* record;
    1482                 :            : 
    1483         [ +  + ]:        209 :                 for (i = 0; i < s->ctx->custom_cli_ext_records_count; i++)
    1484                 :            :                         {
    1485                 :        154 :                         const unsigned char* out = NULL;
    1486                 :        154 :                         unsigned short outlen = 0;
    1487                 :            : 
    1488                 :        154 :                         record = &s->ctx->custom_cli_ext_records[i];
    1489                 :            :                         /* NULL callback sends empty extension */ 
    1490                 :            :                         /* -1 from callback omits extension */
    1491         [ +  + ]:        154 :                         if (record->fn1)
    1492                 :            :                                 {
    1493                 :         88 :                                 int cb_retval = 0;
    1494                 :         88 :                                 cb_retval = record->fn1(s, record->ext_type,
    1495                 :            :                                                         &out, &outlen, al,
    1496                 :            :                                                         record->arg);
    1497         [ +  - ]:         88 :                                 if (cb_retval == 0)
    1498                 :          0 :                                         return NULL; /* error */
    1499         [ +  + ]:         88 :                                 if (cb_retval == -1)
    1500                 :         22 :                                         continue; /* skip this extension */
    1501                 :            :                                 }
    1502         [ +  - ]:        132 :                         if (limit < ret + 4 + outlen)
    1503                 :            :                                 return NULL;
    1504                 :        132 :                         s2n(record->ext_type, ret);
    1505                 :        132 :                         s2n(outlen, ret);
    1506                 :        132 :                         memcpy(ret, out, outlen);
    1507                 :        132 :                         ret += outlen;
    1508                 :            :                         }
    1509                 :            :                 }
    1510                 :            : #ifdef TLSEXT_TYPE_encrypt_then_mac
    1511                 :        827 :         s2n(TLSEXT_TYPE_encrypt_then_mac,ret);
    1512                 :        827 :         s2n(0,ret);
    1513                 :            : #endif
    1514                 :            : 
    1515                 :            :         /* Add padding to workaround bugs in F5 terminators.
    1516                 :            :          * See https://tools.ietf.org/html/draft-agl-tls-padding-03
    1517                 :            :          *
    1518                 :            :          * NB: because this code works out the length of all existing
    1519                 :            :          * extensions it MUST always appear last.
    1520                 :            :          */
    1521         [ -  + ]:        827 :         if (s->options & SSL_OP_TLSEXT_PADDING)
    1522                 :            :                 {
    1523                 :          0 :                 int hlen = ret - (unsigned char *)s->init_buf->data;
    1524                 :            :                 /* The code in s23_clnt.c to build ClientHello messages
    1525                 :            :                  * includes the 5-byte record header in the buffer, while
    1526                 :            :                  * the code in s3_clnt.c does not.
    1527                 :            :                  */
    1528         [ #  # ]:          0 :                 if (s->state == SSL23_ST_CW_CLNT_HELLO_A)
    1529                 :          0 :                         hlen -= 5;
    1530         [ #  # ]:          0 :                 if (hlen > 0xff && hlen < 0x200)
    1531                 :            :                         {
    1532                 :          0 :                         hlen = 0x200 - hlen;
    1533         [ #  # ]:          0 :                         if (hlen >= 4)
    1534                 :          0 :                                 hlen -= 4;
    1535                 :            :                         else
    1536                 :            :                                 hlen = 0;
    1537                 :            : 
    1538                 :          0 :                         s2n(TLSEXT_TYPE_padding, ret);
    1539                 :          0 :                         s2n(hlen, ret);
    1540                 :          0 :                         memset(ret, 0, hlen);
    1541                 :          0 :                         ret += hlen;
    1542                 :            :                         }
    1543                 :            :                 }
    1544                 :            : 
    1545         [ +  - ]:        827 :         if ((extdatalen = ret-orig-2)== 0) 
    1546                 :            :                 return orig;
    1547                 :            : 
    1548                 :        827 :         s2n(extdatalen, orig);
    1549                 :        827 :         return ret;
    1550                 :            :         }
    1551                 :            : 
    1552                 :       1080 : unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf, unsigned char *limit, int *al)
    1553                 :            :         {
    1554                 :       1080 :         int extdatalen=0;
    1555                 :       1080 :         unsigned char *orig = buf;
    1556                 :       1080 :         unsigned char *ret = buf;
    1557                 :            :         size_t i;
    1558                 :            :         custom_srv_ext_record *record;
    1559                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
    1560                 :            :         int next_proto_neg_seen;
    1561                 :            : #endif
    1562                 :            : #ifndef OPENSSL_NO_EC
    1563                 :       1080 :         unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
    1564                 :       1080 :         unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
    1565 [ +  + ][ +  - ]:       1080 :         int using_ecc = (alg_k & (SSL_kECDHE|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA);
    1566 [ +  + ][ +  + ]:       1080 :         using_ecc = using_ecc && (s->session->tlsext_ecpointformatlist != NULL);
    1567                 :            : #endif
    1568                 :            :         /* don't add extensions for SSLv3, unless doing secure renegotiation */
    1569 [ +  + ][ +  - ]:       1080 :         if (s->version == SSL3_VERSION && !s->s3->send_connection_binding)
    1570                 :            :                 return orig;
    1571                 :            :         
    1572                 :       1080 :         ret+=2;
    1573         [ +  - ]:       1080 :         if (ret>=limit) return NULL; /* this really never occurs, but ... */
    1574                 :            : 
    1575 [ +  + ][ -  + ]:       1080 :         if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL)
                 [ #  # ]
    1576                 :            :                 { 
    1577         [ #  # ]:          0 :                 if ((long)(limit - ret - 4) < 0) return NULL; 
    1578                 :            : 
    1579                 :          0 :                 s2n(TLSEXT_TYPE_server_name,ret);
    1580                 :          0 :                 s2n(0,ret);
    1581                 :            :                 }
    1582                 :            : 
    1583         [ +  - ]:       1080 :         if(s->s3->send_connection_binding)
    1584                 :            :         {
    1585                 :            :           int el;
    1586                 :            :           
    1587         [ -  + ]:       1080 :           if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0))
    1588                 :            :               {
    1589                 :          0 :               SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
    1590                 :          0 :               return NULL;
    1591                 :            :               }
    1592                 :            : 
    1593         [ +  - ]:       1080 :           if((limit - ret - 4 - el) < 0) return NULL;
    1594                 :            :           
    1595                 :       1080 :           s2n(TLSEXT_TYPE_renegotiate,ret);
    1596                 :       1080 :           s2n(el,ret);
    1597                 :            : 
    1598         [ -  + ]:       1080 :           if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el))
    1599                 :            :               {
    1600                 :          0 :               SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
    1601                 :          0 :               return NULL;
    1602                 :            :               }
    1603                 :            : 
    1604                 :       1080 :           ret += el;
    1605                 :            :         }
    1606                 :            : 
    1607                 :            : #ifndef OPENSSL_NO_EC
    1608         [ +  + ]:       1080 :         if (using_ecc)
    1609                 :            :                 {
    1610                 :            :                 const unsigned char *plist;
    1611                 :            :                 size_t plistlen;
    1612                 :            :                 /* Add TLS extension ECPointFormats to the ServerHello message */
    1613                 :            :                 long lenmax; 
    1614                 :            : 
    1615                 :        462 :                 tls1_get_formatlist(s, &plist, &plistlen);
    1616                 :            : 
    1617         [ +  - ]:        462 :                 if ((lenmax = limit - ret - 5) < 0) return NULL; 
    1618         [ +  - ]:        462 :                 if (plistlen > (size_t)lenmax) return NULL;
    1619         [ -  + ]:        462 :                 if (plistlen > 255)
    1620                 :            :                         {
    1621                 :          0 :                         SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
    1622                 :          0 :                         return NULL;
    1623                 :            :                         }
    1624                 :            :                 
    1625                 :        462 :                 s2n(TLSEXT_TYPE_ec_point_formats,ret);
    1626                 :        462 :                 s2n(plistlen + 1,ret);
    1627                 :        462 :                 *(ret++) = (unsigned char) plistlen;
    1628                 :        462 :                 memcpy(ret, plist, plistlen);
    1629                 :        462 :                 ret+=plistlen;
    1630                 :            : 
    1631                 :            :                 }
    1632                 :            :         /* Currently the server should not respond with a SupportedCurves extension */
    1633                 :            : #endif /* OPENSSL_NO_EC */
    1634                 :            : 
    1635 [ +  + ][ +  - ]:       1080 :         if (s->tlsext_ticket_expected && tls_use_ticket(s))
    1636                 :            :                 { 
    1637         [ +  - ]:        816 :                 if ((long)(limit - ret - 4) < 0) return NULL; 
    1638                 :        816 :                 s2n(TLSEXT_TYPE_session_ticket,ret);
    1639                 :        816 :                 s2n(0,ret);
    1640                 :            :                 }
    1641                 :            : 
    1642         [ -  + ]:       1080 :         if (s->tlsext_status_expected)
    1643                 :            :                 { 
    1644         [ #  # ]:          0 :                 if ((long)(limit - ret - 4) < 0) return NULL; 
    1645                 :          0 :                 s2n(TLSEXT_TYPE_status_request,ret);
    1646                 :          0 :                 s2n(0,ret);
    1647                 :            :                 }
    1648                 :            : 
    1649                 :            : #ifdef TLSEXT_TYPE_opaque_prf_input
    1650                 :            :         if (s->s3->server_opaque_prf_input != NULL)
    1651                 :            :                 {
    1652                 :            :                 size_t sol = s->s3->server_opaque_prf_input_len;
    1653                 :            :                 
    1654                 :            :                 if ((long)(limit - ret - 6 - sol) < 0)
    1655                 :            :                         return NULL;
    1656                 :            :                 if (sol > 0xFFFD) /* can't happen */
    1657                 :            :                         return NULL;
    1658                 :            : 
    1659                 :            :                 s2n(TLSEXT_TYPE_opaque_prf_input, ret); 
    1660                 :            :                 s2n(sol + 2, ret);
    1661                 :            :                 s2n(sol, ret);
    1662                 :            :                 memcpy(ret, s->s3->server_opaque_prf_input, sol);
    1663                 :            :                 ret += sol;
    1664                 :            :                 }
    1665                 :            : #endif
    1666                 :            : 
    1667         [ -  + ]:       1080 :         if(s->srtp_profile)
    1668                 :            :                 {
    1669                 :            :                 int el;
    1670                 :            : 
    1671                 :          0 :                 ssl_add_serverhello_use_srtp_ext(s, 0, &el, 0);
    1672                 :            :                 
    1673         [ #  # ]:          0 :                 if((limit - ret - 4 - el) < 0) return NULL;
    1674                 :            : 
    1675                 :          0 :                 s2n(TLSEXT_TYPE_use_srtp,ret);
    1676                 :          0 :                 s2n(el,ret);
    1677                 :            : 
    1678         [ #  # ]:          0 :                 if(ssl_add_serverhello_use_srtp_ext(s, ret, &el, el))
    1679                 :            :                         {
    1680                 :          0 :                         SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
    1681                 :          0 :                         return NULL;
    1682                 :            :                         }
    1683                 :          0 :                 ret+=el;
    1684                 :            :                 }
    1685                 :            : 
    1686         [ -  + ]:       1080 :         if (((s->s3->tmp.new_cipher->id & 0xFFFF)==0x80 || (s->s3->tmp.new_cipher->id & 0xFFFF)==0x81) 
    1687         [ #  # ]:          0 :                 && (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG))
    1688                 :          0 :                 { const unsigned char cryptopro_ext[36] = {
    1689                 :            :                         0xfd, 0xe8, /*65000*/
    1690                 :            :                         0x00, 0x20, /*32 bytes length*/
    1691                 :            :                         0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85, 
    1692                 :            :                         0x03,   0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06, 
    1693                 :            :                         0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08, 
    1694                 :            :                         0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17};
    1695         [ #  # ]:          0 :                         if (limit-ret<36) return NULL;
    1696                 :            :                         memcpy(ret,cryptopro_ext,36);
    1697                 :          0 :                         ret+=36;
    1698                 :            : 
    1699                 :            :                 }
    1700                 :            : 
    1701                 :            : #ifndef OPENSSL_NO_HEARTBEATS
    1702                 :            :         /* Add Heartbeat extension if we've received one */
    1703         [ +  + ]:       1080 :         if (s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED)
    1704                 :            :                 {
    1705         [ +  - ]:        827 :                 if ((limit - ret - 4 - 1) < 0)
    1706                 :            :                         return NULL;
    1707                 :        827 :                 s2n(TLSEXT_TYPE_heartbeat,ret);
    1708                 :        827 :                 s2n(1,ret);
    1709                 :            :                 /* Set mode:
    1710                 :            :                  * 1: peer may send requests
    1711                 :            :                  * 2: peer not allowed to send requests
    1712                 :            :                  */
    1713         [ -  + ]:        827 :                 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
    1714                 :          0 :                         *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
    1715                 :            :                 else
    1716                 :        827 :                         *(ret++) = SSL_TLSEXT_HB_ENABLED;
    1717                 :            : 
    1718                 :            :                 }
    1719                 :            : #endif
    1720                 :            : 
    1721                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
    1722                 :       1080 :         next_proto_neg_seen = s->s3->next_proto_neg_seen;
    1723                 :       1080 :         s->s3->next_proto_neg_seen = 0;
    1724 [ +  + ][ +  + ]:       1080 :         if (next_proto_neg_seen && s->ctx->next_protos_advertised_cb)
    1725                 :            :                 {
    1726                 :            :                 const unsigned char *npa;
    1727                 :            :                 unsigned int npalen;
    1728                 :            :                 int r;
    1729                 :            : 
    1730                 :         66 :                 r = s->ctx->next_protos_advertised_cb(s, &npa, &npalen, s->ctx->next_protos_advertised_cb_arg);
    1731         [ +  + ]:         66 :                 if (r == SSL_TLSEXT_ERR_OK)
    1732                 :            :                         {
    1733         [ -  + ]:         55 :                         if ((long)(limit - ret - 4 - npalen) < 0) return NULL;
    1734                 :         55 :                         s2n(TLSEXT_TYPE_next_proto_neg,ret);
    1735                 :         55 :                         s2n(npalen,ret);
    1736                 :         55 :                         memcpy(ret, npa, npalen);
    1737                 :         55 :                         ret += npalen;
    1738                 :       1080 :                         s->s3->next_proto_neg_seen = 1;
    1739                 :            :                         }
    1740                 :            :                 }
    1741                 :            : #endif
    1742                 :            : 
    1743         [ +  + ]:       1278 :         for (i = 0; i < s->ctx->custom_srv_ext_records_count; i++)
    1744                 :            :                 {
    1745                 :        198 :                 const unsigned char *out = NULL;
    1746                 :        198 :                 unsigned short outlen = 0;
    1747                 :        198 :                 int cb_retval = 0;
    1748                 :            : 
    1749                 :        198 :                 record = &s->ctx->custom_srv_ext_records[i];
    1750                 :            : 
    1751                 :            :                 /* NULL callback or -1 omits extension */
    1752         [ -  + ]:        198 :                 if (!record->fn2)
    1753                 :         88 :                         continue;
    1754                 :        198 :                 cb_retval = record->fn2(s, record->ext_type,
    1755                 :            :                                                                 &out, &outlen, al,
    1756                 :            :                                                                 record->arg);
    1757         [ +  - ]:        198 :                 if (cb_retval == 0)
    1758                 :          0 :                         return NULL; /* error */
    1759         [ +  + ]:        198 :                 if (cb_retval == -1)
    1760                 :         88 :                         continue; /* skip this extension */
    1761         [ +  - ]:        110 :                 if (limit < ret + 4 + outlen)
    1762                 :            :                         return NULL;
    1763                 :        110 :                 s2n(record->ext_type, ret);
    1764                 :        110 :                 s2n(outlen, ret);
    1765                 :        110 :                 memcpy(ret, out, outlen);
    1766                 :        110 :                 ret += outlen;
    1767                 :            :                 }
    1768                 :            : #ifdef TLSEXT_TYPE_encrypt_then_mac
    1769         [ +  + ]:       1080 :         if (s->s3->flags & TLS1_FLAGS_ENCRYPT_THEN_MAC)
    1770                 :            :                 {
    1771                 :            :                 /* Don't use encrypt_then_mac if AEAD: might want
    1772                 :            :                  * to disable for other ciphersuites too.
    1773                 :            :                  */
    1774         [ +  + ]:        761 :                 if (s->s3->tmp.new_cipher->algorithm_mac == SSL_AEAD)
    1775                 :        143 :                         s->s3->flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC;
    1776                 :            :                 else
    1777                 :            :                         {
    1778                 :        618 :                         s2n(TLSEXT_TYPE_encrypt_then_mac,ret);
    1779                 :        618 :                         s2n(0,ret);
    1780                 :            :                         }
    1781                 :            :                 }
    1782                 :            : #endif
    1783                 :            : 
    1784         [ +  + ]:       1080 :         if (s->s3->alpn_selected)
    1785                 :            :                 {
    1786                 :         66 :                 const unsigned char *selected = s->s3->alpn_selected;
    1787                 :         66 :                 unsigned len = s->s3->alpn_selected_len;
    1788                 :            : 
    1789         [ +  - ]:         66 :                 if ((long)(limit - ret - 4 - 2 - 1 - len) < 0)
    1790                 :            :                         return NULL;
    1791                 :         66 :                 s2n(TLSEXT_TYPE_application_layer_protocol_negotiation,ret);
    1792                 :         66 :                 s2n(3 + len,ret);
    1793                 :         66 :                 s2n(1 + len,ret);
    1794                 :         66 :                 *ret++ = len;
    1795                 :         66 :                 memcpy(ret, selected, len);
    1796                 :         66 :                 ret += len;
    1797                 :            :                 }
    1798                 :            : 
    1799         [ +  - ]:       1080 :         if ((extdatalen = ret-orig-2)== 0) 
    1800                 :            :                 return orig;
    1801                 :            : 
    1802                 :       1080 :         s2n(extdatalen, orig);
    1803                 :       1080 :         return ret;
    1804                 :            :         }
    1805                 :            : 
    1806                 :            : /* tls1_alpn_handle_client_hello is called to process the ALPN extension in a
    1807                 :            :  * ClientHello.
    1808                 :            :  *   data: the contents of the extension, not including the type and length.
    1809                 :            :  *   data_len: the number of bytes in |data|
    1810                 :            :  *   al: a pointer to the alert value to send in the event of a non-zero
    1811                 :            :  *       return.
    1812                 :            :  *
    1813                 :            :  *   returns: 0 on success. */
    1814                 :         88 : static int tls1_alpn_handle_client_hello(SSL *s, const unsigned char *data,
    1815                 :            :                                          unsigned data_len, int *al)
    1816                 :            :         {
    1817                 :            :         unsigned i;
    1818                 :            :         unsigned proto_len;
    1819                 :            :         const unsigned char *selected;
    1820                 :            :         unsigned char selected_len;
    1821                 :            :         int r;
    1822                 :            : 
    1823         [ +  - ]:         88 :         if (s->ctx->alpn_select_cb == NULL)
    1824                 :            :                 return 0;
    1825                 :            : 
    1826         [ +  - ]:         88 :         if (data_len < 2)
    1827                 :            :                 goto parse_error;
    1828                 :            : 
    1829                 :            :         /* data should contain a uint16 length followed by a series of 8-bit,
    1830                 :            :          * length-prefixed strings. */
    1831                 :        176 :         i = ((unsigned) data[0]) << 8 |
    1832                 :         88 :             ((unsigned) data[1]);
    1833                 :         88 :         data_len -= 2;
    1834                 :         88 :         data += 2;
    1835         [ +  - ]:         88 :         if (data_len != i)
    1836                 :            :                 goto parse_error;
    1837                 :            : 
    1838         [ +  - ]:         88 :         if (data_len < 2)
    1839                 :            :                 goto parse_error;
    1840                 :            : 
    1841         [ +  + ]:        231 :         for (i = 0; i < data_len;)
    1842                 :            :                 {
    1843                 :        143 :                 proto_len = data[i];
    1844                 :        143 :                 i++;
    1845                 :            : 
    1846         [ +  - ]:        143 :                 if (proto_len == 0)
    1847                 :            :                         goto parse_error;
    1848                 :            : 
    1849 [ +  - ][ +  - ]:        143 :                 if (i + proto_len < i || i + proto_len > data_len)
    1850                 :            :                         goto parse_error;
    1851                 :            : 
    1852                 :            :                 i += proto_len;
    1853                 :            :                 }
    1854                 :            : 
    1855                 :         88 :         r = s->ctx->alpn_select_cb(s, &selected, &selected_len, data, data_len,
    1856                 :            :                                    s->ctx->alpn_select_cb_arg);
    1857         [ +  + ]:         88 :         if (r == SSL_TLSEXT_ERR_OK) {
    1858         [ -  + ]:         66 :                 if (s->s3->alpn_selected)
    1859                 :          0 :                         OPENSSL_free(s->s3->alpn_selected);
    1860                 :         66 :                 s->s3->alpn_selected = OPENSSL_malloc(selected_len);
    1861         [ -  + ]:         66 :                 if (!s->s3->alpn_selected)
    1862                 :            :                         {
    1863                 :          0 :                         *al = SSL_AD_INTERNAL_ERROR;
    1864                 :          0 :                         return -1;
    1865                 :            :                         }
    1866                 :         66 :                 memcpy(s->s3->alpn_selected, selected, selected_len);
    1867                 :         66 :                 s->s3->alpn_selected_len = selected_len;
    1868                 :            :         }
    1869                 :            :         return 0;
    1870                 :            : 
    1871                 :            : parse_error:
    1872                 :          0 :         *al = SSL_AD_DECODE_ERROR;
    1873                 :          0 :         return -1;
    1874                 :            :         }
    1875                 :            : 
    1876                 :            : #ifndef OPENSSL_NO_EC
    1877                 :            : /* ssl_check_for_safari attempts to fingerprint Safari using OS X
    1878                 :            :  * SecureTransport using the TLS extension block in |d|, of length |n|.
    1879                 :            :  * Safari, since 10.6, sends exactly these extensions, in this order:
    1880                 :            :  *   SNI,
    1881                 :            :  *   elliptic_curves
    1882                 :            :  *   ec_point_formats
    1883                 :            :  *
    1884                 :            :  * We wish to fingerprint Safari because they broke ECDHE-ECDSA support in 10.8,
    1885                 :            :  * but they advertise support. So enabling ECDHE-ECDSA ciphers breaks them.
    1886                 :            :  * Sadly we cannot differentiate 10.6, 10.7 and 10.8.4 (which work), from
    1887                 :            :  * 10.8..10.8.3 (which don't work).
    1888                 :            :  */
    1889                 :          0 : static void ssl_check_for_safari(SSL *s, const unsigned char *data, const unsigned char *d, int n) {
    1890                 :            :         unsigned short type, size;
    1891                 :            :         static const unsigned char kSafariExtensionsBlock[] = {
    1892                 :            :                 0x00, 0x0a,  /* elliptic_curves extension */
    1893                 :            :                 0x00, 0x08,  /* 8 bytes */
    1894                 :            :                 0x00, 0x06,  /* 6 bytes of curve ids */
    1895                 :            :                 0x00, 0x17,  /* P-256 */
    1896                 :            :                 0x00, 0x18,  /* P-384 */
    1897                 :            :                 0x00, 0x19,  /* P-521 */
    1898                 :            : 
    1899                 :            :                 0x00, 0x0b,  /* ec_point_formats */
    1900                 :            :                 0x00, 0x02,  /* 2 bytes */
    1901                 :            :                 0x01,        /* 1 point format */
    1902                 :            :                 0x00,        /* uncompressed */
    1903                 :            :         };
    1904                 :            : 
    1905                 :            :         /* The following is only present in TLS 1.2 */
    1906                 :            :         static const unsigned char kSafariTLS12ExtensionsBlock[] = {
    1907                 :            :                 0x00, 0x0d,  /* signature_algorithms */
    1908                 :            :                 0x00, 0x0c,  /* 12 bytes */
    1909                 :            :                 0x00, 0x0a,  /* 10 bytes */
    1910                 :            :                 0x05, 0x01,  /* SHA-384/RSA */
    1911                 :            :                 0x04, 0x01,  /* SHA-256/RSA */
    1912                 :            :                 0x02, 0x01,  /* SHA-1/RSA */
    1913                 :            :                 0x04, 0x03,  /* SHA-256/ECDSA */
    1914                 :            :                 0x02, 0x03,  /* SHA-1/ECDSA */
    1915                 :            :         };
    1916                 :            : 
    1917         [ #  # ]:          0 :         if (data >= (d+n-2))
    1918                 :            :                 return;
    1919                 :          0 :         data += 2;
    1920                 :            : 
    1921         [ #  # ]:          0 :         if (data > (d+n-4))
    1922                 :            :                 return;
    1923                 :          0 :         n2s(data,type);
    1924                 :          0 :         n2s(data,size);
    1925                 :            : 
    1926         [ #  # ]:          0 :         if (type != TLSEXT_TYPE_server_name)
    1927                 :            :                 return;
    1928                 :            : 
    1929         [ #  # ]:          0 :         if (data+size > d+n)
    1930                 :            :                 return;
    1931                 :          0 :         data += size;
    1932                 :            : 
    1933 [ #  # ][ #  # ]:          0 :         if (TLS1_get_client_version(s) >= TLS1_2_VERSION)
    1934                 :            :                 {
    1935                 :          0 :                 const size_t len1 = sizeof(kSafariExtensionsBlock);
    1936                 :          0 :                 const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
    1937                 :            : 
    1938         [ #  # ]:          0 :                 if (data + len1 + len2 != d+n)
    1939                 :            :                         return;
    1940         [ #  # ]:          0 :                 if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
    1941                 :            :                         return;
    1942         [ #  # ]:          0 :                 if (memcmp(data + len1, kSafariTLS12ExtensionsBlock, len2) != 0)
    1943                 :            :                         return;
    1944                 :            :                 }
    1945                 :            :         else
    1946                 :            :                 {
    1947                 :          0 :                 const size_t len = sizeof(kSafariExtensionsBlock);
    1948                 :            : 
    1949         [ #  # ]:          0 :                 if (data + len != d+n)
    1950                 :            :                         return;
    1951         [ #  # ]:          0 :                 if (memcmp(data, kSafariExtensionsBlock, len) != 0)
    1952                 :            :                         return;
    1953                 :            :                 }
    1954                 :            : 
    1955                 :          0 :         s->s3->is_probably_safari = 1;
    1956                 :            : }
    1957                 :            : #endif /* !OPENSSL_NO_EC */
    1958                 :            : 
    1959                 :       1080 : static int ssl_scan_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al) 
    1960                 :            :         {       
    1961                 :            :         unsigned short type;
    1962                 :            :         unsigned short size;
    1963                 :            :         unsigned short len;
    1964                 :       1080 :         unsigned char *data = *p;
    1965                 :       1080 :         int renegotiate_seen = 0;
    1966                 :            :         size_t i;
    1967                 :            : 
    1968                 :       1080 :         s->servername_done = 0;
    1969                 :       1080 :         s->tlsext_status_type = -1;
    1970                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
    1971                 :       1080 :         s->s3->next_proto_neg_seen = 0;
    1972                 :            : #endif
    1973                 :            : 
    1974         [ -  + ]:       1080 :         if (s->s3->alpn_selected)
    1975                 :            :                 {
    1976                 :          0 :                 OPENSSL_free(s->s3->alpn_selected);
    1977                 :          0 :                 s->s3->alpn_selected = NULL;
    1978                 :            :                 }
    1979                 :            : 
    1980                 :            :         /* Clear observed custom extensions */
    1981                 :       1080 :         s->s3->serverinfo_client_tlsext_custom_types_count = 0;
    1982         [ -  + ]:       1080 :         if (s->s3->serverinfo_client_tlsext_custom_types != NULL)
    1983                 :            :                 {
    1984                 :          0 :                 OPENSSL_free(s->s3->serverinfo_client_tlsext_custom_types);
    1985                 :          0 :                 s->s3->serverinfo_client_tlsext_custom_types = NULL;
    1986                 :            :                 }
    1987                 :            : 
    1988                 :            : #ifndef OPENSSL_NO_HEARTBEATS
    1989                 :       1080 :         s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
    1990                 :            :                                SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
    1991                 :            : #endif
    1992                 :            : 
    1993                 :            : #ifndef OPENSSL_NO_EC
    1994         [ -  + ]:       1080 :         if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
    1995                 :          0 :                 ssl_check_for_safari(s, data, d, n);
    1996                 :            : #endif /* !OPENSSL_NO_EC */
    1997                 :            : 
    1998                 :            :         /* Clear any signature algorithms extension received */
    1999         [ -  + ]:       1080 :         if (s->cert->peer_sigalgs)
    2000                 :            :                 {
    2001                 :          0 :                 OPENSSL_free(s->cert->peer_sigalgs);
    2002                 :          0 :                 s->cert->peer_sigalgs = NULL;
    2003                 :            :                 }
    2004                 :            :         /* Clear any shared sigtnature algorithms */
    2005         [ -  + ]:       1080 :         if (s->cert->shared_sigalgs)
    2006                 :            :                 {
    2007                 :          0 :                 OPENSSL_free(s->cert->shared_sigalgs);
    2008                 :       1080 :                 s->cert->shared_sigalgs = NULL;
    2009                 :            :                 }
    2010                 :            :         /* Clear certificate digests and validity flags */
    2011         [ +  + ]:       9720 :         for (i = 0; i < SSL_PKEY_NUM; i++)
    2012                 :            :                 {
    2013                 :       8640 :                 s->cert->pkeys[i].digest = NULL;
    2014                 :       8640 :                 s->cert->pkeys[i].valid_flags = 0;
    2015                 :            :                 }
    2016                 :            : 
    2017                 :            : #ifdef TLSEXT_TYPE_encrypt_then_mac
    2018                 :       1080 :         s->s3->flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC;
    2019                 :            : #endif
    2020                 :            : 
    2021         [ +  + ]:       1080 :         if (data >= (d+n-2))
    2022                 :            :                 goto ri_check;
    2023                 :        827 :         n2s(data,len);
    2024                 :            : 
    2025         [ +  - ]:        827 :         if (data > (d+n-len)) 
    2026                 :            :                 goto ri_check;
    2027                 :            : 
    2028         [ +  + ]:       5015 :         while (data <= (d+n-4))
    2029                 :            :                 {
    2030                 :       4188 :                 n2s(data,type);
    2031                 :       4188 :                 n2s(data,size);
    2032                 :            : 
    2033         [ +  - ]:       4188 :                 if (data+size > (d+n))
    2034                 :            :                         goto ri_check;
    2035                 :            : #if 0
    2036                 :            :                 fprintf(stderr,"Received extension type %d size %d\n",type,size);
    2037                 :            : #endif
    2038         [ -  + ]:       4188 :                 if (s->tlsext_debug_cb)
    2039                 :          0 :                         s->tlsext_debug_cb(s, 0, type, data, size,
    2040                 :            :                                                 s->tlsext_debug_arg);
    2041                 :            : /* The servername extension is treated as follows:
    2042                 :            : 
    2043                 :            :    - Only the hostname type is supported with a maximum length of 255.
    2044                 :            :    - The servername is rejected if too long or if it contains zeros,
    2045                 :            :      in which case an fatal alert is generated.
    2046                 :            :    - The servername field is maintained together with the session cache.
    2047                 :            :    - When a session is resumed, the servername call back invoked in order
    2048                 :            :      to allow the application to position itself to the right context. 
    2049                 :            :    - The servername is acknowledged if it is new for a session or when 
    2050                 :            :      it is identical to a previously used for the same session. 
    2051                 :            :      Applications can control the behaviour.  They can at any time
    2052                 :            :      set a 'desirable' servername for a new SSL object. This can be the
    2053                 :            :      case for example with HTTPS when a Host: header field is received and
    2054                 :            :      a renegotiation is requested. In this case, a possible servername
    2055                 :            :      presented in the new client hello is only acknowledged if it matches
    2056                 :            :      the value of the Host: field. 
    2057                 :            :    - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
    2058                 :            :      if they provide for changing an explicit servername context for the session,
    2059                 :            :      i.e. when the session has been established with a servername extension. 
    2060                 :            :    - On session reconnect, the servername extension may be absent. 
    2061                 :            : 
    2062                 :            : */      
    2063                 :            : 
    2064         [ -  + ]:       4188 :                 if (type == TLSEXT_TYPE_server_name)
    2065                 :            :                         {
    2066                 :            :                         unsigned char *sdata;
    2067                 :            :                         int servname_type;
    2068                 :            :                         int dsize; 
    2069                 :            :                 
    2070         [ #  # ]:          0 :                         if (size < 2) 
    2071                 :            :                                 {
    2072                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2073                 :          0 :                                 return 0;
    2074                 :            :                                 }
    2075                 :          0 :                         n2s(data,dsize);  
    2076                 :          0 :                         size -= 2;
    2077         [ #  # ]:          0 :                         if (dsize > size  ) 
    2078                 :            :                                 {
    2079                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2080                 :          0 :                                 return 0;
    2081                 :            :                                 } 
    2082                 :            : 
    2083                 :            :                         sdata = data;
    2084         [ #  # ]:          0 :                         while (dsize > 3) 
    2085                 :            :                                 {
    2086                 :          0 :                                 servname_type = *(sdata++); 
    2087                 :          0 :                                 n2s(sdata,len);
    2088                 :          0 :                                 dsize -= 3;
    2089                 :            : 
    2090         [ #  # ]:          0 :                                 if (len > dsize) 
    2091                 :            :                                         {
    2092                 :          0 :                                         *al = SSL_AD_DECODE_ERROR;
    2093                 :          0 :                                         return 0;
    2094                 :            :                                         }
    2095         [ #  # ]:          0 :                                 if (s->servername_done == 0)
    2096         [ #  # ]:          0 :                                 switch (servname_type)
    2097                 :            :                                         {
    2098                 :            :                                 case TLSEXT_NAMETYPE_host_name:
    2099         [ #  # ]:          0 :                                         if (!s->hit)
    2100                 :            :                                                 {
    2101         [ #  # ]:          0 :                                                 if(s->session->tlsext_hostname)
    2102                 :            :                                                         {
    2103                 :          0 :                                                         *al = SSL_AD_DECODE_ERROR;
    2104                 :          0 :                                                         return 0;
    2105                 :            :                                                         }
    2106         [ #  # ]:          0 :                                                 if (len > TLSEXT_MAXLEN_host_name)
    2107                 :            :                                                         {
    2108                 :          0 :                                                         *al = TLS1_AD_UNRECOGNIZED_NAME;
    2109                 :          0 :                                                         return 0;
    2110                 :            :                                                         }
    2111         [ #  # ]:          0 :                                                 if ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)
    2112                 :            :                                                         {
    2113                 :          0 :                                                         *al = TLS1_AD_INTERNAL_ERROR;
    2114                 :          0 :                                                         return 0;
    2115                 :            :                                                         }
    2116                 :          0 :                                                 memcpy(s->session->tlsext_hostname, sdata, len);
    2117                 :          0 :                                                 s->session->tlsext_hostname[len]='\0';
    2118         [ #  # ]:          0 :                                                 if (strlen(s->session->tlsext_hostname) != len) {
    2119                 :          0 :                                                         OPENSSL_free(s->session->tlsext_hostname);
    2120                 :          0 :                                                         s->session->tlsext_hostname = NULL;
    2121                 :          0 :                                                         *al = TLS1_AD_UNRECOGNIZED_NAME;
    2122                 :          0 :                                                         return 0;
    2123                 :            :                                                 }
    2124                 :          0 :                                                 s->servername_done = 1; 
    2125                 :            : 
    2126                 :            :                                                 }
    2127                 :            :                                         else 
    2128                 :          0 :                                                 s->servername_done = s->session->tlsext_hostname
    2129         [ #  # ]:          0 :                                                         && strlen(s->session->tlsext_hostname) == len 
    2130 [ #  # ][ #  # ]:          0 :                                                         && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0;
    2131                 :            :                                         
    2132                 :            :                                         break;
    2133                 :            : 
    2134                 :            :                                 default:
    2135                 :            :                                         break;
    2136                 :            :                                         }
    2137                 :            :                                  
    2138                 :          0 :                                 dsize -= len;
    2139                 :            :                                 }
    2140         [ #  # ]:          0 :                         if (dsize != 0) 
    2141                 :            :                                 {
    2142                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2143                 :          0 :                                 return 0;
    2144                 :            :                                 }
    2145                 :            : 
    2146                 :            :                         }
    2147                 :            : #ifndef OPENSSL_NO_SRP
    2148         [ +  + ]:       4188 :                 else if (type == TLSEXT_TYPE_srp)
    2149                 :            :                         {
    2150 [ +  - ][ -  + ]:         22 :                         if (size <= 0 || ((len = data[0])) != (size -1))
    2151                 :            :                                 {
    2152                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2153                 :          0 :                                 return 0;
    2154                 :            :                                 }
    2155         [ -  + ]:         22 :                         if (s->srp_ctx.login != NULL)
    2156                 :            :                                 {
    2157                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2158                 :          0 :                                 return 0;
    2159                 :            :                                 }
    2160         [ +  - ]:         22 :                         if ((s->srp_ctx.login = OPENSSL_malloc(len+1)) == NULL)
    2161                 :            :                                 return -1;
    2162                 :         22 :                         memcpy(s->srp_ctx.login, &data[1], len);
    2163                 :         22 :                         s->srp_ctx.login[len]='\0';
    2164                 :            :   
    2165         [ -  + ]:         22 :                         if (strlen(s->srp_ctx.login) != len) 
    2166                 :            :                                 {
    2167                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2168                 :          0 :                                 return 0;
    2169                 :            :                                 }
    2170                 :            :                         }
    2171                 :            : #endif
    2172                 :            : 
    2173                 :            : #ifndef OPENSSL_NO_EC
    2174         [ +  + ]:       4166 :                 else if (type == TLSEXT_TYPE_ec_point_formats)
    2175                 :            :                         {
    2176                 :        594 :                         unsigned char *sdata = data;
    2177                 :        594 :                         int ecpointformatlist_length = *(sdata++);
    2178                 :            : 
    2179 [ +  - ][ -  + ]:        594 :                         if (ecpointformatlist_length != size - 1 || 
    2180                 :            :                                 ecpointformatlist_length < 1)
    2181                 :            :                                 {
    2182                 :          0 :                                 *al = TLS1_AD_DECODE_ERROR;
    2183                 :          0 :                                 return 0;
    2184                 :            :                                 }
    2185         [ +  + ]:        594 :                         if (!s->hit)
    2186                 :            :                                 {
    2187         [ -  + ]:        583 :                                 if(s->session->tlsext_ecpointformatlist)
    2188                 :            :                                         {
    2189                 :          0 :                                         OPENSSL_free(s->session->tlsext_ecpointformatlist);
    2190                 :          0 :                                         s->session->tlsext_ecpointformatlist = NULL;
    2191                 :            :                                         }
    2192                 :        583 :                                 s->session->tlsext_ecpointformatlist_length = 0;
    2193         [ -  + ]:        583 :                                 if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
    2194                 :            :                                         {
    2195                 :          0 :                                         *al = TLS1_AD_INTERNAL_ERROR;
    2196                 :          0 :                                         return 0;
    2197                 :            :                                         }
    2198                 :        583 :                                 s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
    2199                 :        583 :                                 memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
    2200                 :            :                                 }
    2201                 :            : #if 0
    2202                 :            :                         fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ecpointformatlist (length=%i) ", s->session->tlsext_ecpointformatlist_length);
    2203                 :            :                         sdata = s->session->tlsext_ecpointformatlist;
    2204                 :            :                         for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
    2205                 :            :                                 fprintf(stderr,"%i ",*(sdata++));
    2206                 :            :                         fprintf(stderr,"\n");
    2207                 :            : #endif
    2208                 :            :                         }
    2209         [ +  + ]:       3572 :                 else if (type == TLSEXT_TYPE_elliptic_curves)
    2210                 :            :                         {
    2211                 :        594 :                         unsigned char *sdata = data;
    2212                 :        594 :                         int ellipticcurvelist_length = (*(sdata++) << 8);
    2213                 :        594 :                         ellipticcurvelist_length += (*(sdata++));
    2214                 :            : 
    2215 [ +  - ][ -  + ]:        594 :                         if (ellipticcurvelist_length != size - 2 ||
    2216                 :            :                                 ellipticcurvelist_length < 1)
    2217                 :            :                                 {
    2218                 :          0 :                                 *al = TLS1_AD_DECODE_ERROR;
    2219                 :          0 :                                 return 0;
    2220                 :            :                                 }
    2221         [ +  + ]:        594 :                         if (!s->hit)
    2222                 :            :                                 {
    2223         [ -  + ]:        583 :                                 if(s->session->tlsext_ellipticcurvelist)
    2224                 :            :                                         {
    2225                 :          0 :                                         *al = TLS1_AD_DECODE_ERROR;
    2226                 :          0 :                                         return 0;
    2227                 :            :                                         }
    2228                 :        583 :                                 s->session->tlsext_ellipticcurvelist_length = 0;
    2229         [ -  + ]:        583 :                                 if ((s->session->tlsext_ellipticcurvelist = OPENSSL_malloc(ellipticcurvelist_length)) == NULL)
    2230                 :            :                                         {
    2231                 :          0 :                                         *al = TLS1_AD_INTERNAL_ERROR;
    2232                 :          0 :                                         return 0;
    2233                 :            :                                         }
    2234                 :        583 :                                 s->session->tlsext_ellipticcurvelist_length = ellipticcurvelist_length;
    2235                 :        583 :                                 memcpy(s->session->tlsext_ellipticcurvelist, sdata, ellipticcurvelist_length);
    2236                 :            :                                 }
    2237                 :            : #if 0
    2238                 :            :                         fprintf(stderr,"ssl_parse_clienthello_tlsext s->session->tlsext_ellipticcurvelist (length=%i) ", s->session->tlsext_ellipticcurvelist_length);
    2239                 :            :                         sdata = s->session->tlsext_ellipticcurvelist;
    2240                 :            :                         for (i = 0; i < s->session->tlsext_ellipticcurvelist_length; i++)
    2241                 :            :                                 fprintf(stderr,"%i ",*(sdata++));
    2242                 :            :                         fprintf(stderr,"\n");
    2243                 :            : #endif
    2244                 :            :                         }
    2245                 :            : #endif /* OPENSSL_NO_EC */
    2246                 :            : #ifdef TLSEXT_TYPE_opaque_prf_input
    2247                 :            :                 else if (type == TLSEXT_TYPE_opaque_prf_input)
    2248                 :            :                         {
    2249                 :            :                         unsigned char *sdata = data;
    2250                 :            : 
    2251                 :            :                         if (size < 2)
    2252                 :            :                                 {
    2253                 :            :                                 *al = SSL_AD_DECODE_ERROR;
    2254                 :            :                                 return 0;
    2255                 :            :                                 }
    2256                 :            :                         n2s(sdata, s->s3->client_opaque_prf_input_len);
    2257                 :            :                         if (s->s3->client_opaque_prf_input_len != size - 2)
    2258                 :            :                                 {
    2259                 :            :                                 *al = SSL_AD_DECODE_ERROR;
    2260                 :            :                                 return 0;
    2261                 :            :                                 }
    2262                 :            : 
    2263                 :            :                         if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
    2264                 :            :                                 OPENSSL_free(s->s3->client_opaque_prf_input);
    2265                 :            :                         if (s->s3->client_opaque_prf_input_len == 0)
    2266                 :            :                                 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
    2267                 :            :                         else
    2268                 :            :                                 s->s3->client_opaque_prf_input = BUF_memdup(sdata, s->s3->client_opaque_prf_input_len);
    2269                 :            :                         if (s->s3->client_opaque_prf_input == NULL)
    2270                 :            :                                 {
    2271                 :            :                                 *al = TLS1_AD_INTERNAL_ERROR;
    2272                 :            :                                 return 0;
    2273                 :            :                                 }
    2274                 :            :                         }
    2275                 :            : #endif
    2276         [ +  + ]:       2978 :                 else if (type == TLSEXT_TYPE_session_ticket)
    2277                 :            :                         {
    2278   [ -  +  #  # ]:        827 :                         if (s->tls_session_ticket_ext_cb &&
    2279                 :          0 :                             !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
    2280                 :            :                                 {
    2281                 :          0 :                                 *al = TLS1_AD_INTERNAL_ERROR;
    2282                 :          0 :                                 return 0;
    2283                 :            :                                 }
    2284                 :            :                         }
    2285         [ -  + ]:       2151 :                 else if (type == TLSEXT_TYPE_renegotiate)
    2286                 :            :                         {
    2287         [ #  # ]:          0 :                         if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al))
    2288                 :            :                                 return 0;
    2289                 :            :                         renegotiate_seen = 1;
    2290                 :            :                         }
    2291         [ +  + ]:       2151 :                 else if (type == TLSEXT_TYPE_signature_algorithms)
    2292                 :            :                         {
    2293                 :            :                         int dsize;
    2294 [ +  - ][ -  + ]:        200 :                         if (s->cert->peer_sigalgs || size < 2) 
    2295                 :            :                                 {
    2296                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2297                 :          0 :                                 return 0;
    2298                 :            :                                 }
    2299                 :        200 :                         n2s(data,dsize);
    2300                 :        200 :                         size -= 2;
    2301 [ +  - ][ +  - ]:        200 :                         if (dsize != size || dsize & 1 || !dsize) 
                 [ -  + ]
    2302                 :            :                                 {
    2303                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2304                 :          0 :                                 return 0;
    2305                 :            :                                 }
    2306         [ -  + ]:        200 :                         if (!tls1_process_sigalgs(s, data, dsize))
    2307                 :            :                                 {
    2308                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2309                 :          0 :                                 return 0;
    2310                 :            :                                 }
    2311                 :            :                         /* If sigalgs received and no shared algorithms fatal
    2312                 :            :                          * error.
    2313                 :            :                          */
    2314 [ +  - ][ -  + ]:        200 :                         if (s->cert->peer_sigalgs && !s->cert->shared_sigalgs)
    2315                 :            :                                 {
    2316                 :          0 :                                 SSLerr(SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT,
    2317                 :            :                                         SSL_R_NO_SHARED_SIGATURE_ALGORITHMS);
    2318                 :          0 :                                 *al = SSL_AD_ILLEGAL_PARAMETER;
    2319                 :          0 :                                 return 0;
    2320                 :            :                                 }
    2321                 :            :                         }
    2322         [ -  + ]:       1951 :                 else if (type == TLSEXT_TYPE_status_request)
    2323                 :            :                         {
    2324                 :            :                 
    2325         [ #  # ]:          0 :                         if (size < 5) 
    2326                 :            :                                 {
    2327                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2328                 :          0 :                                 return 0;
    2329                 :            :                                 }
    2330                 :            : 
    2331                 :          0 :                         s->tlsext_status_type = *data++;
    2332                 :          0 :                         size--;
    2333         [ #  # ]:          0 :                         if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp)
    2334                 :            :                                 {
    2335                 :            :                                 const unsigned char *sdata;
    2336                 :            :                                 int dsize;
    2337                 :            :                                 /* Read in responder_id_list */
    2338                 :          0 :                                 n2s(data,dsize);
    2339                 :          0 :                                 size -= 2;
    2340         [ #  # ]:          0 :                                 if (dsize > size  ) 
    2341                 :            :                                         {
    2342                 :          0 :                                         *al = SSL_AD_DECODE_ERROR;
    2343                 :          0 :                                         return 0;
    2344                 :            :                                         }
    2345         [ #  # ]:          0 :                                 while (dsize > 0)
    2346                 :            :                                         {
    2347                 :            :                                         OCSP_RESPID *id;
    2348                 :            :                                         int idsize;
    2349         [ #  # ]:          0 :                                         if (dsize < 4)
    2350                 :            :                                                 {
    2351                 :          0 :                                                 *al = SSL_AD_DECODE_ERROR;
    2352                 :          0 :                                                 return 0;
    2353                 :            :                                                 }
    2354                 :          0 :                                         n2s(data, idsize);
    2355                 :          0 :                                         dsize -= 2 + idsize;
    2356                 :          0 :                                         size -= 2 + idsize;
    2357         [ #  # ]:          0 :                                         if (dsize < 0)
    2358                 :            :                                                 {
    2359                 :          0 :                                                 *al = SSL_AD_DECODE_ERROR;
    2360                 :          0 :                                                 return 0;
    2361                 :            :                                                 }
    2362                 :          0 :                                         sdata = data;
    2363                 :          0 :                                         data += idsize;
    2364                 :          0 :                                         id = d2i_OCSP_RESPID(NULL,
    2365                 :            :                                                                 &sdata, idsize);
    2366         [ #  # ]:          0 :                                         if (!id)
    2367                 :            :                                                 {
    2368                 :          0 :                                                 *al = SSL_AD_DECODE_ERROR;
    2369                 :          0 :                                                 return 0;
    2370                 :            :                                                 }
    2371         [ #  # ]:          0 :                                         if (data != sdata)
    2372                 :            :                                                 {
    2373                 :          0 :                                                 OCSP_RESPID_free(id);
    2374                 :          0 :                                                 *al = SSL_AD_DECODE_ERROR;
    2375                 :          0 :                                                 return 0;
    2376                 :            :                                                 }
    2377         [ #  # ]:          0 :                                         if (!s->tlsext_ocsp_ids
    2378         [ #  # ]:          0 :                                                 && !(s->tlsext_ocsp_ids =
    2379                 :          0 :                                                 sk_OCSP_RESPID_new_null()))
    2380                 :            :                                                 {
    2381                 :          0 :                                                 OCSP_RESPID_free(id);
    2382                 :          0 :                                                 *al = SSL_AD_INTERNAL_ERROR;
    2383                 :          0 :                                                 return 0;
    2384                 :            :                                                 }
    2385         [ #  # ]:          0 :                                         if (!sk_OCSP_RESPID_push(
    2386                 :            :                                                         s->tlsext_ocsp_ids, id))
    2387                 :            :                                                 {
    2388                 :          0 :                                                 OCSP_RESPID_free(id);
    2389                 :          0 :                                                 *al = SSL_AD_INTERNAL_ERROR;
    2390                 :          0 :                                                 return 0;
    2391                 :            :                                                 }
    2392                 :            :                                         }
    2393                 :            : 
    2394                 :            :                                 /* Read in request_extensions */
    2395         [ #  # ]:          0 :                                 if (size < 2)
    2396                 :            :                                         {
    2397                 :          0 :                                         *al = SSL_AD_DECODE_ERROR;
    2398                 :          0 :                                         return 0;
    2399                 :            :                                         }
    2400                 :          0 :                                 n2s(data,dsize);
    2401                 :          0 :                                 size -= 2;
    2402         [ #  # ]:          0 :                                 if (dsize != size)
    2403                 :            :                                         {
    2404                 :          0 :                                         *al = SSL_AD_DECODE_ERROR;
    2405                 :          0 :                                         return 0;
    2406                 :            :                                         }
    2407                 :          0 :                                 sdata = data;
    2408         [ #  # ]:          0 :                                 if (dsize > 0)
    2409                 :            :                                         {
    2410         [ #  # ]:          0 :                                         if (s->tlsext_ocsp_exts)
    2411                 :            :                                                 {
    2412                 :          0 :                                                 sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
    2413                 :            :                                                                            X509_EXTENSION_free);
    2414                 :            :                                                 }
    2415                 :            : 
    2416                 :          0 :                                         s->tlsext_ocsp_exts =
    2417                 :          0 :                                                 d2i_X509_EXTENSIONS(NULL,
    2418                 :            :                                                         &sdata, dsize);
    2419         [ #  # ]:          0 :                                         if (!s->tlsext_ocsp_exts
    2420         [ #  # ]:          0 :                                                 || (data + dsize != sdata))
    2421                 :            :                                                 {
    2422                 :          0 :                                                 *al = SSL_AD_DECODE_ERROR;
    2423                 :          0 :                                                 return 0;
    2424                 :            :                                                 }
    2425                 :            :                                         }
    2426                 :            :                                 }
    2427                 :            :                                 /* We don't know what to do with any other type
    2428                 :            :                                 * so ignore it.
    2429                 :            :                                 */
    2430                 :            :                                 else
    2431                 :          0 :                                         s->tlsext_status_type = -1;
    2432                 :            :                         }
    2433                 :            : #ifndef OPENSSL_NO_HEARTBEATS
    2434         [ +  + ]:       1951 :                 else if (type == TLSEXT_TYPE_heartbeat)
    2435                 :            :                         {
    2436      [ +  -  - ]:        827 :                         switch(data[0])
    2437                 :            :                                 {
    2438                 :            :                                 case 0x01:      /* Client allows us to send HB requests */
    2439                 :        827 :                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
    2440                 :        827 :                                                         break;
    2441                 :            :                                 case 0x02:      /* Client doesn't accept HB requests */
    2442                 :          0 :                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
    2443                 :          0 :                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
    2444                 :          0 :                                                         break;
    2445                 :          0 :                                 default:        *al = SSL_AD_ILLEGAL_PARAMETER;
    2446                 :          0 :                                                         return 0;
    2447                 :            :                                 }
    2448                 :            :                         }
    2449                 :            : #endif
    2450                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
    2451 [ +  + ][ +  - ]:       1124 :                 else if (type == TLSEXT_TYPE_next_proto_neg &&
    2452         [ +  - ]:         77 :                          s->s3->tmp.finish_md_len == 0 &&
    2453                 :         77 :                          s->s3->alpn_selected == NULL)
    2454                 :            :                         {
    2455                 :            :                         /* We shouldn't accept this extension on a
    2456                 :            :                          * renegotiation.
    2457                 :            :                          *
    2458                 :            :                          * s->new_session will be set on renegotiation, but we
    2459                 :            :                          * probably shouldn't rely that it couldn't be set on
    2460                 :            :                          * the initial renegotation too in certain cases (when
    2461                 :            :                          * there's some other reason to disallow resuming an
    2462                 :            :                          * earlier session -- the current code won't be doing
    2463                 :            :                          * anything like that, but this might change).
    2464                 :            : 
    2465                 :            :                          * A valid sign that there's been a previous handshake
    2466                 :            :                          * in this connection is if s->s3->tmp.finish_md_len >
    2467                 :            :                          * 0.  (We are talking about a check that will happen
    2468                 :            :                          * in the Hello protocol round, well before a new
    2469                 :            :                          * Finished message could have been computed.) */
    2470                 :         77 :                         s->s3->next_proto_neg_seen = 1;
    2471                 :            :                         }
    2472                 :            : #endif
    2473                 :            : 
    2474 [ +  + ][ +  - ]:       1047 :                 else if (type == TLSEXT_TYPE_application_layer_protocol_negotiation &&
    2475         [ +  - ]:         88 :                          s->ctx->alpn_select_cb &&
    2476                 :         88 :                          s->s3->tmp.finish_md_len == 0)
    2477                 :            :                         {
    2478         [ +  - ]:         88 :                         if (tls1_alpn_handle_client_hello(s, data, size, al) != 0)
    2479                 :            :                                 return 0;
    2480                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
    2481                 :            :                         /* ALPN takes precedence over NPN. */
    2482                 :         88 :                         s->s3->next_proto_neg_seen = 0;
    2483                 :            : #endif
    2484                 :            :                         }
    2485                 :            : 
    2486                 :            :                 /* session ticket processed earlier */
    2487         [ -  + ]:        959 :                 else if (type == TLSEXT_TYPE_use_srtp)
    2488                 :            :                         {
    2489         [ #  # ]:          0 :                         if(ssl_parse_clienthello_use_srtp_ext(s, data, size,
    2490                 :            :                                                               al))
    2491                 :            :                                 return 0;
    2492                 :            :                         }
    2493                 :            :                 /* If this ClientHello extension was unhandled and this is 
    2494                 :            :                  * a nonresumed connection, check whether the extension is a 
    2495                 :            :                  * custom TLS Extension (has a custom_srv_ext_record), and if
    2496                 :            :                  * so call the callback and record the extension number so that
    2497                 :            :                  * an appropriate ServerHello may be later returned.
    2498                 :            :                  */
    2499 [ +  + ][ +  + ]:        959 :                 else if (!s->hit && s->ctx->custom_srv_ext_records_count)
    2500                 :            :                         {
    2501                 :            :                         custom_srv_ext_record *record;
    2502                 :            : 
    2503         [ +  + ]:        946 :                         for (i=0; i < s->ctx->custom_srv_ext_records_count; i++)
    2504                 :            :                                 {
    2505                 :        748 :                                 record = &s->ctx->custom_srv_ext_records[i];
    2506         [ +  + ]:        748 :                                 if (type == record->ext_type)
    2507                 :            :                                         {
    2508 [ +  - ][ +  - ]:        132 :                                         if (record->fn1 && !record->fn1(s, type, data, size, al, record->arg))
    2509                 :            :                                                 return 0;
    2510                 :            :                                         }                                               
    2511                 :            :                                 }
    2512                 :            :                         }
    2513                 :            : #ifdef TLSEXT_TYPE_encrypt_then_mac
    2514         [ +  - ]:        761 :                 else if (type == TLSEXT_TYPE_encrypt_then_mac)
    2515                 :        761 :                         s->s3->flags |= TLS1_FLAGS_ENCRYPT_THEN_MAC;
    2516                 :            : #endif
    2517                 :            : 
    2518                 :       4188 :                 data+=size;
    2519                 :            :                 }
    2520                 :            : 
    2521                 :        827 :         *p = data;
    2522                 :            : 
    2523                 :            :         ri_check:
    2524                 :            : 
    2525                 :            :         /* Need RI if renegotiating */
    2526                 :            : 
    2527 [ +  - ][ -  + ]:       1080 :         if (!renegotiate_seen && s->renegotiate &&
                 [ #  # ]
    2528                 :          0 :                 !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
    2529                 :            :                 {
    2530                 :          0 :                 *al = SSL_AD_HANDSHAKE_FAILURE;
    2531                 :          0 :                 SSLerr(SSL_F_SSL_SCAN_CLIENTHELLO_TLSEXT,
    2532                 :            :                                 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
    2533                 :          0 :                 return 0;
    2534                 :            :                 }
    2535                 :            :         /* If no signature algorithms extension set default values */
    2536         [ +  + ]:       1080 :         if (!s->cert->peer_sigalgs)
    2537                 :        880 :                 ssl_cert_set_default_md(s->cert);
    2538                 :            : 
    2539                 :            :         return 1;
    2540                 :            :         }
    2541                 :            : 
    2542                 :       1080 : int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n) 
    2543                 :            :         {
    2544                 :       1080 :         int al = -1;
    2545         [ -  + ]:       1080 :         if (ssl_scan_clienthello_tlsext(s, p, d, n, &al) <= 0) 
    2546                 :            :                 {
    2547                 :          0 :                 ssl3_send_alert(s,SSL3_AL_FATAL,al); 
    2548                 :          0 :                 return 0;
    2549                 :            :                 }
    2550                 :            : 
    2551         [ -  + ]:       1080 :         if (ssl_check_clienthello_tlsext_early(s) <= 0) 
    2552                 :            :                 {
    2553                 :          0 :                 SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT,SSL_R_CLIENTHELLO_TLSEXT);
    2554                 :          0 :                 return 0;
    2555                 :            :                 }
    2556                 :            :         return 1;
    2557                 :            : }
    2558                 :            : 
    2559                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
    2560                 :            : /* ssl_next_proto_validate validates a Next Protocol Negotiation block. No
    2561                 :            :  * elements of zero length are allowed and the set of elements must exactly fill
    2562                 :            :  * the length of the block. */
    2563                 :         55 : static char ssl_next_proto_validate(unsigned char *d, unsigned len)
    2564                 :            :         {
    2565                 :         55 :         unsigned int off = 0;
    2566                 :            : 
    2567         [ +  + ]:        110 :         while (off < len)
    2568                 :            :                 {
    2569         [ +  - ]:         55 :                 if (d[off] == 0)
    2570                 :            :                         return 0;
    2571                 :         55 :                 off += d[off];
    2572                 :         55 :                 off++;
    2573                 :            :                 }
    2574                 :            : 
    2575                 :         55 :         return off == len;
    2576                 :            :         }
    2577                 :            : #endif
    2578                 :            : 
    2579                 :       1080 : static int ssl_scan_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al)
    2580                 :            :         {
    2581                 :            :         unsigned short length;
    2582                 :            :         unsigned short type;
    2583                 :            :         unsigned short size;
    2584                 :       1080 :         unsigned char *data = *p;
    2585                 :       1080 :         int tlsext_servername = 0;
    2586                 :       1080 :         int renegotiate_seen = 0;
    2587                 :            : 
    2588                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
    2589                 :       1080 :         s->s3->next_proto_neg_seen = 0;
    2590                 :            : #endif
    2591                 :            : 
    2592         [ -  + ]:       1080 :         if (s->s3->alpn_selected)
    2593                 :            :                 {
    2594                 :          0 :                 OPENSSL_free(s->s3->alpn_selected);
    2595                 :          0 :                 s->s3->alpn_selected = NULL;
    2596                 :            :                 }
    2597                 :            : 
    2598                 :            : #ifndef OPENSSL_NO_HEARTBEATS
    2599                 :       1080 :         s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
    2600                 :            :                                SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
    2601                 :            : #endif
    2602                 :            : 
    2603                 :            : #ifdef TLSEXT_TYPE_encrypt_then_mac
    2604                 :       1080 :         s->s3->flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC;
    2605                 :            : #endif
    2606                 :            : 
    2607         [ +  - ]:       1080 :         if (data >= (d+n-2))
    2608                 :            :                 goto ri_check;
    2609                 :            : 
    2610                 :       1080 :         n2s(data,length);
    2611         [ +  - ]:       1080 :         if (data+length != d+n)
    2612                 :            :                 {
    2613                 :          0 :                 *al = SSL_AD_DECODE_ERROR;
    2614                 :          0 :                 return 0;
    2615                 :            :                 }
    2616                 :            : 
    2617         [ +  + ]:       5114 :         while(data <= (d+n-4))
    2618                 :            :                 {
    2619                 :       4034 :                 n2s(data,type);
    2620                 :       4034 :                 n2s(data,size);
    2621                 :            : 
    2622         [ +  - ]:       4034 :                 if (data+size > (d+n))
    2623                 :            :                         goto ri_check;
    2624                 :            : 
    2625         [ -  + ]:       4034 :                 if (s->tlsext_debug_cb)
    2626                 :          0 :                         s->tlsext_debug_cb(s, 1, type, data, size,
    2627                 :            :                                                 s->tlsext_debug_arg);
    2628                 :            : 
    2629         [ -  + ]:       4034 :                 if (type == TLSEXT_TYPE_server_name)
    2630                 :            :                         {
    2631 [ #  # ][ #  # ]:          0 :                         if (s->tlsext_hostname == NULL || size > 0)
    2632                 :            :                                 {
    2633                 :          0 :                                 *al = TLS1_AD_UNRECOGNIZED_NAME;
    2634                 :          0 :                                 return 0;
    2635                 :            :                                 }
    2636                 :            :                         tlsext_servername = 1;   
    2637                 :            :                         }
    2638                 :            : 
    2639                 :            : #ifndef OPENSSL_NO_EC
    2640         [ +  + ]:       4034 :                 else if (type == TLSEXT_TYPE_ec_point_formats)
    2641                 :            :                         {
    2642                 :        462 :                         unsigned char *sdata = data;
    2643                 :        462 :                         int ecpointformatlist_length = *(sdata++);
    2644                 :            : 
    2645         [ -  + ]:        462 :                         if (ecpointformatlist_length != size - 1)
    2646                 :            :                                 {
    2647                 :          0 :                                 *al = TLS1_AD_DECODE_ERROR;
    2648                 :          0 :                                 return 0;
    2649                 :            :                                 }
    2650                 :        462 :                         s->session->tlsext_ecpointformatlist_length = 0;
    2651         [ -  + ]:        462 :                         if (s->session->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->session->tlsext_ecpointformatlist);
    2652         [ -  + ]:        462 :                         if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL)
    2653                 :            :                                 {
    2654                 :          0 :                                 *al = TLS1_AD_INTERNAL_ERROR;
    2655                 :          0 :                                 return 0;
    2656                 :            :                                 }
    2657                 :        462 :                         s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length;
    2658                 :        462 :                         memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length);
    2659                 :            : #if 0
    2660                 :            :                         fprintf(stderr,"ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist ");
    2661                 :            :                         sdata = s->session->tlsext_ecpointformatlist;
    2662                 :            :                         for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
    2663                 :            :                                 fprintf(stderr,"%i ",*(sdata++));
    2664                 :            :                         fprintf(stderr,"\n");
    2665                 :            : #endif
    2666                 :            :                         }
    2667                 :            : #endif /* OPENSSL_NO_EC */
    2668                 :            : 
    2669         [ +  + ]:       3572 :                 else if (type == TLSEXT_TYPE_session_ticket)
    2670                 :            :                         {
    2671   [ -  +  #  # ]:        816 :                         if (s->tls_session_ticket_ext_cb &&
    2672                 :          0 :                             !s->tls_session_ticket_ext_cb(s, data, size, s->tls_session_ticket_ext_cb_arg))
    2673                 :            :                                 {
    2674                 :          0 :                                 *al = TLS1_AD_INTERNAL_ERROR;
    2675                 :          0 :                                 return 0;
    2676                 :            :                                 }
    2677 [ +  - ][ -  + ]:        816 :                         if (!tls_use_ticket(s) || (size > 0))
    2678                 :            :                                 {
    2679                 :          0 :                                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
    2680                 :          0 :                                 return 0;
    2681                 :            :                                 }
    2682                 :        816 :                         s->tlsext_ticket_expected = 1;
    2683                 :            :                         }
    2684                 :            : #ifdef TLSEXT_TYPE_opaque_prf_input
    2685                 :            :                 else if (type == TLSEXT_TYPE_opaque_prf_input)
    2686                 :            :                         {
    2687                 :            :                         unsigned char *sdata = data;
    2688                 :            : 
    2689                 :            :                         if (size < 2)
    2690                 :            :                                 {
    2691                 :            :                                 *al = SSL_AD_DECODE_ERROR;
    2692                 :            :                                 return 0;
    2693                 :            :                                 }
    2694                 :            :                         n2s(sdata, s->s3->server_opaque_prf_input_len);
    2695                 :            :                         if (s->s3->server_opaque_prf_input_len != size - 2)
    2696                 :            :                                 {
    2697                 :            :                                 *al = SSL_AD_DECODE_ERROR;
    2698                 :            :                                 return 0;
    2699                 :            :                                 }
    2700                 :            :                         
    2701                 :            :                         if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
    2702                 :            :                                 OPENSSL_free(s->s3->server_opaque_prf_input);
    2703                 :            :                         if (s->s3->server_opaque_prf_input_len == 0)
    2704                 :            :                                 s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
    2705                 :            :                         else
    2706                 :            :                                 s->s3->server_opaque_prf_input = BUF_memdup(sdata, s->s3->server_opaque_prf_input_len);
    2707                 :            : 
    2708                 :            :                         if (s->s3->server_opaque_prf_input == NULL)
    2709                 :            :                                 {
    2710                 :            :                                 *al = TLS1_AD_INTERNAL_ERROR;
    2711                 :            :                                 return 0;
    2712                 :            :                                 }
    2713                 :            :                         }
    2714                 :            : #endif
    2715         [ -  + ]:       2756 :                 else if (type == TLSEXT_TYPE_status_request)
    2716                 :            :                         {
    2717                 :            :                         /* MUST be empty and only sent if we've requested
    2718                 :            :                          * a status request message.
    2719                 :            :                          */ 
    2720 [ #  # ][ #  # ]:          0 :                         if ((s->tlsext_status_type == -1) || (size > 0))
    2721                 :            :                                 {
    2722                 :          0 :                                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
    2723                 :          0 :                                 return 0;
    2724                 :            :                                 }
    2725                 :            :                         /* Set flag to expect CertificateStatus message */
    2726                 :          0 :                         s->tlsext_status_expected = 1;
    2727                 :            :                         }
    2728                 :            : #ifndef OPENSSL_NO_NEXTPROTONEG
    2729 [ +  + ][ +  - ]:       2756 :                 else if (type == TLSEXT_TYPE_next_proto_neg &&
    2730                 :         55 :                          s->s3->tmp.finish_md_len == 0)
    2731                 :         55 :                         {
    2732                 :            :                         unsigned char *selected;
    2733                 :            :                         unsigned char selected_len;
    2734                 :            : 
    2735                 :            :                         /* We must have requested it. */
    2736         [ -  + ]:         55 :                         if (s->ctx->next_proto_select_cb == NULL)
    2737                 :            :                                 {
    2738                 :          0 :                                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
    2739                 :          0 :                                 return 0;
    2740                 :            :                                 }
    2741                 :            :                         /* The data must be valid */
    2742         [ -  + ]:         55 :                         if (!ssl_next_proto_validate(data, size))
    2743                 :            :                                 {
    2744                 :          0 :                                 *al = TLS1_AD_DECODE_ERROR;
    2745                 :          0 :                                 return 0;
    2746                 :            :                                 }
    2747         [ -  + ]:         55 :                         if (s->ctx->next_proto_select_cb(s, &selected, &selected_len, data, size, s->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK)
    2748                 :            :                                 {
    2749                 :          0 :                                 *al = TLS1_AD_INTERNAL_ERROR;
    2750                 :          0 :                                 return 0;
    2751                 :            :                                 }
    2752                 :         55 :                         s->next_proto_negotiated = OPENSSL_malloc(selected_len);
    2753         [ -  + ]:         55 :                         if (!s->next_proto_negotiated)
    2754                 :            :                                 {
    2755                 :          0 :                                 *al = TLS1_AD_INTERNAL_ERROR;
    2756                 :          0 :                                 return 0;
    2757                 :            :                                 }
    2758                 :         55 :                         memcpy(s->next_proto_negotiated, selected, selected_len);
    2759                 :         55 :                         s->next_proto_negotiated_len = selected_len;
    2760                 :         55 :                         s->s3->next_proto_neg_seen = 1;
    2761                 :            :                         }
    2762                 :            : #endif
    2763                 :            : 
    2764         [ +  + ]:       2701 :                 else if (type == TLSEXT_TYPE_application_layer_protocol_negotiation)
    2765                 :            :                         {
    2766                 :            :                         unsigned len;
    2767                 :            : 
    2768                 :            :                         /* We must have requested it. */
    2769         [ -  + ]:         66 :                         if (s->alpn_client_proto_list == NULL)
    2770                 :            :                                 {
    2771                 :          0 :                                 *al = TLS1_AD_UNSUPPORTED_EXTENSION;
    2772                 :          0 :                                 return 0;
    2773                 :            :                                 }
    2774         [ -  + ]:         66 :                         if (size < 4)
    2775                 :            :                                 {
    2776                 :          0 :                                 *al = TLS1_AD_DECODE_ERROR;
    2777                 :          0 :                                 return 0;
    2778                 :            :                                 }
    2779                 :            :                         /* The extension data consists of:
    2780                 :            :                          *   uint16 list_length
    2781                 :            :                          *   uint8 proto_length;
    2782                 :            :                          *   uint8 proto[proto_length]; */
    2783                 :         66 :                         len = data[0];
    2784                 :         66 :                         len <<= 8;
    2785                 :         66 :                         len |= data[1];
    2786         [ -  + ]:         66 :                         if (len != (unsigned) size - 2)
    2787                 :            :                                 {
    2788                 :          0 :                                 *al = TLS1_AD_DECODE_ERROR;
    2789                 :          0 :                                 return 0;
    2790                 :            :                                 }
    2791                 :         66 :                         len = data[2];
    2792         [ -  + ]:         66 :                         if (len != (unsigned) size - 3)
    2793                 :            :                                 {
    2794                 :          0 :                                 *al = TLS1_AD_DECODE_ERROR;
    2795                 :          0 :                                 return 0;
    2796                 :            :                                 }
    2797         [ -  + ]:         66 :                         if (s->s3->alpn_selected)
    2798                 :          0 :                                 OPENSSL_free(s->s3->alpn_selected);
    2799                 :         66 :                         s->s3->alpn_selected = OPENSSL_malloc(len);
    2800         [ -  + ]:         66 :                         if (!s->s3->alpn_selected)
    2801                 :            :                                 {
    2802                 :          0 :                                 *al = TLS1_AD_INTERNAL_ERROR;
    2803                 :          0 :                                 return 0;
    2804                 :            :                                 }
    2805                 :         66 :                         memcpy(s->s3->alpn_selected, data + 3, len);
    2806                 :         66 :                         s->s3->alpn_selected_len = len;
    2807                 :            :                         }
    2808                 :            : 
    2809         [ +  + ]:       2635 :                 else if (type == TLSEXT_TYPE_renegotiate)
    2810                 :            :                         {
    2811         [ +  - ]:       1080 :                         if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al))
    2812                 :            :                                 return 0;
    2813                 :            :                         renegotiate_seen = 1;
    2814                 :            :                         }
    2815                 :            : #ifndef OPENSSL_NO_HEARTBEATS
    2816         [ +  + ]:       1555 :                 else if (type == TLSEXT_TYPE_heartbeat)
    2817                 :            :                         {
    2818      [ +  -  - ]:        827 :                         switch(data[0])
    2819                 :            :                                 {
    2820                 :            :                                 case 0x01:      /* Server allows us to send HB requests */
    2821                 :        827 :                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
    2822                 :        827 :                                                         break;
    2823                 :            :                                 case 0x02:      /* Server doesn't accept HB requests */
    2824                 :          0 :                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
    2825                 :          0 :                                                         s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
    2826                 :          0 :                                                         break;
    2827                 :          0 :                                 default:        *al = SSL_AD_ILLEGAL_PARAMETER;
    2828                 :          0 :                                                         return 0;
    2829                 :            :                                 }
    2830                 :            :                         }
    2831                 :            : #endif
    2832         [ -  + ]:        728 :                 else if (type == TLSEXT_TYPE_use_srtp)
    2833                 :            :                         {
    2834         [ #  # ]:          0 :                         if(ssl_parse_serverhello_use_srtp_ext(s, data, size,
    2835                 :            :                                                               al))
    2836                 :            :                                 return 0;
    2837                 :            :                         }
    2838                 :            :                 /* If this extension type was not otherwise handled, but 
    2839                 :            :                  * matches a custom_cli_ext_record, then send it to the c
    2840                 :            :                  * callback */
    2841         [ +  + ]:        728 :                 else if (s->ctx->custom_cli_ext_records_count)
    2842                 :            :                         {
    2843                 :            :                         size_t i;
    2844                 :            :                         custom_cli_ext_record* record;
    2845                 :            : 
    2846         [ +  - ]:        286 :                         for (i = 0; i < s->ctx->custom_cli_ext_records_count; i++)
    2847                 :            :                                 {
    2848                 :        286 :                                 record = &s->ctx->custom_cli_ext_records[i];
    2849         [ +  + ]:        286 :                                 if (record->ext_type == type)
    2850                 :            :                                         {
    2851 [ +  - ][ +  - ]:        110 :                                         if (record->fn2 && !record->fn2(s, type, data, size, al, record->arg))
    2852                 :            :                                                 return 0;
    2853                 :            :                                         break;
    2854                 :            :                                         }
    2855                 :            :                                 }                       
    2856                 :            :                         }
    2857                 :            : #ifdef TLSEXT_TYPE_encrypt_then_mac
    2858         [ +  - ]:        618 :                 else if (type == TLSEXT_TYPE_encrypt_then_mac)
    2859                 :            :                         {
    2860                 :            :                         /* Ignore if inappropriate ciphersuite */
    2861         [ +  - ]:        618 :                         if (s->s3->tmp.new_cipher->algorithm_mac != SSL_AEAD)
    2862                 :        618 :                                 s->s3->flags |= TLS1_FLAGS_ENCRYPT_THEN_MAC;
    2863                 :            :                         }
    2864                 :            : #endif
    2865                 :            :  
    2866                 :       4034 :                 data += size;
    2867                 :            :                 }
    2868                 :            : 
    2869         [ -  + ]:       1080 :         if (data != d+n)
    2870                 :            :                 {
    2871                 :          0 :                 *al = SSL_AD_DECODE_ERROR;
    2872                 :          0 :                 return 0;
    2873                 :            :                 }
    2874                 :            : 
    2875 [ +  + ][ -  + ]:       1080 :         if (!s->hit && tlsext_servername == 1)
    2876                 :            :                 {
    2877         [ #  # ]:          0 :                 if (s->tlsext_hostname)
    2878                 :            :                         {
    2879         [ #  # ]:          0 :                         if (s->session->tlsext_hostname == NULL)
    2880                 :            :                                 {
    2881                 :          0 :                                 s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname);  
    2882         [ #  # ]:          0 :                                 if (!s->session->tlsext_hostname)
    2883                 :            :                                         {
    2884                 :          0 :                                         *al = SSL_AD_UNRECOGNIZED_NAME;
    2885                 :          0 :                                         return 0;
    2886                 :            :                                         }
    2887                 :            :                                 }
    2888                 :            :                         else 
    2889                 :            :                                 {
    2890                 :          0 :                                 *al = SSL_AD_DECODE_ERROR;
    2891                 :          0 :                                 return 0;
    2892                 :            :                                 }
    2893                 :            :                         }
    2894                 :            :                 }
    2895                 :            : 
    2896                 :       1080 :         *p = data;
    2897                 :            : 
    2898                 :            :         ri_check:
    2899                 :            : 
    2900                 :            :         /* Determine if we need to see RI. Strictly speaking if we want to
    2901                 :            :          * avoid an attack we should *always* see RI even on initial server
    2902                 :            :          * hello because the client doesn't see any renegotiation during an
    2903                 :            :          * attack. However this would mean we could not connect to any server
    2904                 :            :          * which doesn't support RI so for the immediate future tolerate RI
    2905                 :            :          * absence on initial connect only.
    2906                 :            :          */
    2907         [ -  + ]:       1080 :         if (!renegotiate_seen
    2908                 :            :                 && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT)
    2909         [ #  # ]:          0 :                 && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION))
    2910                 :            :                 {
    2911                 :          0 :                 *al = SSL_AD_HANDSHAKE_FAILURE;
    2912                 :          0 :                 SSLerr(SSL_F_SSL_SCAN_SERVERHELLO_TLSEXT,
    2913                 :            :                                 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
    2914                 :          0 :                 return 0;
    2915                 :            :                 }
    2916                 :            : 
    2917                 :            :         return 1;
    2918                 :            :         }
    2919                 :            : 
    2920                 :            : 
    2921                 :       1080 : int ssl_prepare_clienthello_tlsext(SSL *s)
    2922                 :            :         {
    2923                 :            : 
    2924                 :            : #ifdef TLSEXT_TYPE_opaque_prf_input
    2925                 :            :         {
    2926                 :            :                 int r = 1;
    2927                 :            :         
    2928                 :            :                 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
    2929                 :            :                         {
    2930                 :            :                         r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
    2931                 :            :                         if (!r)
    2932                 :            :                                 return -1;
    2933                 :            :                         }
    2934                 :            : 
    2935                 :            :                 if (s->tlsext_opaque_prf_input != NULL)
    2936                 :            :                         {
    2937                 :            :                         if (s->s3->client_opaque_prf_input != NULL) /* shouldn't really happen */
    2938                 :            :                                 OPENSSL_free(s->s3->client_opaque_prf_input);
    2939                 :            : 
    2940                 :            :                         if (s->tlsext_opaque_prf_input_len == 0)
    2941                 :            :                                 s->s3->client_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
    2942                 :            :                         else
    2943                 :            :                                 s->s3->client_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
    2944                 :            :                         if (s->s3->client_opaque_prf_input == NULL)
    2945                 :            :                                 {
    2946                 :            :                                 SSLerr(SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT,ERR_R_MALLOC_FAILURE);
    2947                 :            :                                 return -1;
    2948                 :            :                                 }
    2949                 :            :                         s->s3->client_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
    2950                 :            :                         }
    2951                 :            : 
    2952                 :            :                 if (r == 2)
    2953                 :            :                         /* at callback's request, insist on receiving an appropriate server opaque PRF input */
    2954                 :            :                         s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
    2955                 :            :         }
    2956                 :            : #endif
    2957                 :            : 
    2958                 :       1080 :         return 1;
    2959                 :            :         }
    2960                 :            : 
    2961                 :       1080 : int ssl_prepare_serverhello_tlsext(SSL *s)
    2962                 :            :         {
    2963                 :       1080 :         return 1;
    2964                 :            :         }
    2965                 :            : 
    2966                 :       1080 : static int ssl_check_clienthello_tlsext_early(SSL *s)
    2967                 :            :         {
    2968                 :       1080 :         int ret=SSL_TLSEXT_ERR_NOACK;
    2969                 :       1080 :         int al = SSL_AD_UNRECOGNIZED_NAME;
    2970                 :            : 
    2971                 :            : #ifndef OPENSSL_NO_EC
    2972                 :            :         /* The handling of the ECPointFormats extension is done elsewhere, namely in 
    2973                 :            :          * ssl3_choose_cipher in s3_lib.c.
    2974                 :            :          */
    2975                 :            :         /* The handling of the EllipticCurves extension is done elsewhere, namely in 
    2976                 :            :          * ssl3_choose_cipher in s3_lib.c.
    2977                 :            :          */
    2978                 :            : #endif
    2979                 :            : 
    2980 [ +  - ][ -  + ]:       1080 :         if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0) 
    2981                 :          0 :                 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
    2982 [ +  - ][ -  + ]:       1080 :         else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)            
    2983                 :          0 :                 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
    2984                 :            : 
    2985                 :            : #ifdef TLSEXT_TYPE_opaque_prf_input
    2986                 :            :         {
    2987                 :            :                 /* This sort of belongs into ssl_prepare_serverhello_tlsext(),
    2988                 :            :                  * but we might be sending an alert in response to the client hello,
    2989                 :            :                  * so this has to happen here in
    2990                 :            :                  * ssl_check_clienthello_tlsext_early(). */
    2991                 :            : 
    2992                 :            :                 int r = 1;
    2993                 :            :         
    2994                 :            :                 if (s->ctx->tlsext_opaque_prf_input_callback != 0)
    2995                 :            :                         {
    2996                 :            :                         r = s->ctx->tlsext_opaque_prf_input_callback(s, NULL, 0, s->ctx->tlsext_opaque_prf_input_callback_arg);
    2997                 :            :                         if (!r)
    2998                 :            :                                 {
    2999                 :            :                                 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
    3000                 :            :                                 al = SSL_AD_INTERNAL_ERROR;
    3001                 :            :                                 goto err;
    3002                 :            :                                 }
    3003                 :            :                         }
    3004                 :            : 
    3005                 :            :                 if (s->s3->server_opaque_prf_input != NULL) /* shouldn't really happen */
    3006                 :            :                         OPENSSL_free(s->s3->server_opaque_prf_input);
    3007                 :            :                 s->s3->server_opaque_prf_input = NULL;
    3008                 :            : 
    3009                 :            :                 if (s->tlsext_opaque_prf_input != NULL)
    3010                 :            :                         {
    3011                 :            :                         if (s->s3->client_opaque_prf_input != NULL &&
    3012                 :            :                                 s->s3->client_opaque_prf_input_len == s->tlsext_opaque_prf_input_len)
    3013                 :            :                                 {
    3014                 :            :                                 /* can only use this extension if we have a server opaque PRF input
    3015                 :            :                                  * of the same length as the client opaque PRF input! */
    3016                 :            : 
    3017                 :            :                                 if (s->tlsext_opaque_prf_input_len == 0)
    3018                 :            :                                         s->s3->server_opaque_prf_input = OPENSSL_malloc(1); /* dummy byte just to get non-NULL */
    3019                 :            :                                 else
    3020                 :            :                                         s->s3->server_opaque_prf_input = BUF_memdup(s->tlsext_opaque_prf_input, s->tlsext_opaque_prf_input_len);
    3021                 :            :                                 if (s->s3->server_opaque_prf_input == NULL)
    3022                 :            :                                         {
    3023                 :            :                                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
    3024                 :            :                                         al = SSL_AD_INTERNAL_ERROR;
    3025                 :            :                                         goto err;
    3026                 :            :                                         }
    3027                 :            :                                 s->s3->server_opaque_prf_input_len = s->tlsext_opaque_prf_input_len;
    3028                 :            :                                 }
    3029                 :            :                         }
    3030                 :            : 
    3031                 :            :                 if (r == 2 && s->s3->server_opaque_prf_input == NULL)
    3032                 :            :                         {
    3033                 :            :                         /* The callback wants to enforce use of the extension,
    3034                 :            :                          * but we can't do that with the client opaque PRF input;
    3035                 :            :                          * abort the handshake.
    3036                 :            :                          */
    3037                 :            :                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
    3038                 :            :                         al = SSL_AD_HANDSHAKE_FAILURE;
    3039                 :            :                         }
    3040                 :            :         }
    3041                 :            : 
    3042                 :            :  err:
    3043                 :            : #endif
    3044   [ -  -  +  - ]:       1080 :         switch (ret)
    3045                 :            :                 {
    3046                 :            :                 case SSL_TLSEXT_ERR_ALERT_FATAL:
    3047                 :          0 :                         ssl3_send_alert(s,SSL3_AL_FATAL,al); 
    3048                 :          0 :                         return -1;
    3049                 :            : 
    3050                 :            :                 case SSL_TLSEXT_ERR_ALERT_WARNING:
    3051                 :          0 :                         ssl3_send_alert(s,SSL3_AL_WARNING,al);
    3052                 :          0 :                         return 1; 
    3053                 :            :                                         
    3054                 :            :                 case SSL_TLSEXT_ERR_NOACK:
    3055                 :       1080 :                         s->servername_done=0;
    3056                 :            :                         default:
    3057                 :            :                 return 1;
    3058                 :            :                 }
    3059                 :            :         }
    3060                 :            : 
    3061                 :       1080 : int ssl_check_clienthello_tlsext_late(SSL *s)
    3062                 :            :         {
    3063                 :       1080 :         int ret = SSL_TLSEXT_ERR_OK;
    3064                 :            :         int al;
    3065                 :            : 
    3066                 :            :         /* If status request then ask callback what to do.
    3067                 :            :          * Note: this must be called after servername callbacks in case
    3068                 :            :          * the certificate has changed, and must be called after the cipher
    3069                 :            :          * has been chosen because this may influence which certificate is sent
    3070                 :            :          */
    3071 [ -  + ][ #  # ]:       1080 :         if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb)
                 [ #  # ]
    3072                 :            :                 {
    3073                 :            :                 int r;
    3074                 :            :                 CERT_PKEY *certpkey;
    3075                 :          0 :                 certpkey = ssl_get_server_send_pkey(s);
    3076                 :            :                 /* If no certificate can't return certificate status */
    3077         [ #  # ]:          0 :                 if (certpkey == NULL)
    3078                 :            :                         {
    3079                 :          0 :                         s->tlsext_status_expected = 0;
    3080                 :          0 :                         return 1;
    3081                 :            :                         }
    3082                 :            :                 /* Set current certificate to one we will use so
    3083                 :            :                  * SSL_get_certificate et al can pick it up.
    3084                 :            :                  */
    3085                 :          0 :                 s->cert->key = certpkey;
    3086                 :          0 :                 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
    3087   [ #  #  #  # ]:          0 :                 switch (r)
    3088                 :            :                         {
    3089                 :            :                         /* We don't want to send a status request response */
    3090                 :            :                         case SSL_TLSEXT_ERR_NOACK:
    3091                 :          0 :                                 s->tlsext_status_expected = 0;
    3092                 :          0 :                                 break;
    3093                 :            :                         /* status request response should be sent */
    3094                 :            :                         case SSL_TLSEXT_ERR_OK:
    3095         [ #  # ]:          0 :                                 if (s->tlsext_ocsp_resp)
    3096                 :          0 :                                         s->tlsext_status_expected = 1;
    3097                 :            :                                 else
    3098                 :          0 :                                         s->tlsext_status_expected = 0;
    3099                 :            :                                 break;
    3100                 :            :                         /* something bad happened */
    3101                 :            :                         case SSL_TLSEXT_ERR_ALERT_FATAL:
    3102                 :          0 :                                 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
    3103                 :          0 :                                 al = SSL_AD_INTERNAL_ERROR;
    3104                 :          0 :                                 goto err;
    3105                 :            :                         }
    3106                 :            :                 }
    3107                 :            :         else
    3108                 :       1080 :                 s->tlsext_status_expected = 0;
    3109                 :            : 
    3110                 :            :  err:
    3111      [ -  -  + ]:       1080 :         switch (ret)
    3112                 :            :                 {
    3113                 :            :                 case SSL_TLSEXT_ERR_ALERT_FATAL:
    3114                 :          0 :                         ssl3_send_alert(s, SSL3_AL_FATAL, al);
    3115                 :          0 :                         return -1;
    3116                 :            : 
    3117                 :            :                 case SSL_TLSEXT_ERR_ALERT_WARNING:
    3118                 :          0 :                         ssl3_send_alert(s, SSL3_AL_WARNING, al);
    3119                 :          0 :                         return 1; 
    3120                 :            : 
    3121                 :            :                 default:
    3122                 :            :                         return 1;
    3123                 :            :                 }
    3124                 :            :         }
    3125                 :            : 
    3126                 :       1080 : int ssl_check_serverhello_tlsext(SSL *s)
    3127                 :            :         {
    3128                 :       1080 :         int ret=SSL_TLSEXT_ERR_NOACK;
    3129                 :       1080 :         int al = SSL_AD_UNRECOGNIZED_NAME;
    3130                 :            : 
    3131                 :            : #ifndef OPENSSL_NO_EC
    3132                 :            :         /* If we are client and using an elliptic curve cryptography cipher
    3133                 :            :          * suite, then if server returns an EC point formats lists extension
    3134                 :            :          * it must contain uncompressed.
    3135                 :            :          */
    3136                 :       1080 :         unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
    3137                 :       1080 :         unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
    3138 [ -  + ][ #  # ]:       1080 :         if ((s->tlsext_ecpointformatlist != NULL) && (s->tlsext_ecpointformatlist_length > 0) && 
                 [ #  # ]
    3139 [ #  # ][ #  # ]:          0 :             (s->session->tlsext_ecpointformatlist != NULL) && (s->session->tlsext_ecpointformatlist_length > 0) && 
    3140         [ #  # ]:          0 :             ((alg_k & (SSL_kECDHE|SSL_kECDHr|SSL_kECDHe)) || (alg_a & SSL_aECDSA)))
    3141                 :            :                 {
    3142                 :            :                 /* we are using an ECC cipher */
    3143                 :            :                 size_t i;
    3144                 :            :                 unsigned char *list;
    3145                 :            :                 int found_uncompressed = 0;
    3146                 :            :                 list = s->session->tlsext_ecpointformatlist;
    3147         [ #  # ]:          0 :                 for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++)
    3148                 :            :                         {
    3149         [ #  # ]:          0 :                         if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed)
    3150                 :            :                                 {
    3151                 :            :                                 found_uncompressed = 1;
    3152                 :            :                                 break;
    3153                 :            :                                 }
    3154                 :            :                         }
    3155         [ #  # ]:          0 :                 if (!found_uncompressed)
    3156                 :            :                         {
    3157                 :          0 :                         SSLerr(SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT,SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
    3158                 :          0 :                         return -1;
    3159                 :            :                         }
    3160                 :            :                 }
    3161                 :       1080 :         ret = SSL_TLSEXT_ERR_OK;
    3162                 :            : #endif /* OPENSSL_NO_EC */
    3163                 :            : 
    3164 [ +  - ][ -  + ]:       1080 :         if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0) 
    3165                 :          0 :                 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg);
    3166 [ +  - ][ -  + ]:       1080 :         else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0)            
    3167                 :          0 :                 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg);
    3168                 :            : 
    3169                 :            : #ifdef TLSEXT_TYPE_opaque_prf_input
    3170                 :            :         if (s->s3->server_opaque_prf_input_len > 0)
    3171                 :            :                 {
    3172                 :            :                 /* This case may indicate that we, as a client, want to insist on using opaque PRF inputs.
    3173                 :            :                  * So first verify that we really have a value from the server too. */
    3174                 :            : 
    3175                 :            :                 if (s->s3->server_opaque_prf_input == NULL)
    3176                 :            :                         {
    3177                 :            :                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
    3178                 :            :                         al = SSL_AD_HANDSHAKE_FAILURE;
    3179                 :            :                         }
    3180                 :            :                 
    3181                 :            :                 /* Anytime the server *has* sent an opaque PRF input, we need to check
    3182                 :            :                  * that we have a client opaque PRF input of the same size. */
    3183                 :            :                 if (s->s3->client_opaque_prf_input == NULL ||
    3184                 :            :                     s->s3->client_opaque_prf_input_len != s->s3->server_opaque_prf_input_len)
    3185                 :            :                         {
    3186                 :            :                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
    3187                 :            :                         al = SSL_AD_ILLEGAL_PARAMETER;
    3188                 :            :                         }
    3189                 :            :                 }
    3190                 :            : #endif
    3191                 :            : 
    3192                 :            :         /* If we've requested certificate status and we wont get one
    3193                 :            :          * tell the callback
    3194                 :            :          */
    3195 [ -  + ][ #  # ]:       1080 :         if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected)
    3196 [ #  # ][ #  # ]:          0 :                         && s->ctx && s->ctx->tlsext_status_cb)
    3197                 :            :                 {
    3198                 :            :                 int r;
    3199                 :            :                 /* Set resp to NULL, resplen to -1 so callback knows
    3200                 :            :                  * there is no response.
    3201                 :            :                  */
    3202         [ #  # ]:          0 :                 if (s->tlsext_ocsp_resp)
    3203                 :            :                         {
    3204                 :          0 :                         OPENSSL_free(s->tlsext_ocsp_resp);
    3205                 :          0 :                         s->tlsext_ocsp_resp = NULL;
    3206                 :            :                         }
    3207                 :          0 :                 s->tlsext_ocsp_resplen = -1;
    3208                 :          0 :                 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
    3209         [ #  # ]:          0 :                 if (r == 0)
    3210                 :            :                         {
    3211                 :          0 :                         al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
    3212                 :          0 :                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
    3213                 :            :                         }
    3214         [ #  # ]:          0 :                 if (r < 0)
    3215                 :            :                         {
    3216                 :          0 :                         al = SSL_AD_INTERNAL_ERROR;
    3217                 :          0 :                         ret = SSL_TLSEXT_ERR_ALERT_FATAL;
    3218                 :            :                         }
    3219                 :            :                 }
    3220                 :            : 
    3221   [ -  -  -  + ]:       1080 :         switch (ret)
    3222                 :            :                 {
    3223                 :            :                 case SSL_TLSEXT_ERR_ALERT_FATAL:
    3224                 :          0 :                         ssl3_send_alert(s,SSL3_AL_FATAL,al); 
    3225                 :          0 :                         return -1;
    3226                 :            : 
    3227                 :            :                 case SSL_TLSEXT_ERR_ALERT_WARNING:
    3228                 :          0 :                         ssl3_send_alert(s,SSL3_AL_WARNING,al);
    3229                 :          0 :                         return 1; 
    3230                 :            :                                         
    3231                 :            :                 case SSL_TLSEXT_ERR_NOACK:
    3232                 :          0 :                         s->servername_done=0;
    3233                 :            :                         default:
    3234                 :            :                 return 1;
    3235                 :            :                 }
    3236                 :            :         }
    3237                 :            : 
    3238                 :       1080 : int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n) 
    3239                 :            :         {
    3240                 :       1080 :         int al = -1;
    3241         [ +  - ]:       1080 :         if (s->version < SSL3_VERSION)
    3242                 :            :                 return 1;
    3243         [ -  + ]:       1080 :         if (ssl_scan_serverhello_tlsext(s, p, d, n, &al) <= 0) 
    3244                 :            :                 {
    3245                 :          0 :                 ssl3_send_alert(s,SSL3_AL_FATAL,al); 
    3246                 :          0 :                 return 0;
    3247                 :            :                 }
    3248                 :            : 
    3249         [ -  + ]:       1080 :         if (ssl_check_serverhello_tlsext(s) <= 0) 
    3250                 :            :                 {
    3251                 :          0 :                 SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT,SSL_R_SERVERHELLO_TLSEXT);
    3252                 :          0 :                 return 0;
    3253                 :            :                 }
    3254                 :            :         return 1;
    3255                 :            : }
    3256                 :            : 
    3257                 :            : /* Since the server cache lookup is done early on in the processing of the
    3258                 :            :  * ClientHello, and other operations depend on the result, we need to handle
    3259                 :            :  * any TLS session ticket extension at the same time.
    3260                 :            :  *
    3261                 :            :  *   session_id: points at the session ID in the ClientHello. This code will
    3262                 :            :  *       read past the end of this in order to parse out the session ticket
    3263                 :            :  *       extension, if any.
    3264                 :            :  *   len: the length of the session ID.
    3265                 :            :  *   limit: a pointer to the first byte after the ClientHello.
    3266                 :            :  *   ret: (output) on return, if a ticket was decrypted, then this is set to
    3267                 :            :  *       point to the resulting session.
    3268                 :            :  *
    3269                 :            :  * If s->tls_session_secret_cb is set then we are expecting a pre-shared key
    3270                 :            :  * ciphersuite, in which case we have no use for session tickets and one will
    3271                 :            :  * never be decrypted, nor will s->tlsext_ticket_expected be set to 1.
    3272                 :            :  *
    3273                 :            :  * Returns:
    3274                 :            :  *   -1: fatal error, either from parsing or decrypting the ticket.
    3275                 :            :  *    0: no ticket was found (or was ignored, based on settings).
    3276                 :            :  *    1: a zero length extension was found, indicating that the client supports
    3277                 :            :  *       session tickets but doesn't currently have one to offer.
    3278                 :            :  *    2: either s->tls_session_secret_cb was set, or a ticket was offered but
    3279                 :            :  *       couldn't be decrypted because of a non-fatal error.
    3280                 :            :  *    3: a ticket was successfully decrypted and *ret was set.
    3281                 :            :  *
    3282                 :            :  * Side effects:
    3283                 :            :  *   Sets s->tlsext_ticket_expected to 1 if the server will have to issue
    3284                 :            :  *   a new session ticket to the client because the client indicated support
    3285                 :            :  *   (and s->tls_session_secret_cb is NULL) but the client either doesn't have
    3286                 :            :  *   a session ticket or we couldn't use the one it gave us, or if
    3287                 :            :  *   s->ctx->tlsext_ticket_key_cb asked to renew the client's ticket.
    3288                 :            :  *   Otherwise, s->tlsext_ticket_expected is set to 0.
    3289                 :            :  */
    3290                 :       1080 : int tls1_process_ticket(SSL *s, unsigned char *session_id, int len,
    3291                 :            :                         const unsigned char *limit, SSL_SESSION **ret)
    3292                 :            :         {
    3293                 :            :         /* Point after session ID in client hello */
    3294                 :       1080 :         const unsigned char *p = session_id + len;
    3295                 :            :         unsigned short i;
    3296                 :            : 
    3297                 :       1080 :         *ret = NULL;
    3298                 :       1080 :         s->tlsext_ticket_expected = 0;
    3299                 :            : 
    3300                 :            :         /* If tickets disabled behave as if no ticket present
    3301                 :            :          * to permit stateful resumption.
    3302                 :            :          */
    3303         [ +  - ]:       1080 :         if (!tls_use_ticket(s))
    3304                 :            :                 return 0;
    3305 [ +  + ][ +  - ]:       1080 :         if ((s->version <= SSL3_VERSION) || !limit)
    3306                 :            :                 return 0;
    3307         [ +  - ]:        827 :         if (p >= limit)
    3308                 :            :                 return -1;
    3309                 :            :         /* Skip past DTLS cookie */
    3310         [ -  + ]:        827 :         if (SSL_IS_DTLS(s))
    3311                 :            :                 {
    3312                 :          0 :                 i = *(p++);
    3313                 :          0 :                 p+= i;
    3314         [ #  # ]:          0 :                 if (p >= limit)
    3315                 :            :                         return -1;
    3316                 :            :                 }
    3317                 :            :         /* Skip past cipher list */
    3318                 :        827 :         n2s(p, i);
    3319                 :        827 :         p+= i;
    3320         [ +  - ]:        827 :         if (p >= limit)
    3321                 :            :                 return -1;
    3322                 :            :         /* Skip past compression algorithm list */
    3323                 :        827 :         i = *(p++);
    3324                 :        827 :         p += i;
    3325         [ +  - ]:        827 :         if (p > limit)
    3326                 :            :                 return -1;
    3327                 :            :         /* Now at start of extensions */
    3328         [ +  - ]:        827 :         if ((p + 2) >= limit)
    3329                 :            :                 return 0;
    3330                 :            :         n2s(p, i);
    3331         [ +  - ]:       2037 :         while ((p + 4) <= limit)
    3332                 :            :                 {
    3333                 :            :                 unsigned short type, size;
    3334                 :       2037 :                 n2s(p, type);
    3335                 :       2037 :                 n2s(p, size);
    3336         [ +  - ]:       2037 :                 if (p + size > limit)
    3337                 :            :                         return 0;
    3338         [ +  + ]:       2037 :                 if (type == TLSEXT_TYPE_session_ticket)
    3339                 :            :                         {
    3340                 :            :                         int r;
    3341         [ +  + ]:        827 :                         if (size == 0)
    3342                 :            :                                 {
    3343                 :            :                                 /* The client will accept a ticket but doesn't
    3344                 :            :                                  * currently have one. */
    3345                 :        816 :                                 s->tlsext_ticket_expected = 1;
    3346                 :        816 :                                 return 1;
    3347                 :            :                                 }
    3348         [ +  - ]:         11 :                         if (s->tls_session_secret_cb)
    3349                 :            :                                 {
    3350                 :            :                                 /* Indicate that the ticket couldn't be
    3351                 :            :                                  * decrypted rather than generating the session
    3352                 :            :                                  * from ticket now, trigger abbreviated
    3353                 :            :                                  * handshake based on external mechanism to
    3354                 :            :                                  * calculate the master secret later. */
    3355                 :            :                                 return 2;
    3356                 :            :                                 }
    3357                 :         11 :                         r = tls_decrypt_ticket(s, p, size, session_id, len, ret);
    3358   [ -  +  -  - ]:         11 :                         switch (r)
    3359                 :            :                                 {
    3360                 :            :                                 case 2: /* ticket couldn't be decrypted */
    3361                 :          0 :                                         s->tlsext_ticket_expected = 1;
    3362                 :          0 :                                         return 2;
    3363                 :            :                                 case 3: /* ticket was decrypted */
    3364                 :         11 :                                         return r;
    3365                 :            :                                 case 4: /* ticket decrypted but need to renew */
    3366                 :          0 :                                         s->tlsext_ticket_expected = 1;
    3367                 :        827 :                                         return 3;
    3368                 :            :                                 default: /* fatal error */
    3369                 :            :                                         return -1;
    3370                 :            :                                 }
    3371                 :            :                         }
    3372                 :            :                 p += size;
    3373                 :            :                 }
    3374                 :            :         return 0;
    3375                 :            :         }
    3376                 :            : 
    3377                 :            : /* tls_decrypt_ticket attempts to decrypt a session ticket.
    3378                 :            :  *
    3379                 :            :  *   etick: points to the body of the session ticket extension.
    3380                 :            :  *   eticklen: the length of the session tickets extenion.
    3381                 :            :  *   sess_id: points at the session ID.
    3382                 :            :  *   sesslen: the length of the session ID.
    3383                 :            :  *   psess: (output) on return, if a ticket was decrypted, then this is set to
    3384                 :            :  *       point to the resulting session.
    3385                 :            :  *
    3386                 :            :  * Returns:
    3387                 :            :  *   -1: fatal error, either from parsing or decrypting the ticket.
    3388                 :            :  *    2: the ticket couldn't be decrypted.
    3389                 :            :  *    3: a ticket was successfully decrypted and *psess was set.
    3390                 :            :  *    4: same as 3, but the ticket needs to be renewed.
    3391                 :            :  */
    3392                 :         11 : static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
    3393                 :            :                                 const unsigned char *sess_id, int sesslen,
    3394                 :            :                                 SSL_SESSION **psess)
    3395                 :            :         {
    3396                 :            :         SSL_SESSION *sess;
    3397                 :            :         unsigned char *sdec;
    3398                 :            :         const unsigned char *p;
    3399                 :         11 :         int slen, mlen, renew_ticket = 0;
    3400                 :            :         unsigned char tick_hmac[EVP_MAX_MD_SIZE];
    3401                 :            :         HMAC_CTX hctx;
    3402                 :            :         EVP_CIPHER_CTX ctx;
    3403                 :         11 :         SSL_CTX *tctx = s->initial_ctx;
    3404                 :            :         /* Need at least keyname + iv + some encrypted data */
    3405         [ +  - ]:         11 :         if (eticklen < 48)
    3406                 :            :                 return 2;
    3407                 :            :         /* Initialize session ticket encryption and HMAC contexts */
    3408                 :         11 :         HMAC_CTX_init(&hctx);
    3409                 :         11 :         EVP_CIPHER_CTX_init(&ctx);
    3410         [ -  + ]:         11 :         if (tctx->tlsext_ticket_key_cb)
    3411                 :            :                 {
    3412                 :          0 :                 unsigned char *nctick = (unsigned char *)etick;
    3413                 :          0 :                 int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
    3414                 :            :                                                         &ctx, &hctx, 0);
    3415         [ #  # ]:          0 :                 if (rv < 0)
    3416                 :            :                         return -1;
    3417         [ #  # ]:          0 :                 if (rv == 0)
    3418                 :            :                         return 2;
    3419         [ #  # ]:          0 :                 if (rv == 2)
    3420                 :          0 :                         renew_ticket = 1;
    3421                 :            :                 }
    3422                 :            :         else
    3423                 :            :                 {
    3424                 :            :                 /* Check key name matches */
    3425         [ +  - ]:         11 :                 if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
    3426                 :            :                         return 2;
    3427                 :         11 :                 HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
    3428                 :            :                                         tlsext_tick_md(), NULL);
    3429                 :         11 :                 EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
    3430                 :         11 :                                 tctx->tlsext_tick_aes_key, etick + 16);
    3431                 :            :                 }
    3432                 :            :         /* Attempt to process session ticket, first conduct sanity and
    3433                 :            :          * integrity checks on ticket.
    3434                 :            :          */
    3435                 :         11 :         mlen = HMAC_size(&hctx);
    3436         [ -  + ]:         11 :         if (mlen < 0)
    3437                 :            :                 {
    3438                 :          0 :                 EVP_CIPHER_CTX_cleanup(&ctx);
    3439                 :          0 :                 return -1;
    3440                 :            :                 }
    3441                 :         11 :         eticklen -= mlen;
    3442                 :            :         /* Check HMAC of encrypted ticket */
    3443                 :         11 :         HMAC_Update(&hctx, etick, eticklen);
    3444                 :         11 :         HMAC_Final(&hctx, tick_hmac, NULL);
    3445                 :         11 :         HMAC_CTX_cleanup(&hctx);
    3446         [ +  - ]:         11 :         if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen))
    3447                 :            :                 return 2;
    3448                 :            :         /* Attempt to decrypt session data */
    3449                 :            :         /* Move p after IV to start of encrypted ticket, update length */
    3450                 :         11 :         p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
    3451                 :         11 :         eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
    3452                 :         11 :         sdec = OPENSSL_malloc(eticklen);
    3453         [ -  + ]:         11 :         if (!sdec)
    3454                 :            :                 {
    3455                 :          0 :                 EVP_CIPHER_CTX_cleanup(&ctx);
    3456                 :          0 :                 return -1;
    3457                 :            :                 }
    3458                 :         11 :         EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
    3459         [ -  + ]:         11 :         if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0)
    3460                 :            :                 {
    3461                 :          0 :                 EVP_CIPHER_CTX_cleanup(&ctx);
    3462                 :          0 :                 OPENSSL_free(sdec);
    3463                 :          0 :                 return 2;
    3464                 :            :                 }
    3465                 :         11 :         slen += mlen;
    3466                 :         11 :         EVP_CIPHER_CTX_cleanup(&ctx);
    3467                 :         11 :         p = sdec;
    3468                 :            : 
    3469                 :         11 :         sess = d2i_SSL_SESSION(NULL, &p, slen);
    3470                 :         11 :         OPENSSL_free(sdec);
    3471         [ +  - ]:         11 :         if (sess)
    3472                 :            :                 {
    3473                 :            :                 /* The session ID, if non-empty, is used by some clients to
    3474                 :            :                  * detect that the ticket has been accepted. So we copy it to
    3475                 :            :                  * the session structure. If it is empty set length to zero
    3476                 :            :                  * as required by standard.
    3477                 :            :                  */
    3478         [ +  - ]:         11 :                 if (sesslen)
    3479                 :         11 :                         memcpy(sess->session_id, sess_id, sesslen);
    3480                 :         11 :                 sess->session_id_length = sesslen;
    3481                 :         11 :                 *psess = sess;
    3482         [ +  - ]:         11 :                 if (renew_ticket)
    3483                 :            :                         return 4;
    3484                 :            :                 else
    3485                 :         11 :                         return 3;
    3486                 :            :                 }
    3487                 :          0 :         ERR_clear_error();
    3488                 :            :         /* For session parse failure, indicate that we need to send a new
    3489                 :            :          * ticket. */
    3490                 :          0 :         return 2;
    3491                 :            :         }
    3492                 :            : 
    3493                 :            : /* Tables to translate from NIDs to TLS v1.2 ids */
    3494                 :            : 
    3495                 :            : typedef struct 
    3496                 :            :         {
    3497                 :            :         int nid;
    3498                 :            :         int id;
    3499                 :            :         } tls12_lookup;
    3500                 :            : 
    3501                 :            : static tls12_lookup tls12_md[] = {
    3502                 :            :         {NID_md5, TLSEXT_hash_md5},
    3503                 :            :         {NID_sha1, TLSEXT_hash_sha1},
    3504                 :            :         {NID_sha224, TLSEXT_hash_sha224},
    3505                 :            :         {NID_sha256, TLSEXT_hash_sha256},
    3506                 :            :         {NID_sha384, TLSEXT_hash_sha384},
    3507                 :            :         {NID_sha512, TLSEXT_hash_sha512}
    3508                 :            : };
    3509                 :            : 
    3510                 :            : static tls12_lookup tls12_sig[] = {
    3511                 :            :         {EVP_PKEY_RSA, TLSEXT_signature_rsa},
    3512                 :            :         {EVP_PKEY_DSA, TLSEXT_signature_dsa},
    3513                 :            :         {EVP_PKEY_EC, TLSEXT_signature_ecdsa}
    3514                 :            : };
    3515                 :            : 
    3516                 :        495 : static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
    3517                 :            :         {
    3518                 :            :         size_t i;
    3519         [ +  - ]:       1320 :         for (i = 0; i < tlen; i++)
    3520                 :            :                 {
    3521         [ +  + ]:       1320 :                 if (table[i].nid == nid)
    3522                 :        495 :                         return table[i].id;
    3523                 :            :                 }
    3524                 :            :         return -1;
    3525                 :            :         }
    3526                 :            : 
    3527                 :       7650 : static int tls12_find_nid(int id, tls12_lookup *table, size_t tlen)
    3528                 :            :         {
    3529                 :            :         size_t i;
    3530         [ +  - ]:      22950 :         for (i = 0; i < tlen; i++)
    3531                 :            :                 {
    3532         [ +  + ]:      22950 :                 if ((table[i].id) == id)
    3533                 :       7650 :                         return table[i].nid;
    3534                 :            :                 }
    3535                 :            :         return NID_undef;
    3536                 :            :         }
    3537                 :            : 
    3538                 :        165 : int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
    3539                 :            :         {
    3540                 :            :         int sig_id, md_id;
    3541         [ +  - ]:        165 :         if (!md)
    3542                 :            :                 return 0;
    3543                 :        165 :         md_id = tls12_find_id(EVP_MD_type(md), tls12_md,
    3544                 :            :                                 sizeof(tls12_md)/sizeof(tls12_lookup));
    3545         [ +  - ]:        165 :         if (md_id == -1)
    3546                 :            :                 return 0;
    3547                 :        165 :         sig_id = tls12_get_sigid(pk);
    3548         [ +  - ]:        165 :         if (sig_id == -1)
    3549                 :            :                 return 0;
    3550                 :        165 :         p[0] = (unsigned char)md_id;
    3551                 :        165 :         p[1] = (unsigned char)sig_id;
    3552                 :        165 :         return 1;
    3553                 :            :         }
    3554                 :            : 
    3555                 :        330 : int tls12_get_sigid(const EVP_PKEY *pk)
    3556                 :            :         {
    3557                 :        330 :         return tls12_find_id(pk->type, tls12_sig,
    3558                 :            :                                 sizeof(tls12_sig)/sizeof(tls12_lookup));
    3559                 :            :         }
    3560                 :            : 
    3561                 :            : typedef struct 
    3562                 :            :         {
    3563                 :            :         int nid;
    3564                 :            :         int secbits;
    3565                 :            :         const EVP_MD *(*mfunc)(void);
    3566                 :            :         } tls12_hash_info;
    3567                 :            : 
    3568                 :            : static const tls12_hash_info tls12_md_info[] = {
    3569                 :            : #ifdef OPENSSL_NO_MD5
    3570                 :            :         {NID_md5, 64, 0},
    3571                 :            : #else
    3572                 :            :         {NID_md5, 64, EVP_md5},
    3573                 :            : #endif
    3574                 :            : #ifdef OPENSSL_NO_SHA
    3575                 :            :         {NID_sha1, 80, 0},
    3576                 :            : #else
    3577                 :            :         {NID_sha1, 80, EVP_sha1},
    3578                 :            : #endif
    3579                 :            : #ifdef OPENSSL_NO_SHA256
    3580                 :            :         {NID_sha224, 112, 0},
    3581                 :            :         {NID_sha256, 128, 0},
    3582                 :            : #else
    3583                 :            :         {NID_sha224, 112, EVP_sha224},
    3584                 :            :         {NID_sha256, 128, EVP_sha256},
    3585                 :            : #endif
    3586                 :            : #ifdef OPENSSL_NO_SHA512
    3587                 :            :         {NID_sha384, 192, 0},
    3588                 :            :         {NID_sha512, 256, 0}
    3589                 :            : #else
    3590                 :            :         {NID_sha384, 192, EVP_sha384},
    3591                 :            :         {NID_sha512, 256, EVP_sha512}
    3592                 :            : #endif
    3593                 :            : };
    3594                 :            : 
    3595                 :      18522 : static const tls12_hash_info *tls12_get_hash_info(unsigned char hash_alg)
    3596                 :            :         {
    3597         [ +  - ]:      18522 :         if (hash_alg == 0)
    3598                 :            :                 return NULL;
    3599         [ +  - ]:      18522 :         if (hash_alg > sizeof(tls12_md_info)/sizeof(tls12_md_info[0]))
    3600                 :            :                 return NULL;
    3601                 :      18522 :         return tls12_md_info + hash_alg - 1;
    3602                 :            :         }
    3603                 :            : 
    3604                 :        930 : const EVP_MD *tls12_get_hash(unsigned char hash_alg)
    3605                 :            :         {
    3606                 :            :         const tls12_hash_info *inf;
    3607                 :            : #ifndef OPENSSL_FIPS
    3608 [ -  + ][ #  # ]:        930 :         if (hash_alg == TLSEXT_hash_md5 && FIPS_mode())
    3609                 :            :                 return NULL;
    3610                 :            : #endif
    3611                 :        930 :         inf = tls12_get_hash_info(hash_alg);
    3612 [ +  - ][ +  - ]:        930 :         if (!inf || !inf->mfunc)
    3613                 :            :                 return NULL; 
    3614                 :        930 :         return inf->mfunc();
    3615                 :            :         }
    3616                 :            : 
    3617         [ -  + ]:      42834 : static int tls12_get_pkey_idx(unsigned char sig_alg)
    3618                 :            :         {
    3619                 :            :         switch(sig_alg)
    3620                 :            :                 {
    3621                 :            : #ifndef OPENSSL_NO_RSA
    3622                 :            :         case TLSEXT_signature_rsa:
    3623                 :            :                 return SSL_PKEY_RSA_SIGN;
    3624                 :            : #endif
    3625                 :            : #ifndef OPENSSL_NO_DSA
    3626                 :            :         case TLSEXT_signature_dsa:
    3627                 :            :                 return SSL_PKEY_DSA_SIGN;
    3628                 :            : #endif
    3629                 :            : #ifndef OPENSSL_NO_ECDSA
    3630                 :            :         case TLSEXT_signature_ecdsa:
    3631                 :            :                 return SSL_PKEY_ECC;
    3632                 :            : #endif
    3633                 :            :                 }
    3634                 :            :         return -1;
    3635                 :            :         }
    3636                 :            : 
    3637                 :            : /* Convert TLS 1.2 signature algorithm extension values into NIDs */
    3638                 :       3825 : static void tls1_lookup_sigalg(int *phash_nid, int *psign_nid,
    3639                 :            :                         int *psignhash_nid, const unsigned char *data)
    3640                 :            :         {
    3641                 :       3825 :         int sign_nid = 0, hash_nid = 0;
    3642 [ -  + ][ #  # ]:       3825 :         if (!phash_nid && !psign_nid && !psignhash_nid)
    3643                 :       3825 :                 return;
    3644         [ +  - ]:       3825 :         if (phash_nid || psignhash_nid)
    3645                 :            :                 {
    3646                 :       3825 :                 hash_nid = tls12_find_nid(data[0], tls12_md,
    3647                 :            :                                         sizeof(tls12_md)/sizeof(tls12_lookup));
    3648         [ +  - ]:       3825 :                 if (phash_nid)
    3649                 :       3825 :                         *phash_nid = hash_nid;
    3650                 :            :                 }
    3651         [ +  - ]:       3825 :         if (psign_nid || psignhash_nid)
    3652                 :            :                 {
    3653                 :       3825 :                 sign_nid = tls12_find_nid(data[1], tls12_sig,
    3654                 :            :                                         sizeof(tls12_sig)/sizeof(tls12_lookup));
    3655         [ +  - ]:       3825 :                 if (psign_nid)
    3656                 :       3825 :                         *psign_nid = sign_nid;
    3657                 :            :                 }
    3658         [ +  - ]:       3825 :         if (psignhash_nid)
    3659                 :            :                 {
    3660         [ +  - ]:       3825 :                 if (sign_nid && hash_nid)
    3661                 :       3825 :                         OBJ_find_sigid_by_algs(psignhash_nid,
    3662                 :            :                                                         hash_nid, sign_nid);
    3663                 :            :                 else
    3664                 :          0 :                         *psignhash_nid = NID_undef;
    3665                 :            :                 }
    3666                 :            :         }
    3667                 :            : /* Check to see if a signature algorithm is allowed */
    3668                 :      17592 : static int tls12_sigalg_allowed(SSL *s, int op, const unsigned char *ptmp)
    3669                 :            :         {
    3670                 :            :         /* See if we have an entry in the hash table and it is enabled */
    3671                 :      17592 :         const tls12_hash_info *hinf = tls12_get_hash_info(ptmp[0]);
    3672 [ +  - ][ +  - ]:      17592 :         if (!hinf || !hinf->mfunc)
    3673                 :            :                 return 0;
    3674                 :            :         /* See if public key algorithm allowed */
    3675         [ +  - ]:      17592 :         if (tls12_get_pkey_idx(ptmp[1]) == -1)
    3676                 :            :                 return 0;
    3677                 :            :         /* Finally see if security callback allows it */
    3678                 :      17592 :         return ssl_security(s, op, hinf->secbits, hinf->nid, (void *)ptmp);
    3679                 :            :         }
    3680                 :            : 
    3681                 :            : /* Get a mask of disabled public key algorithms based on supported
    3682                 :            :  * signature algorithms. For example if no signature algorithm supports RSA
    3683                 :            :  * then RSA is disabled.
    3684                 :            :  */
    3685                 :            : 
    3686                 :       2039 : void ssl_set_sig_mask(unsigned long *pmask_a, SSL *s, int op)
    3687                 :            :         {
    3688                 :            :         const unsigned char *sigalgs;
    3689                 :            :         size_t i, sigalgslen;
    3690                 :       2039 :         int have_rsa = 0, have_dsa = 0, have_ecdsa = 0;
    3691                 :            :         /* Now go through all signature algorithms seeing if we support
    3692                 :            :          * any for RSA, DSA, ECDSA. Do this for all versions not just
    3693                 :            :          * TLS 1.2. To keep down calls to security callback only check
    3694                 :            :          * if we have to.
    3695                 :            :          */
    3696                 :       2039 :         sigalgslen = tls12_get_psigalgs(s, &sigalgs);
    3697         [ +  + ]:      32624 :         for (i = 0; i < sigalgslen; i += 2, sigalgs += 2)
    3698                 :            :                 {
    3699   [ +  +  +  - ]:      30585 :                 switch(sigalgs[1])
    3700                 :            :                         {
    3701                 :            : #ifndef OPENSSL_NO_RSA
    3702                 :            :                 case TLSEXT_signature_rsa:
    3703 [ +  + ][ +  - ]:      10195 :                         if (!have_rsa && tls12_sigalg_allowed(s, op, sigalgs))
    3704                 :       2039 :                                 have_rsa = 1;
    3705                 :            :                         break;
    3706                 :            : #endif
    3707                 :            : #ifndef OPENSSL_NO_DSA
    3708                 :            :                 case TLSEXT_signature_dsa:
    3709 [ +  + ][ +  - ]:      10195 :                         if (!have_dsa && tls12_sigalg_allowed(s, op, sigalgs))
    3710                 :       2039 :                                 have_dsa = 1;
    3711                 :            :                         break;
    3712                 :            : #endif
    3713                 :            : #ifndef OPENSSL_NO_ECDSA
    3714                 :            :                 case TLSEXT_signature_ecdsa:
    3715 [ +  + ][ +  - ]:      10195 :                         if (!have_ecdsa && tls12_sigalg_allowed(s, op, sigalgs))
    3716                 :       2039 :                                 have_ecdsa = 1;
    3717                 :            :                         break;
    3718                 :            : #endif
    3719                 :            :                         }
    3720                 :            :                 }
    3721         [ -  + ]:       2039 :         if (!have_rsa)
    3722                 :          0 :                 *pmask_a |= SSL_aRSA;
    3723         [ -  + ]:       2039 :         if (!have_dsa)
    3724                 :          0 :                 *pmask_a |= SSL_aDSS;
    3725         [ -  + ]:       2039 :         if (!have_ecdsa)
    3726                 :          0 :                 *pmask_a |= SSL_aECDSA;
    3727                 :       2039 :         }
    3728                 :            : 
    3729                 :        255 : size_t tls12_copy_sigalgs(SSL *s, unsigned char *out,
    3730                 :            :                                 const unsigned char *psig, size_t psiglen)
    3731                 :            :         {
    3732                 :        255 :         unsigned char *tmpout = out;
    3733                 :            :         size_t i;
    3734         [ +  + ]:       4080 :         for (i = 0; i < psiglen; i += 2, psig += 2)
    3735                 :            :                 {
    3736         [ +  - ]:       3825 :                 if (tls12_sigalg_allowed(s, SSL_SECOP_SIGALG_SUPPORTED, psig))
    3737                 :            :                         {
    3738                 :       3825 :                         *tmpout++ = psig[0];
    3739                 :       3825 :                         *tmpout++ = psig[1];
    3740                 :            :                         }
    3741                 :            :                 }
    3742                 :        255 :         return tmpout - out;
    3743                 :            :         }
    3744                 :            : 
    3745                 :            : /* Given preference and allowed sigalgs set shared sigalgs */
    3746                 :        510 : static int tls12_shared_sigalgs(SSL *s, TLS_SIGALGS *shsig,
    3747                 :            :                                 const unsigned char *pref, size_t preflen,
    3748                 :            :                                 const unsigned char *allow, size_t allowlen)
    3749                 :            :         {
    3750                 :            :         const unsigned char *ptmp, *atmp;
    3751                 :        510 :         size_t i, j, nmatch = 0;
    3752         [ +  + ]:       8160 :         for (i = 0, ptmp = pref; i < preflen; i+=2, ptmp+=2)
    3753                 :            :                 {
    3754                 :            :                 /* Skip disabled hashes or signature algorithms */
    3755         [ +  - ]:       7650 :                 if (!tls12_sigalg_allowed(s, SSL_SECOP_SIGALG_SHARED, ptmp))
    3756                 :          0 :                         continue;
    3757         [ +  - ]:      61200 :                 for (j = 0, atmp = allow; j < allowlen; j+=2, atmp+=2)
    3758                 :            :                         {
    3759 [ +  + ][ +  + ]:      61200 :                         if (ptmp[0] == atmp[0] && ptmp[1] == atmp[1])
    3760                 :            :                                 {
    3761                 :       7650 :                                 nmatch++;
    3762         [ +  + ]:       7650 :                                 if (shsig)
    3763                 :            :                                         {
    3764                 :       3825 :                                         shsig->rhash = ptmp[0];
    3765                 :       3825 :                                         shsig->rsign = ptmp[1];
    3766                 :       3825 :                                         tls1_lookup_sigalg(&shsig->hash_nid,
    3767                 :            :                                                 &shsig->sign_nid,
    3768                 :            :                                                 &shsig->signandhash_nid,
    3769                 :            :                                                 ptmp);
    3770                 :       3825 :                                         shsig++;
    3771                 :            :                                         }
    3772                 :            :                                 break;
    3773                 :            :                                 }
    3774                 :            :                         }
    3775                 :            :                 }
    3776                 :        510 :         return nmatch;
    3777                 :            :         }
    3778                 :            : 
    3779                 :            : /* Set shared signature algorithms for SSL structures */
    3780                 :        255 : static int tls1_set_shared_sigalgs(SSL *s)
    3781                 :            :         {
    3782                 :            :         const unsigned char *pref, *allow, *conf;
    3783                 :            :         size_t preflen, allowlen, conflen;
    3784                 :            :         size_t nmatch;
    3785                 :        255 :         TLS_SIGALGS *salgs = NULL;
    3786                 :        255 :         CERT *c = s->cert;
    3787                 :        255 :         unsigned int is_suiteb = tls1_suiteb(s);
    3788         [ -  + ]:        255 :         if (c->shared_sigalgs)
    3789                 :            :                 {
    3790                 :          0 :                 OPENSSL_free(c->shared_sigalgs);
    3791                 :          0 :                 c->shared_sigalgs = NULL;
    3792                 :            :                 }
    3793                 :            :         /* If client use client signature algorithms if not NULL */
    3794 [ +  + ][ -  + ]:        255 :         if (!s->server && c->client_sigalgs && !is_suiteb)
                 [ #  # ]
    3795                 :            :                 {
    3796                 :          0 :                 conf = c->client_sigalgs;
    3797                 :          0 :                 conflen = c->client_sigalgslen;
    3798                 :            :                 }
    3799 [ -  + ][ #  # ]:        255 :         else if (c->conf_sigalgs && !is_suiteb)
    3800                 :            :                 {
    3801                 :          0 :                 conf = c->conf_sigalgs;
    3802                 :          0 :                 conflen = c->conf_sigalgslen;
    3803                 :            :                 }
    3804                 :            :         else
    3805                 :        255 :                 conflen = tls12_get_psigalgs(s, &conf);
    3806 [ +  - ][ -  + ]:        255 :         if(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE || is_suiteb)
    3807                 :            :                 {
    3808                 :          0 :                 pref = conf;
    3809                 :          0 :                 preflen = conflen;
    3810                 :          0 :                 allow = c->peer_sigalgs;
    3811                 :          0 :                 allowlen = c->peer_sigalgslen;
    3812                 :            :                 }
    3813                 :            :         else
    3814                 :            :                 {
    3815                 :        255 :                 allow = conf;
    3816                 :        255 :                 allowlen = conflen;
    3817                 :        255 :                 pref = c->peer_sigalgs;
    3818                 :        255 :                 preflen = c->peer_sigalgslen;
    3819                 :            :                 }
    3820                 :        255 :         nmatch = tls12_shared_sigalgs(s, NULL, pref, preflen, allow, allowlen);
    3821         [ +  - ]:        255 :         if (!nmatch)
    3822                 :            :                 return 1;
    3823                 :        255 :         salgs = OPENSSL_malloc(nmatch * sizeof(TLS_SIGALGS));
    3824         [ +  - ]:        255 :         if (!salgs)
    3825                 :            :                 return 0;
    3826                 :        255 :         nmatch = tls12_shared_sigalgs(s, salgs, pref, preflen, allow, allowlen);
    3827                 :        255 :         c->shared_sigalgs = salgs;
    3828                 :        255 :         c->shared_sigalgslen = nmatch;
    3829                 :        255 :         return 1;
    3830                 :            :         }
    3831                 :            :                 
    3832                 :            : 
    3833                 :            : /* Set preferred digest for each key type */
    3834                 :            : 
    3835                 :        255 : int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
    3836                 :            :         {
    3837                 :            :         int idx;
    3838                 :            :         size_t i;
    3839                 :            :         const EVP_MD *md;
    3840                 :        255 :         CERT *c = s->cert;
    3841                 :            :         TLS_SIGALGS *sigptr;
    3842                 :            :         /* Extension ignored for inappropriate versions */
    3843         [ +  - ]:        255 :         if (!SSL_USE_SIGALGS(s))
    3844                 :            :                 return 1;
    3845                 :            :         /* Should never happen */
    3846         [ +  - ]:        255 :         if (!c)
    3847                 :            :                 return 0;
    3848                 :            : 
    3849         [ -  + ]:        255 :         if (c->peer_sigalgs)
    3850                 :          0 :                 OPENSSL_free(c->peer_sigalgs);
    3851                 :        255 :         c->peer_sigalgs = OPENSSL_malloc(dsize);
    3852         [ +  - ]:        255 :         if (!c->peer_sigalgs)
    3853                 :            :                 return 0;
    3854                 :        255 :         c->peer_sigalgslen = dsize;
    3855                 :        255 :         memcpy(c->peer_sigalgs, data, dsize);
    3856                 :            : 
    3857                 :        255 :         tls1_set_shared_sigalgs(s);
    3858                 :            : 
    3859                 :            : #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
    3860                 :            :         if (s->cert->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
    3861                 :            :                 {
    3862                 :            :                 /* Use first set signature preference to force message
    3863                 :            :                  * digest, ignoring any peer preferences.
    3864                 :            :                  */
    3865                 :            :                 const unsigned char *sigs = NULL;
    3866                 :            :                 if (s->server)
    3867                 :            :                         sigs = c->conf_sigalgs;
    3868                 :            :                 else
    3869                 :            :                         sigs = c->client_sigalgs;
    3870                 :            :                 if (sigs)
    3871                 :            :                         {
    3872                 :            :                         idx = tls12_get_pkey_idx(sigs[1]);
    3873                 :            :                         md = tls12_get_hash(sigs[0]);
    3874                 :            :                         c->pkeys[idx].digest = md;
    3875                 :            :                         c->pkeys[idx].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
    3876                 :            :                         if (idx == SSL_PKEY_RSA_SIGN)
    3877                 :            :                                 {
    3878                 :            :                                 c->pkeys[SSL_PKEY_RSA_ENC].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
    3879                 :            :                                 c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
    3880                 :            :                                 }
    3881                 :            :                         }
    3882                 :            :                 }
    3883                 :            : #endif
    3884                 :            : 
    3885         [ +  + ]:       4080 :         for (i = 0, sigptr = c->shared_sigalgs;
    3886                 :       3825 :                         i < c->shared_sigalgslen; i++, sigptr++)
    3887                 :            :                 {
    3888                 :       3825 :                 idx = tls12_get_pkey_idx(sigptr->rsign);
    3889 [ +  - ][ +  + ]:       3825 :                 if (idx > 0 && c->pkeys[idx].digest == NULL)
    3890                 :            :                         {
    3891                 :        765 :                         md = tls12_get_hash(sigptr->rhash);
    3892                 :        765 :                         c->pkeys[idx].digest = md;
    3893                 :        765 :                         c->pkeys[idx].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
    3894         [ +  + ]:        765 :                         if (idx == SSL_PKEY_RSA_SIGN)
    3895                 :            :                                 {
    3896                 :        255 :                                 c->pkeys[SSL_PKEY_RSA_ENC].valid_flags = CERT_PKEY_EXPLICIT_SIGN;
    3897                 :        255 :                                 c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
    3898                 :            :                                 }
    3899                 :            :                         }
    3900                 :            : 
    3901                 :            :                 }
    3902                 :            :         /* In strict mode leave unset digests as NULL to indicate we can't
    3903                 :            :          * use the certificate for signing.
    3904                 :            :          */
    3905         [ +  - ]:        255 :         if (!(s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT))
    3906                 :            :                 {
    3907                 :            :                 /* Set any remaining keys to default values. NOTE: if alg is
    3908                 :            :                  * not supported it stays as NULL.
    3909                 :            :                  */
    3910                 :            : #ifndef OPENSSL_NO_DSA
    3911         [ -  + ]:        255 :                 if (!c->pkeys[SSL_PKEY_DSA_SIGN].digest)
    3912                 :          0 :                         c->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
    3913                 :            : #endif
    3914                 :            : #ifndef OPENSSL_NO_RSA
    3915         [ -  + ]:        255 :                 if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest)
    3916                 :            :                         {
    3917                 :          0 :                         c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
    3918                 :          0 :                         c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
    3919                 :            :                         }
    3920                 :            : #endif
    3921                 :            : #ifndef OPENSSL_NO_ECDSA
    3922         [ -  + ]:        255 :                 if (!c->pkeys[SSL_PKEY_ECC].digest)
    3923                 :          0 :                         c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
    3924                 :            : #endif
    3925                 :            :                 }
    3926                 :            :         return 1;
    3927                 :            :         }
    3928                 :            : 
    3929                 :            : 
    3930                 :          0 : int SSL_get_sigalgs(SSL *s, int idx,
    3931                 :            :                         int *psign, int *phash, int *psignhash,
    3932                 :            :                         unsigned char *rsig, unsigned char *rhash)
    3933                 :            :         {
    3934                 :          0 :         const unsigned char *psig = s->cert->peer_sigalgs;
    3935         [ #  # ]:          0 :         if (psig == NULL)
    3936                 :            :                 return 0;
    3937         [ #  # ]:          0 :         if (idx >= 0)
    3938                 :            :                 {
    3939                 :          0 :                 idx <<= 1;
    3940         [ #  # ]:          0 :                 if (idx >= (int)s->cert->peer_sigalgslen)
    3941                 :            :                         return 0;
    3942                 :          0 :                 psig += idx;
    3943         [ #  # ]:          0 :                 if (rhash)
    3944                 :          0 :                         *rhash = psig[0];
    3945         [ #  # ]:          0 :                 if (rsig)
    3946                 :          0 :                         *rsig = psig[1];
    3947                 :          0 :                 tls1_lookup_sigalg(phash, psign, psignhash, psig);
    3948                 :            :                 }
    3949                 :          0 :         return s->cert->peer_sigalgslen / 2;
    3950                 :            :         }
    3951                 :            : 
    3952                 :          0 : int SSL_get_shared_sigalgs(SSL *s, int idx,
    3953                 :            :                         int *psign, int *phash, int *psignhash,
    3954                 :            :                         unsigned char *rsig, unsigned char *rhash)
    3955                 :            :         {
    3956                 :          0 :         TLS_SIGALGS *shsigalgs = s->cert->shared_sigalgs;
    3957 [ #  # ][ #  # ]:          0 :         if (!shsigalgs || idx >= (int)s->cert->shared_sigalgslen)
    3958                 :            :                 return 0;
    3959                 :          0 :         shsigalgs += idx;
    3960         [ #  # ]:          0 :         if (phash)
    3961                 :          0 :                 *phash = shsigalgs->hash_nid;
    3962         [ #  # ]:          0 :         if (psign)
    3963                 :          0 :                 *psign = shsigalgs->sign_nid;
    3964         [ #  # ]:          0 :         if (psignhash)
    3965                 :          0 :                 *psignhash = shsigalgs->signandhash_nid;
    3966         [ #  # ]:          0 :         if (rsig)
    3967                 :          0 :                 *rsig = shsigalgs->rsign;
    3968         [ #  # ]:          0 :         if (rhash)
    3969                 :          0 :                 *rhash = shsigalgs->rhash;
    3970                 :          0 :         return s->cert->shared_sigalgslen;
    3971                 :            :         }
    3972                 :            :         
    3973                 :            : 
    3974                 :            : #ifndef OPENSSL_NO_HEARTBEATS
    3975                 :            : int
    3976                 :          0 : tls1_process_heartbeat(SSL *s)
    3977                 :            :         {
    3978                 :          0 :         unsigned char *p = &s->s3->rrec.data[0], *pl;
    3979                 :            :         unsigned short hbtype;
    3980                 :            :         unsigned int payload;
    3981                 :          0 :         unsigned int padding = 16; /* Use minimum padding */
    3982                 :            : 
    3983         [ #  # ]:          0 :         if (s->msg_callback)
    3984                 :          0 :                 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
    3985                 :          0 :                         &s->s3->rrec.data[0], s->s3->rrec.length,
    3986                 :            :                         s, s->msg_callback_arg);
    3987                 :            : 
    3988                 :            :         /* Read type and payload length first */
    3989         [ #  # ]:          0 :         if (1 + 2 + 16 > s->s3->rrec.length)
    3990                 :            :                 return 0; /* silently discard */
    3991                 :          0 :         hbtype = *p++;
    3992                 :          0 :         n2s(p, payload);
    3993         [ #  # ]:          0 :         if (1 + 2 + payload + 16 > s->s3->rrec.length)
    3994                 :            :                 return 0; /* silently discard per RFC 6520 sec. 4 */
    3995                 :          0 :         pl = p;
    3996                 :            : 
    3997         [ #  # ]:          0 :         if (hbtype == TLS1_HB_REQUEST)
    3998                 :            :                 {
    3999                 :            :                 unsigned char *buffer, *bp;
    4000                 :            :                 int r;
    4001                 :            : 
    4002                 :            :                 /* Allocate memory for the response, size is 1 bytes
    4003                 :            :                  * message type, plus 2 bytes payload length, plus
    4004                 :            :                  * payload, plus padding
    4005                 :            :                  */
    4006                 :          0 :                 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
    4007                 :          0 :                 bp = buffer;
    4008                 :            :                 
    4009                 :            :                 /* Enter response type, length and copy payload */
    4010                 :          0 :                 *bp++ = TLS1_HB_RESPONSE;
    4011                 :          0 :                 s2n(payload, bp);
    4012                 :          0 :                 memcpy(bp, pl, payload);
    4013                 :          0 :                 bp += payload;
    4014                 :            :                 /* Random padding */
    4015                 :          0 :                 RAND_pseudo_bytes(bp, padding);
    4016                 :            : 
    4017                 :          0 :                 r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
    4018                 :            : 
    4019 [ #  # ][ #  # ]:          0 :                 if (r >= 0 && s->msg_callback)
    4020                 :          0 :                         s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
    4021                 :            :                                 buffer, 3 + payload + padding,
    4022                 :            :                                 s, s->msg_callback_arg);
    4023                 :            : 
    4024                 :          0 :                 OPENSSL_free(buffer);
    4025                 :            : 
    4026         [ #  # ]:          0 :                 if (r < 0)
    4027                 :          0 :                         return r;
    4028                 :            :                 }
    4029         [ #  # ]:          0 :         else if (hbtype == TLS1_HB_RESPONSE)
    4030                 :            :                 {
    4031                 :            :                 unsigned int seq;
    4032                 :            :                 
    4033                 :            :                 /* We only send sequence numbers (2 bytes unsigned int),
    4034                 :            :                  * and 16 random bytes, so we just try to read the
    4035                 :            :                  * sequence number */
    4036                 :          0 :                 n2s(pl, seq);
    4037                 :            :                 
    4038 [ #  # ][ #  # ]:          0 :                 if (payload == 18 && seq == s->tlsext_hb_seq)
    4039                 :            :                         {
    4040                 :          0 :                         s->tlsext_hb_seq++;
    4041                 :          0 :                         s->tlsext_hb_pending = 0;
    4042                 :            :                         }
    4043                 :            :                 }
    4044                 :            : 
    4045                 :            :         return 0;
    4046                 :            :         }
    4047                 :            : 
    4048                 :            : int
    4049                 :          0 : tls1_heartbeat(SSL *s)
    4050                 :            :         {
    4051                 :            :         unsigned char *buf, *p;
    4052                 :            :         int ret;
    4053                 :          0 :         unsigned int payload = 18; /* Sequence number + random bytes */
    4054                 :          0 :         unsigned int padding = 16; /* Use minimum padding */
    4055                 :            : 
    4056                 :            :         /* Only send if peer supports and accepts HB requests... */
    4057         [ #  # ]:          0 :         if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
    4058                 :            :             s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS)
    4059                 :            :                 {
    4060                 :          0 :                 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
    4061                 :          0 :                 return -1;
    4062                 :            :                 }
    4063                 :            : 
    4064                 :            :         /* ...and there is none in flight yet... */
    4065         [ #  # ]:          0 :         if (s->tlsext_hb_pending)
    4066                 :            :                 {
    4067                 :          0 :                 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_TLS_HEARTBEAT_PENDING);
    4068                 :          0 :                 return -1;
    4069                 :            :                 }
    4070                 :            :                 
    4071                 :            :         /* ...and no handshake in progress. */
    4072 [ #  # ][ #  # ]:          0 :         if (SSL_in_init(s) || s->in_handshake)
    4073                 :            :                 {
    4074                 :          0 :                 SSLerr(SSL_F_TLS1_HEARTBEAT,SSL_R_UNEXPECTED_MESSAGE);
    4075                 :          0 :                 return -1;
    4076                 :            :                 }
    4077                 :            :                 
    4078                 :            :         /* Check if padding is too long, payload and padding
    4079                 :            :          * must not exceed 2^14 - 3 = 16381 bytes in total.
    4080                 :            :          */
    4081                 :            :         OPENSSL_assert(payload + padding <= 16381);
    4082                 :            : 
    4083                 :            :         /* Create HeartBeat message, we just use a sequence number
    4084                 :            :          * as payload to distuingish different messages and add
    4085                 :            :          * some random stuff.
    4086                 :            :          *  - Message Type, 1 byte
    4087                 :            :          *  - Payload Length, 2 bytes (unsigned int)
    4088                 :            :          *  - Payload, the sequence number (2 bytes uint)
    4089                 :            :          *  - Payload, random bytes (16 bytes uint)
    4090                 :            :          *  - Padding
    4091                 :            :          */
    4092                 :          0 :         buf = OPENSSL_malloc(1 + 2 + payload + padding);
    4093                 :          0 :         p = buf;
    4094                 :            :         /* Message Type */
    4095                 :          0 :         *p++ = TLS1_HB_REQUEST;
    4096                 :            :         /* Payload length (18 bytes here) */
    4097                 :          0 :         s2n(payload, p);
    4098                 :            :         /* Sequence number */
    4099                 :          0 :         s2n(s->tlsext_hb_seq, p);
    4100                 :            :         /* 16 random bytes */
    4101                 :          0 :         RAND_pseudo_bytes(p, 16);
    4102                 :          0 :         p += 16;
    4103                 :            :         /* Random padding */
    4104                 :          0 :         RAND_pseudo_bytes(p, padding);
    4105                 :            : 
    4106                 :          0 :         ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
    4107         [ #  # ]:          0 :         if (ret >= 0)
    4108                 :            :                 {
    4109         [ #  # ]:          0 :                 if (s->msg_callback)
    4110                 :          0 :                         s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
    4111                 :            :                                 buf, 3 + payload + padding,
    4112                 :            :                                 s, s->msg_callback_arg);
    4113                 :            : 
    4114                 :          0 :                 s->tlsext_hb_pending = 1;
    4115                 :            :                 }
    4116                 :            :                 
    4117                 :          0 :         OPENSSL_free(buf);
    4118                 :            : 
    4119                 :          0 :         return ret;
    4120                 :            :         }
    4121                 :            : #endif
    4122                 :            : 
    4123                 :            : #define MAX_SIGALGLEN   (TLSEXT_hash_num * TLSEXT_signature_num * 2)
    4124                 :            : 
    4125                 :            : typedef struct
    4126                 :            :         {
    4127                 :            :         size_t sigalgcnt;
    4128                 :            :         int sigalgs[MAX_SIGALGLEN];
    4129                 :            :         } sig_cb_st;
    4130                 :            : 
    4131                 :          0 : static int sig_cb(const char *elem, int len, void *arg)
    4132                 :            :         {
    4133                 :          0 :         sig_cb_st *sarg = arg;
    4134                 :            :         size_t i;
    4135                 :            :         char etmp[20], *p;
    4136                 :            :         int sig_alg, hash_alg;
    4137         [ #  # ]:          0 :         if (sarg->sigalgcnt == MAX_SIGALGLEN)
    4138                 :            :                 return 0;
    4139         [ #  # ]:          0 :         if (len > (int)(sizeof(etmp) - 1))
    4140                 :            :                 return 0;
    4141                 :          0 :         memcpy(etmp, elem, len);
    4142                 :          0 :         etmp[len] = 0;
    4143                 :          0 :         p = strchr(etmp, '+');
    4144         [ #  # ]:          0 :         if (!p)
    4145                 :            :                 return 0;
    4146                 :          0 :         *p = 0;
    4147                 :          0 :         p++;
    4148         [ #  # ]:          0 :         if (!*p)
    4149                 :            :                 return 0;
    4150                 :            : 
    4151         [ #  # ]:          0 :         if (!strcmp(etmp, "RSA"))
    4152                 :            :                 sig_alg = EVP_PKEY_RSA;
    4153         [ #  # ]:          0 :         else if (!strcmp(etmp, "DSA"))
    4154                 :            :                 sig_alg = EVP_PKEY_DSA;
    4155         [ #  # ]:          0 :         else if (!strcmp(etmp, "ECDSA"))
    4156                 :            :                 sig_alg = EVP_PKEY_EC;
    4157                 :            :         else return 0;
    4158                 :            : 
    4159                 :          0 :         hash_alg = OBJ_sn2nid(p);
    4160         [ #  # ]:          0 :         if (hash_alg == NID_undef)
    4161                 :          0 :                 hash_alg = OBJ_ln2nid(p);
    4162         [ #  # ]:          0 :         if (hash_alg == NID_undef)
    4163                 :            :                 return 0;
    4164                 :            : 
    4165         [ #  # ]:          0 :         for (i = 0; i < sarg->sigalgcnt; i+=2)
    4166                 :            :                 {
    4167         [ #  # ]:          0 :                 if (sarg->sigalgs[i] == sig_alg
    4168         [ #  # ]:          0 :                         && sarg->sigalgs[i + 1] == hash_alg)
    4169                 :            :                         return 0;
    4170                 :            :                 }
    4171                 :          0 :         sarg->sigalgs[sarg->sigalgcnt++] = hash_alg;
    4172                 :          0 :         sarg->sigalgs[sarg->sigalgcnt++] = sig_alg;
    4173                 :          0 :         return 1;
    4174                 :            :         }
    4175                 :            : 
    4176                 :            : /* Set suppored signature algorithms based on a colon separated list
    4177                 :            :  * of the form sig+hash e.g. RSA+SHA512:DSA+SHA512 */
    4178                 :          0 : int tls1_set_sigalgs_list(CERT *c, const char *str, int client)
    4179                 :            :         {
    4180                 :            :         sig_cb_st sig;
    4181                 :          0 :         sig.sigalgcnt = 0;
    4182         [ #  # ]:          0 :         if (!CONF_parse_list(str, ':', 1, sig_cb, &sig))
    4183                 :            :                 return 0;
    4184         [ #  # ]:          0 :         if (c == NULL)
    4185                 :            :                 return 1;
    4186                 :          0 :         return tls1_set_sigalgs(c, sig.sigalgs, sig.sigalgcnt, client);
    4187                 :            :         }
    4188                 :            : 
    4189                 :          0 : int tls1_set_sigalgs(CERT *c, const int *psig_nids, size_t salglen, int client)
    4190                 :            :         {
    4191                 :            :         unsigned char *sigalgs, *sptr;
    4192                 :            :         int rhash, rsign;
    4193                 :            :         size_t i;
    4194         [ #  # ]:          0 :         if (salglen & 1)
    4195                 :            :                 return 0;
    4196                 :          0 :         sigalgs = OPENSSL_malloc(salglen);
    4197         [ #  # ]:          0 :         if (sigalgs == NULL)
    4198                 :            :                 return 0;
    4199         [ #  # ]:          0 :         for (i = 0, sptr = sigalgs; i < salglen; i+=2)
    4200                 :            :                 {
    4201                 :          0 :                 rhash = tls12_find_id(*psig_nids++, tls12_md,
    4202                 :            :                                         sizeof(tls12_md)/sizeof(tls12_lookup));
    4203                 :          0 :                 rsign = tls12_find_id(*psig_nids++, tls12_sig,
    4204                 :            :                                 sizeof(tls12_sig)/sizeof(tls12_lookup));
    4205                 :            : 
    4206         [ #  # ]:          0 :                 if (rhash == -1 || rsign == -1)
    4207                 :            :                         goto err;
    4208                 :          0 :                 *sptr++ = rhash;
    4209                 :          0 :                 *sptr++ = rsign;
    4210                 :            :                 }
    4211                 :            : 
    4212         [ #  # ]:          0 :         if (client)
    4213                 :            :                 {
    4214         [ #  # ]:          0 :                 if (c->client_sigalgs)
    4215                 :          0 :                         OPENSSL_free(c->client_sigalgs);
    4216                 :          0 :                 c->client_sigalgs = sigalgs;
    4217                 :          0 :                 c->client_sigalgslen = salglen;
    4218                 :            :                 }
    4219                 :            :         else
    4220                 :            :                 {
    4221         [ #  # ]:          0 :                 if (c->conf_sigalgs)
    4222                 :          0 :                         OPENSSL_free(c->conf_sigalgs);
    4223                 :          0 :                 c->conf_sigalgs = sigalgs;
    4224                 :          0 :                 c->conf_sigalgslen = salglen;
    4225                 :            :                 }
    4226                 :            : 
    4227                 :            :         return 1;
    4228                 :            : 
    4229                 :            :         err:
    4230                 :          0 :         OPENSSL_free(sigalgs);
    4231                 :          0 :         return 0;
    4232                 :            :         }
    4233                 :            : 
    4234                 :          0 : static int tls1_check_sig_alg(CERT *c, X509 *x, int default_nid)
    4235                 :            :         {
    4236                 :            :         int sig_nid;
    4237                 :            :         size_t i;
    4238         [ #  # ]:          0 :         if (default_nid == -1)
    4239                 :            :                 return 1;
    4240                 :          0 :         sig_nid = X509_get_signature_nid(x);
    4241         [ #  # ]:          0 :         if (default_nid)
    4242                 :          0 :                 return sig_nid == default_nid ? 1 : 0;
    4243         [ #  # ]:          0 :         for (i = 0; i < c->shared_sigalgslen; i++)
    4244         [ #  # ]:          0 :                 if (sig_nid == c->shared_sigalgs[i].signandhash_nid)
    4245                 :            :                         return 1;
    4246                 :            :         return 0;
    4247                 :            :         }
    4248                 :            : /* Check to see if a certificate issuer name matches list of CA names */
    4249                 :          0 : static int ssl_check_ca_name(STACK_OF(X509_NAME) *names, X509 *x)
    4250                 :            :         {
    4251                 :            :         X509_NAME *nm;
    4252                 :            :         int i;
    4253                 :          0 :         nm = X509_get_issuer_name(x);
    4254         [ #  # ]:          0 :         for (i = 0; i < sk_X509_NAME_num(names); i++)
    4255                 :            :                 {
    4256         [ #  # ]:          0 :                 if(!X509_NAME_cmp(nm, sk_X509_NAME_value(names, i)))
    4257                 :            :                         return 1;
    4258                 :            :                 }
    4259                 :            :         return 0;
    4260                 :            :         }
    4261                 :            : 
    4262                 :            : /* Check certificate chain is consistent with TLS extensions and is
    4263                 :            :  * usable by server. This servers two purposes: it allows users to 
    4264                 :            :  * check chains before passing them to the server and it allows the
    4265                 :            :  * server to check chains before attempting to use them.
    4266                 :            :  */
    4267                 :            : 
    4268                 :            : /* Flags which need to be set for a certificate when stict mode not set */
    4269                 :            : 
    4270                 :            : #define CERT_PKEY_VALID_FLAGS \
    4271                 :            :         (CERT_PKEY_EE_SIGNATURE|CERT_PKEY_EE_PARAM)
    4272                 :            : /* Strict mode flags */
    4273                 :            : #define CERT_PKEY_STRICT_FLAGS \
    4274                 :            :          (CERT_PKEY_VALID_FLAGS|CERT_PKEY_CA_SIGNATURE|CERT_PKEY_CA_PARAM \
    4275                 :            :          | CERT_PKEY_ISSUER_NAME|CERT_PKEY_CERT_TYPE)
    4276                 :            : 
    4277                 :       6414 : int tls1_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain,
    4278                 :            :                                                                         int idx)
    4279                 :            :         {
    4280                 :            :         int i;
    4281                 :       6414 :         int rv = 0;
    4282                 :       6414 :         int check_flags = 0, strict_mode;
    4283                 :       6414 :         CERT_PKEY *cpk = NULL;
    4284                 :       6414 :         CERT *c = s->cert;
    4285                 :       6414 :         unsigned int suiteb_flags = tls1_suiteb(s);
    4286                 :            :         /* idx == -1 means checking server chains */
    4287         [ +  - ]:       6414 :         if (idx != -1)
    4288                 :            :                 {
    4289                 :            :                 /* idx == -2 means checking client certificate chains */
    4290         [ -  + ]:       6414 :                 if (idx == -2)
    4291                 :            :                         {
    4292                 :          0 :                         cpk = c->key;
    4293                 :          0 :                         idx = cpk - c->pkeys;
    4294                 :            :                         }
    4295                 :            :                 else
    4296                 :       6414 :                         cpk = c->pkeys + idx;
    4297                 :       6414 :                 x = cpk->x509;
    4298                 :       6414 :                 pk = cpk->privatekey;
    4299                 :       6414 :                 chain = cpk->chain;
    4300                 :       6414 :                 strict_mode = c->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT;
    4301                 :            :                 /* If no cert or key, forget it */
    4302         [ +  + ]:       6414 :                 if (!x || !pk)
    4303                 :            :                         goto end;
    4304                 :            : #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
    4305                 :            :                 /* Allow any certificate to pass test */
    4306                 :            :                 if (s->cert->cert_flags & SSL_CERT_FLAG_BROKEN_PROTOCOL)
    4307                 :            :                         {
    4308                 :            :                         rv = CERT_PKEY_STRICT_FLAGS|CERT_PKEY_EXPLICIT_SIGN|CERT_PKEY_VALID|CERT_PKEY_SIGN;
    4309                 :            :                         cpk->valid_flags = rv;
    4310                 :            :                         return rv;
    4311                 :            :                         }
    4312                 :            : #endif
    4313                 :            :                 }
    4314                 :            :         else
    4315                 :            :                 {
    4316         [ #  # ]:          0 :                 if (!x || !pk)
    4317                 :            :                         goto end;
    4318                 :          0 :                 idx = ssl_cert_type(x, pk);
    4319         [ #  # ]:          0 :                 if (idx == -1)
    4320                 :            :                         goto end;
    4321                 :          0 :                 cpk = c->pkeys + idx;
    4322         [ #  # ]:          0 :                 if (c->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT)
    4323                 :            :                         check_flags = CERT_PKEY_STRICT_FLAGS;
    4324                 :            :                 else
    4325                 :          0 :                         check_flags = CERT_PKEY_VALID_FLAGS;
    4326                 :            :                 strict_mode = 1;
    4327                 :            :                 }
    4328                 :            : 
    4329         [ -  + ]:       1069 :         if (suiteb_flags)
    4330                 :            :                 {
    4331                 :            :                 int ok;
    4332         [ #  # ]:          0 :                 if (check_flags)
    4333                 :          0 :                         check_flags |= CERT_PKEY_SUITEB;
    4334                 :          0 :                 ok = X509_chain_check_suiteb(NULL, x, chain, suiteb_flags);
    4335         [ #  # ]:          0 :                 if (ok != X509_V_OK)
    4336                 :            :                         {
    4337         [ #  # ]:          0 :                         if (check_flags)
    4338                 :            :                                 rv |= CERT_PKEY_SUITEB;
    4339                 :            :                         else
    4340                 :            :                                 goto end;
    4341                 :            :                         }
    4342                 :            :                 }
    4343                 :            : 
    4344                 :            :         /* Check all signature algorithms are consistent with
    4345                 :            :          * signature algorithms extension if TLS 1.2 or later
    4346                 :            :          * and strict mode.
    4347                 :            :          */
    4348 [ +  - ][ +  + ]:       1069 :         if (TLS1_get_version(s) >= TLS1_2_VERSION && strict_mode)
                 [ -  + ]
    4349                 :            :                 {
    4350                 :            :                 int default_nid;
    4351                 :          0 :                 unsigned char rsign = 0;
    4352 [ #  # ][ #  # ]:          0 :                 if (c->peer_sigalgs)
         [ #  # ][ #  # ]
                 [ #  # ]
    4353                 :            :                         default_nid = 0;
    4354                 :            :                 /* If no sigalgs extension use defaults from RFC5246 */
    4355                 :            :                 else
    4356                 :            :                         {
    4357                 :            :                         switch(idx)
    4358                 :            :                                 {       
    4359                 :            :                         case SSL_PKEY_RSA_ENC:
    4360                 :            :                         case SSL_PKEY_RSA_SIGN:
    4361                 :            :                         case SSL_PKEY_DH_RSA:
    4362                 :            :                                 rsign = TLSEXT_signature_rsa;
    4363                 :            :                                 default_nid = NID_sha1WithRSAEncryption;
    4364                 :            :                                 break;
    4365                 :            : 
    4366                 :            :                         case SSL_PKEY_DSA_SIGN:
    4367                 :            :                         case SSL_PKEY_DH_DSA:
    4368                 :          0 :                                 rsign = TLSEXT_signature_dsa;
    4369                 :          0 :                                 default_nid = NID_dsaWithSHA1;
    4370                 :          0 :                                 break;
    4371                 :            : 
    4372                 :            :                         case SSL_PKEY_ECC:
    4373                 :          0 :                                 rsign = TLSEXT_signature_ecdsa;
    4374                 :          0 :                                 default_nid = NID_ecdsa_with_SHA1;
    4375                 :          0 :                                 break;
    4376                 :            : 
    4377                 :            :                         default:
    4378                 :          0 :                                 default_nid = -1;
    4379                 :          0 :                                 break;
    4380                 :            :                                 }
    4381                 :            :                         }
    4382                 :            :                 /* If peer sent no signature algorithms extension and we
    4383                 :            :                  * have set preferred signature algorithms check we support
    4384                 :            :                  * sha1.
    4385                 :            :                  */
    4386 [ #  # ][ #  # ]:          0 :                 if (default_nid > 0 && c->conf_sigalgs)
    4387                 :            :                         {
    4388                 :            :                         size_t j;
    4389                 :            :                         const unsigned char *p = c->conf_sigalgs;
    4390         [ #  # ]:          0 :                         for (j = 0; j < c->conf_sigalgslen; j += 2, p += 2)
    4391                 :            :                                 {
    4392 [ #  # ][ #  # ]:          0 :                                 if (p[0] == TLSEXT_hash_sha1 && p[1] == rsign)
    4393                 :            :                                         break;
    4394                 :            :                                 }
    4395         [ #  # ]:          0 :                         if (j == c->conf_sigalgslen)
    4396                 :            :                                 {
    4397         [ #  # ]:          0 :                                 if (check_flags)
    4398                 :            :                                         goto skip_sigs;
    4399                 :            :                                 else
    4400                 :            :                                         goto end;
    4401                 :            :                                 }
    4402                 :            :                         }
    4403                 :            :                 /* Check signature algorithm of each cert in chain */
    4404         [ #  # ]:          0 :                 if (!tls1_check_sig_alg(c, x, default_nid))
    4405                 :            :                         {
    4406         [ #  # ]:          0 :                         if (!check_flags) goto end;
    4407                 :            :                         }
    4408                 :            :                 else
    4409                 :          0 :                         rv |= CERT_PKEY_EE_SIGNATURE;
    4410                 :          0 :                 rv |= CERT_PKEY_CA_SIGNATURE;
    4411         [ #  # ]:          0 :                 for (i = 0; i < sk_X509_num(chain); i++)
    4412                 :            :                         {
    4413         [ #  # ]:          0 :                         if (!tls1_check_sig_alg(c, sk_X509_value(chain, i),
    4414                 :            :                                                         default_nid))
    4415                 :            :                                 {
    4416         [ #  # ]:          0 :                                 if (check_flags)
    4417                 :            :                                         {
    4418                 :          0 :                                         rv &= ~CERT_PKEY_CA_SIGNATURE;
    4419                 :          0 :                                         break;
    4420                 :            :                                         }
    4421                 :            :                                 else
    4422                 :            :                                         goto end;
    4423                 :            :                                 }
    4424                 :            :                         }
    4425                 :            :                 }
    4426                 :            :         /* Else not TLS 1.2, so mark EE and CA signing algorithms OK */
    4427         [ -  + ]:       1069 :         else if(check_flags)
    4428                 :          0 :                 rv |= CERT_PKEY_EE_SIGNATURE|CERT_PKEY_CA_SIGNATURE;
    4429                 :            :         skip_sigs:
    4430                 :            :         /* Check cert parameters are consistent */
    4431 [ +  - ][ +  - ]:       1069 :         if (tls1_check_cert_param(s, x, check_flags ? 1 : 2))
    4432                 :       1069 :                 rv |= CERT_PKEY_EE_PARAM;
    4433         [ #  # ]:          0 :         else if (!check_flags)
    4434                 :            :                 goto end;
    4435         [ -  + ]:       1069 :         if (!s->server)
    4436                 :          0 :                 rv |= CERT_PKEY_CA_PARAM;
    4437                 :            :         /* In strict mode check rest of chain too */
    4438         [ -  + ]:       1069 :         else if (strict_mode)
    4439                 :            :                 {
    4440                 :          0 :                 rv |= CERT_PKEY_CA_PARAM;
    4441         [ #  # ]:          0 :                 for (i = 0; i < sk_X509_num(chain); i++)
    4442                 :            :                         {
    4443                 :          0 :                         X509 *ca = sk_X509_value(chain, i);
    4444         [ #  # ]:          0 :                         if (!tls1_check_cert_param(s, ca, 0))
    4445                 :            :                                 {
    4446         [ #  # ]:          0 :                                 if (check_flags)
    4447                 :            :                                         {
    4448                 :          0 :                                         rv &= ~CERT_PKEY_CA_PARAM;
    4449                 :          0 :                                         break;
    4450                 :            :                                         }
    4451                 :            :                                 else
    4452                 :            :                                         goto end;
    4453                 :            :                                 }
    4454                 :            :                         }
    4455                 :            :                 }
    4456 [ -  + ][ #  # ]:       1069 :         if (!s->server && strict_mode)
    4457                 :            :                 {
    4458                 :            :                 STACK_OF(X509_NAME) *ca_dn;
    4459                 :          0 :                 int check_type = 0;
    4460   [ #  #  #  #  :          0 :                 switch (pk->type)
                      # ]
    4461                 :            :                         {
    4462                 :            :                 case EVP_PKEY_RSA:
    4463                 :          0 :                         check_type = TLS_CT_RSA_SIGN;
    4464                 :          0 :                         break;
    4465                 :            :                 case EVP_PKEY_DSA:
    4466                 :          0 :                         check_type = TLS_CT_DSS_SIGN;
    4467                 :          0 :                         break;
    4468                 :            :                 case EVP_PKEY_EC:
    4469                 :          0 :                         check_type = TLS_CT_ECDSA_SIGN;
    4470                 :          0 :                         break;
    4471                 :            :                 case EVP_PKEY_DH:
    4472                 :            :                 case EVP_PKEY_DHX:
    4473                 :            :                                 {
    4474                 :          0 :                                 int cert_type = X509_certificate_type(x, pk);
    4475         [ #  # ]:          0 :                                 if (cert_type & EVP_PKS_RSA)
    4476                 :          0 :                                         check_type = TLS_CT_RSA_FIXED_DH;
    4477         [ #  # ]:          0 :                                 if (cert_type & EVP_PKS_DSA)
    4478                 :          0 :                                         check_type = TLS_CT_DSS_FIXED_DH;
    4479                 :            :                                 }
    4480                 :            :                         }
    4481         [ #  # ]:          0 :                 if (check_type)
    4482                 :            :                         {
    4483                 :            :                         const unsigned char *ctypes;
    4484                 :            :                         int ctypelen;
    4485         [ #  # ]:          0 :                         if (c->ctypes)
    4486                 :            :                                 {
    4487                 :          0 :                                 ctypes = c->ctypes;
    4488                 :          0 :                                 ctypelen = (int)c->ctype_num;
    4489                 :            :                                 }
    4490                 :            :                         else
    4491                 :            :                                 {
    4492                 :          0 :                                 ctypes = (unsigned char *)s->s3->tmp.ctype;
    4493                 :          0 :                                 ctypelen = s->s3->tmp.ctype_num;
    4494                 :            :                                 }
    4495         [ #  # ]:          0 :                         for (i = 0; i < ctypelen; i++)
    4496                 :            :                                 {
    4497         [ #  # ]:          0 :                                 if (ctypes[i] == check_type)
    4498                 :            :                                         {
    4499                 :          0 :                                         rv |= CERT_PKEY_CERT_TYPE;
    4500                 :          0 :                                         break;
    4501                 :            :                                         }
    4502                 :            :                                 }
    4503         [ #  # ]:          0 :                         if (!(rv & CERT_PKEY_CERT_TYPE) && !check_flags)
    4504                 :            :                                 goto end;
    4505                 :            :                         }
    4506                 :            :                 else
    4507                 :          0 :                         rv |= CERT_PKEY_CERT_TYPE;
    4508                 :            : 
    4509                 :            : 
    4510                 :          0 :                 ca_dn = s->s3->tmp.ca_names;
    4511                 :            : 
    4512         [ #  # ]:          0 :                 if (!sk_X509_NAME_num(ca_dn))
    4513                 :          0 :                         rv |= CERT_PKEY_ISSUER_NAME;
    4514                 :            : 
    4515         [ #  # ]:          0 :                 if (!(rv & CERT_PKEY_ISSUER_NAME))
    4516                 :            :                         {
    4517         [ #  # ]:          0 :                         if (ssl_check_ca_name(ca_dn, x))
    4518                 :          0 :                                 rv |= CERT_PKEY_ISSUER_NAME;
    4519                 :            :                         }
    4520         [ #  # ]:          0 :                 if (!(rv & CERT_PKEY_ISSUER_NAME))
    4521                 :            :                         {
    4522         [ #  # ]:          0 :                         for (i = 0; i < sk_X509_num(chain); i++)
    4523                 :            :                                 {
    4524                 :          0 :                                 X509 *xtmp = sk_X509_value(chain, i);
    4525         [ #  # ]:          0 :                                 if (ssl_check_ca_name(ca_dn, xtmp))
    4526                 :            :                                         {
    4527                 :          0 :                                         rv |= CERT_PKEY_ISSUER_NAME;
    4528                 :          0 :                                         break;
    4529                 :            :                                         }
    4530                 :            :                                 }
    4531                 :            :                         }
    4532 [ #  # ][ #  # ]:          0 :                 if (!check_flags && !(rv & CERT_PKEY_ISSUER_NAME))
    4533                 :            :                         goto end;
    4534                 :            :                 }
    4535                 :            :         else
    4536                 :       1069 :                 rv |= CERT_PKEY_ISSUER_NAME|CERT_PKEY_CERT_TYPE;
    4537                 :            : 
    4538 [ -  + ][ #  # ]:       1069 :         if (!check_flags || (rv & check_flags) == check_flags)
    4539                 :       1069 :                 rv |= CERT_PKEY_VALID;
    4540                 :            : 
    4541                 :            :         end:
    4542                 :            : 
    4543 [ +  - ][ +  + ]:       6414 :         if (TLS1_get_version(s) >= TLS1_2_VERSION)
    4544                 :            :                 {
    4545         [ +  + ]:       1200 :                 if (cpk->valid_flags & CERT_PKEY_EXPLICIT_SIGN)
    4546                 :        800 :                         rv |= CERT_PKEY_EXPLICIT_SIGN|CERT_PKEY_SIGN;
    4547         [ -  + ]:        400 :                 else if (cpk->digest)
    4548                 :          0 :                         rv |= CERT_PKEY_SIGN;
    4549                 :            :                 }
    4550                 :            :         else
    4551                 :       5214 :                 rv |= CERT_PKEY_SIGN|CERT_PKEY_EXPLICIT_SIGN;
    4552                 :            : 
    4553                 :            :         /* When checking a CERT_PKEY structure all flags are irrelevant
    4554                 :            :          * if the chain is invalid.
    4555                 :            :          */
    4556         [ +  - ]:       6414 :         if (!check_flags)
    4557                 :            :                 {
    4558         [ +  + ]:       6414 :                 if (rv & CERT_PKEY_VALID)
    4559                 :       1069 :                         cpk->valid_flags = rv;
    4560                 :            :                 else
    4561                 :            :                         {
    4562                 :            :                         /* Preserve explicit sign flag, clear rest */
    4563                 :       5345 :                         cpk->valid_flags &= CERT_PKEY_EXPLICIT_SIGN;
    4564                 :       5345 :                         return 0;
    4565                 :            :                         }
    4566                 :            :                 }
    4567                 :       1069 :         return rv;
    4568                 :            :         }
    4569                 :            : 
    4570                 :            : /* Set validity of certificates in an SSL structure */
    4571                 :       1069 : void tls1_set_cert_validity(SSL *s)
    4572                 :            :         {
    4573                 :       1069 :         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_RSA_ENC);
    4574                 :       1069 :         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_RSA_SIGN);
    4575                 :       1069 :         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DSA_SIGN);
    4576                 :       1069 :         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DH_RSA);
    4577                 :       1069 :         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DH_DSA);
    4578                 :       1069 :         tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_ECC);
    4579                 :       1069 :         }
    4580                 :            : /* User level utiity function to check a chain is suitable */
    4581                 :          0 : int SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain)
    4582                 :            :         {
    4583                 :          0 :         return tls1_check_chain(s, x, pk, chain, -1);
    4584                 :            :         }
    4585                 :            : 
    4586                 :            : #endif
    4587                 :            : 
    4588                 :            : #ifndef OPENSSL_NO_DH
    4589                 :          0 : DH *ssl_get_auto_dh(SSL *s)
    4590                 :            :         {
    4591                 :          0 :         int dh_secbits = 80;
    4592         [ #  # ]:          0 :         if (s->cert->dh_tmp_auto == 2)
    4593                 :          0 :                 return DH_get_1024_160();
    4594         [ #  # ]:          0 :         if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)
    4595                 :            :                 {
    4596         [ #  # ]:          0 :                 if (s->s3->tmp.new_cipher->strength_bits == 256)
    4597                 :            :                         dh_secbits = 128;
    4598                 :            :                 else
    4599                 :          0 :                         dh_secbits = 80;
    4600                 :            :                 }
    4601                 :            :         else
    4602                 :            :                 {
    4603                 :          0 :                 CERT_PKEY *cpk = ssl_get_server_send_pkey(s);
    4604                 :          0 :                 dh_secbits = EVP_PKEY_security_bits(cpk->privatekey);
    4605                 :            :                 }
    4606                 :            : 
    4607         [ #  # ]:          0 :         if (dh_secbits >= 128)
    4608                 :            :                 {
    4609                 :          0 :                 DH *dhp = DH_new();
    4610         [ #  # ]:          0 :                 if (!dhp)
    4611                 :            :                         return NULL;
    4612                 :          0 :                 dhp->g = BN_new();
    4613         [ #  # ]:          0 :                 if (dhp->g)
    4614                 :          0 :                         BN_set_word(dhp->g, 2);
    4615         [ #  # ]:          0 :                 if (dh_secbits >= 192)
    4616                 :          0 :                         dhp->p = get_rfc3526_prime_8192(NULL);
    4617                 :            :                 else
    4618                 :          0 :                         dhp->p = get_rfc3526_prime_3072(NULL);
    4619 [ #  # ][ #  # ]:          0 :                 if (!dhp->p || !dhp->g)
    4620                 :            :                         {
    4621                 :          0 :                         DH_free(dhp);
    4622                 :          0 :                         return NULL;
    4623                 :            :                         }
    4624                 :            :                 return dhp;
    4625                 :            :                 }
    4626         [ #  # ]:          0 :         if (dh_secbits >= 112)
    4627                 :          0 :                 return DH_get_2048_224();
    4628                 :          0 :         return DH_get_1024_160();
    4629                 :            :         }
    4630                 :            : #endif
    4631                 :            : 
    4632                 :       2634 : static int ssl_security_cert_key(SSL *s, SSL_CTX *ctx, X509 *x, int op)
    4633                 :            :         {
    4634                 :            :         int secbits;
    4635                 :       2634 :         EVP_PKEY *pkey = X509_get_pubkey(x);
    4636         [ +  - ]:       2634 :         if (pkey)
    4637                 :            :                 {
    4638                 :       2634 :                 secbits = EVP_PKEY_security_bits(pkey);
    4639                 :       2634 :                 EVP_PKEY_free(pkey);
    4640                 :            :                 }
    4641                 :            :         else
    4642                 :            :                 secbits = -1;
    4643         [ +  + ]:       2634 :         if (s)
    4644                 :       1598 :                 return ssl_security(s, op, secbits, 0, x);
    4645                 :            :         else
    4646                 :       1036 :                 return ssl_ctx_security(ctx, op, secbits, 0, x);
    4647                 :            :         }
    4648                 :            : 
    4649                 :       2634 : static int ssl_security_cert_sig(SSL *s, SSL_CTX *ctx, X509 *x, int op)
    4650                 :            :         {
    4651                 :            :         /* Lookup signature algorithm digest */
    4652                 :       2634 :         int secbits = -1, md_nid = NID_undef, sig_nid;
    4653                 :       2634 :         sig_nid = X509_get_signature_nid(x);
    4654 [ +  - ][ +  - ]:       2634 :         if (sig_nid && OBJ_find_sigid_algs(sig_nid, &md_nid, NULL))
    4655                 :            :                 {
    4656                 :            :                 const EVP_MD *md;
    4657 [ +  - ][ +  - ]:       2634 :                 if (md_nid && (md = EVP_get_digestbynid(md_nid)))
    4658                 :       2634 :                                 secbits = EVP_MD_size(md) * 4;
    4659                 :            :                 }
    4660         [ +  + ]:       2634 :         if (s)
    4661                 :       1598 :                 return ssl_security(s, op, secbits, md_nid, x);
    4662                 :            :         else
    4663                 :       1036 :                 return ssl_ctx_security(ctx, op, secbits, md_nid, x);
    4664                 :            :         }
    4665                 :            : 
    4666                 :       2634 : int ssl_security_cert(SSL *s, SSL_CTX *ctx, X509 *x, int vfy, int is_ee)
    4667                 :            :         {
    4668         [ +  + ]:       2634 :         if (vfy)
    4669                 :         12 :                 vfy = SSL_SECOP_PEER;
    4670         [ +  + ]:       2634 :         if (is_ee)
    4671                 :            :                 {
    4672         [ +  - ]:       2078 :                 if (!ssl_security_cert_key(s, ctx, x, SSL_SECOP_EE_KEY | vfy))
    4673                 :            :                         return SSL_R_EE_KEY_TOO_SMALL;
    4674                 :            :                 }
    4675                 :            :         else
    4676                 :            :                 {
    4677         [ +  - ]:        556 :                 if (!ssl_security_cert_key(s, ctx, x, SSL_SECOP_CA_KEY | vfy))
    4678                 :            :                         return SSL_R_CA_KEY_TOO_SMALL;
    4679                 :            :                 }
    4680         [ +  - ]:       2634 :         if (!ssl_security_cert_sig(s, ctx, x, SSL_SECOP_CA_MD | vfy))
    4681                 :            :                 return SSL_R_CA_MD_TOO_WEAK;
    4682                 :       2634 :         return 1;
    4683                 :            :         }
    4684                 :            : 
    4685                 :            : /* Check security of a chain, if sk includes the end entity certificate
    4686                 :            :  * then x is NULL. If vfy is 1 then we are verifying a peer chain and
    4687                 :            :  * not sending one to the peer.
    4688                 :            :  * Return values: 1 if ok otherwise error code to use
    4689                 :            :  */
    4690                 :            : 
    4691                 :       1042 : int ssl_security_cert_chain(SSL *s, STACK_OF(X509) *sk, X509 *x, int vfy)
    4692                 :            :         {
    4693                 :            :         int rv, start_idx, i;
    4694         [ +  - ]:       1042 :         if (x == NULL)
    4695                 :            :                 {
    4696                 :       1042 :                 x = sk_X509_value(sk, 0);
    4697                 :       1042 :                 start_idx = 1;
    4698                 :            :                 }
    4699                 :            :         else
    4700                 :            :                 start_idx = 0;
    4701                 :            : 
    4702                 :       1042 :         rv = ssl_security_cert(s, NULL, x, vfy, 1);
    4703         [ +  - ]:       1042 :         if (rv != 1)
    4704                 :            :                 return rv;
    4705                 :            : 
    4706         [ +  + ]:       1598 :         for (i = start_idx; i < sk_X509_num(sk); i++)
    4707                 :            :                 {
    4708                 :        556 :                 x = sk_X509_value(sk, i);
    4709                 :        556 :                 rv = ssl_security_cert(s, NULL, x, vfy, 0);
    4710         [ +  - ]:        556 :                 if (rv != 1)
    4711                 :            :                         return rv;
    4712                 :            :                 }
    4713                 :            :         return 1;
    4714                 :            :         }

Generated by: LCOV version 1.9