LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/ssl - ssl_ciph.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 493 760 64.9 %
Date: 2014-08-02 Functions: 20 31 64.5 %
Branches: 316 624 50.6 %

           Branch data     Line data    Source code
       1                 :            : /* ssl/ssl_ciph.c */
       2                 :            : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       3                 :            :  * All rights reserved.
       4                 :            :  *
       5                 :            :  * This package is an SSL implementation written
       6                 :            :  * by Eric Young (eay@cryptsoft.com).
       7                 :            :  * The implementation was written so as to conform with Netscapes SSL.
       8                 :            :  * 
       9                 :            :  * This library is free for commercial and non-commercial use as long as
      10                 :            :  * the following conditions are aheared to.  The following conditions
      11                 :            :  * apply to all code found in this distribution, be it the RC4, RSA,
      12                 :            :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      13                 :            :  * included with this distribution is covered by the same copyright terms
      14                 :            :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      15                 :            :  * 
      16                 :            :  * Copyright remains Eric Young's, and as such any Copyright notices in
      17                 :            :  * the code are not to be removed.
      18                 :            :  * If this package is used in a product, Eric Young should be given attribution
      19                 :            :  * as the author of the parts of the library used.
      20                 :            :  * This can be in the form of a textual message at program startup or
      21                 :            :  * in documentation (online or textual) provided with the package.
      22                 :            :  * 
      23                 :            :  * Redistribution and use in source and binary forms, with or without
      24                 :            :  * modification, are permitted provided that the following conditions
      25                 :            :  * are met:
      26                 :            :  * 1. Redistributions of source code must retain the copyright
      27                 :            :  *    notice, this list of conditions and the following disclaimer.
      28                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      29                 :            :  *    notice, this list of conditions and the following disclaimer in the
      30                 :            :  *    documentation and/or other materials provided with the distribution.
      31                 :            :  * 3. All advertising materials mentioning features or use of this software
      32                 :            :  *    must display the following acknowledgement:
      33                 :            :  *    "This product includes cryptographic software written by
      34                 :            :  *     Eric Young (eay@cryptsoft.com)"
      35                 :            :  *    The word 'cryptographic' can be left out if the rouines from the library
      36                 :            :  *    being used are not cryptographic related :-).
      37                 :            :  * 4. If you include any Windows specific code (or a derivative thereof) from 
      38                 :            :  *    the apps directory (application code) you must include an acknowledgement:
      39                 :            :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      40                 :            :  * 
      41                 :            :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      42                 :            :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      43                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      44                 :            :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      45                 :            :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      46                 :            :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      47                 :            :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      49                 :            :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      50                 :            :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      51                 :            :  * SUCH DAMAGE.
      52                 :            :  * 
      53                 :            :  * The licence and distribution terms for any publically available version or
      54                 :            :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
      55                 :            :  * copied and put under another distribution licence
      56                 :            :  * [including the GNU Public Licence.]
      57                 :            :  */
      58                 :            : /* ====================================================================
      59                 :            :  * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
      60                 :            :  *
      61                 :            :  * Redistribution and use in source and binary forms, with or without
      62                 :            :  * modification, are permitted provided that the following conditions
      63                 :            :  * are met:
      64                 :            :  *
      65                 :            :  * 1. Redistributions of source code must retain the above copyright
      66                 :            :  *    notice, this list of conditions and the following disclaimer. 
      67                 :            :  *
      68                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      69                 :            :  *    notice, this list of conditions and the following disclaimer in
      70                 :            :  *    the documentation and/or other materials provided with the
      71                 :            :  *    distribution.
      72                 :            :  *
      73                 :            :  * 3. All advertising materials mentioning features or use of this
      74                 :            :  *    software must display the following acknowledgment:
      75                 :            :  *    "This product includes software developed by the OpenSSL Project
      76                 :            :  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
      77                 :            :  *
      78                 :            :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      79                 :            :  *    endorse or promote products derived from this software without
      80                 :            :  *    prior written permission. For written permission, please contact
      81                 :            :  *    openssl-core@openssl.org.
      82                 :            :  *
      83                 :            :  * 5. Products derived from this software may not be called "OpenSSL"
      84                 :            :  *    nor may "OpenSSL" appear in their names without prior written
      85                 :            :  *    permission of the OpenSSL Project.
      86                 :            :  *
      87                 :            :  * 6. Redistributions of any form whatsoever must retain the following
      88                 :            :  *    acknowledgment:
      89                 :            :  *    "This product includes software developed by the OpenSSL Project
      90                 :            :  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
      91                 :            :  *
      92                 :            :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      93                 :            :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      94                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      95                 :            :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      96                 :            :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      97                 :            :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      98                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      99                 :            :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     100                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     101                 :            :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     102                 :            :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     103                 :            :  * OF THE POSSIBILITY OF SUCH DAMAGE.
     104                 :            :  * ====================================================================
     105                 :            :  *
     106                 :            :  * This product includes cryptographic software written by Eric Young
     107                 :            :  * (eay@cryptsoft.com).  This product includes software written by Tim
     108                 :            :  * Hudson (tjh@cryptsoft.com).
     109                 :            :  *
     110                 :            :  */
     111                 :            : /* ====================================================================
     112                 :            :  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
     113                 :            :  * ECC cipher suite support in OpenSSL originally developed by 
     114                 :            :  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
     115                 :            :  */
     116                 :            : /* ====================================================================
     117                 :            :  * Copyright 2005 Nokia. All rights reserved.
     118                 :            :  *
     119                 :            :  * The portions of the attached software ("Contribution") is developed by
     120                 :            :  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
     121                 :            :  * license.
     122                 :            :  *
     123                 :            :  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
     124                 :            :  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
     125                 :            :  * support (see RFC 4279) to OpenSSL.
     126                 :            :  *
     127                 :            :  * No patent licenses or other rights except those expressly stated in
     128                 :            :  * the OpenSSL open source license shall be deemed granted or received
     129                 :            :  * expressly, by implication, estoppel, or otherwise.
     130                 :            :  *
     131                 :            :  * No assurances are provided by Nokia that the Contribution does not
     132                 :            :  * infringe the patent or other intellectual property rights of any third
     133                 :            :  * party or that the license provides you with all the necessary rights
     134                 :            :  * to make use of the Contribution.
     135                 :            :  *
     136                 :            :  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
     137                 :            :  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
     138                 :            :  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
     139                 :            :  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
     140                 :            :  * OTHERWISE.
     141                 :            :  */
     142                 :            : 
     143                 :            : #include <stdio.h>
     144                 :            : #include <openssl/objects.h>
     145                 :            : #ifndef OPENSSL_NO_COMP
     146                 :            : #include <openssl/comp.h>
     147                 :            : #endif
     148                 :            : #ifndef OPENSSL_NO_ENGINE
     149                 :            : #include <openssl/engine.h>
     150                 :            : #endif
     151                 :            : #include "ssl_locl.h"
     152                 :            : 
     153                 :            : #define SSL_ENC_DES_IDX         0
     154                 :            : #define SSL_ENC_3DES_IDX        1
     155                 :            : #define SSL_ENC_RC4_IDX         2
     156                 :            : #define SSL_ENC_RC2_IDX         3
     157                 :            : #define SSL_ENC_IDEA_IDX        4
     158                 :            : #define SSL_ENC_NULL_IDX        5
     159                 :            : #define SSL_ENC_AES128_IDX      6
     160                 :            : #define SSL_ENC_AES256_IDX      7
     161                 :            : #define SSL_ENC_CAMELLIA128_IDX 8
     162                 :            : #define SSL_ENC_CAMELLIA256_IDX 9
     163                 :            : #define SSL_ENC_GOST89_IDX      10
     164                 :            : #define SSL_ENC_SEED_IDX        11
     165                 :            : #define SSL_ENC_AES128GCM_IDX   12
     166                 :            : #define SSL_ENC_AES256GCM_IDX   13
     167                 :            : #define SSL_ENC_NUM_IDX         14
     168                 :            : 
     169                 :            : 
     170                 :            : static const EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX]={
     171                 :            :         NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
     172                 :            :         };
     173                 :            : 
     174                 :            : #define SSL_COMP_NULL_IDX       0
     175                 :            : #define SSL_COMP_ZLIB_IDX       1
     176                 :            : #define SSL_COMP_NUM_IDX        2
     177                 :            : 
     178                 :            : static STACK_OF(SSL_COMP) *ssl_comp_methods=NULL;
     179                 :            : 
     180                 :            : #define SSL_MD_MD5_IDX  0
     181                 :            : #define SSL_MD_SHA1_IDX 1
     182                 :            : #define SSL_MD_GOST94_IDX 2
     183                 :            : #define SSL_MD_GOST89MAC_IDX 3
     184                 :            : #define SSL_MD_SHA256_IDX 4
     185                 :            : #define SSL_MD_SHA384_IDX 5
     186                 :            : /*Constant SSL_MAX_DIGEST equal to size of digests array should be 
     187                 :            :  * defined in the
     188                 :            :  * ssl_locl.h */
     189                 :            : #define SSL_MD_NUM_IDX  SSL_MAX_DIGEST 
     190                 :            : static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX]={
     191                 :            :         NULL,NULL,NULL,NULL,NULL,NULL
     192                 :            :         };
     193                 :            : /* PKEY_TYPE for GOST89MAC is known in advance, but, because
     194                 :            :  * implementation is engine-provided, we'll fill it only if
     195                 :            :  * corresponding EVP_PKEY_METHOD is found 
     196                 :            :  */
     197                 :            : static int  ssl_mac_pkey_id[SSL_MD_NUM_IDX]={
     198                 :            :         EVP_PKEY_HMAC,EVP_PKEY_HMAC,EVP_PKEY_HMAC,NID_undef,
     199                 :            :         EVP_PKEY_HMAC,EVP_PKEY_HMAC
     200                 :            :         };
     201                 :            : 
     202                 :            : static int ssl_mac_secret_size[SSL_MD_NUM_IDX]={
     203                 :            :         0,0,0,0,0,0
     204                 :            :         };
     205                 :            : 
     206                 :            : static int ssl_handshake_digest_flag[SSL_MD_NUM_IDX]={
     207                 :            :         SSL_HANDSHAKE_MAC_MD5,SSL_HANDSHAKE_MAC_SHA,
     208                 :            :         SSL_HANDSHAKE_MAC_GOST94, 0, SSL_HANDSHAKE_MAC_SHA256,
     209                 :            :         SSL_HANDSHAKE_MAC_SHA384
     210                 :            :         };
     211                 :            : 
     212                 :            : #define CIPHER_ADD      1
     213                 :            : #define CIPHER_KILL     2
     214                 :            : #define CIPHER_DEL      3
     215                 :            : #define CIPHER_ORD      4
     216                 :            : #define CIPHER_SPECIAL  5
     217                 :            : 
     218                 :            : typedef struct cipher_order_st
     219                 :            :         {
     220                 :            :         const SSL_CIPHER *cipher;
     221                 :            :         int active;
     222                 :            :         int dead;
     223                 :            :         struct cipher_order_st *next,*prev;
     224                 :            :         } CIPHER_ORDER;
     225                 :            : 
     226                 :            : static const SSL_CIPHER cipher_aliases[]={
     227                 :            :         /* "ALL" doesn't include eNULL (must be specifically enabled) */
     228                 :            :         {0,SSL_TXT_ALL,0,     0,0,~SSL_eNULL,0,0,0,0,0,0},
     229                 :            :         /* "COMPLEMENTOFALL" */
     230                 :            :         {0,SSL_TXT_CMPALL,0,  0,0,SSL_eNULL,0,0,0,0,0,0},
     231                 :            : 
     232                 :            :         /* "COMPLEMENTOFDEFAULT" (does *not* include ciphersuites not found in ALL!) */
     233                 :            :         {0,SSL_TXT_CMPDEF,0,  SSL_kDHE|SSL_kECDHE,SSL_aNULL,~SSL_eNULL,0,0,0,0,0,0},
     234                 :            : 
     235                 :            :         /* key exchange aliases
     236                 :            :          * (some of those using only a single bit here combine
     237                 :            :          * multiple key exchange algs according to the RFCs,
     238                 :            :          * e.g. kDHE combines DHE_DSS and DHE_RSA) */
     239                 :            :         {0,SSL_TXT_kRSA,0,    SSL_kRSA,  0,0,0,0,0,0,0,0},
     240                 :            : 
     241                 :            :         {0,SSL_TXT_kDHr,0,    SSL_kDHr,  0,0,0,0,0,0,0,0},
     242                 :            :         {0,SSL_TXT_kDHd,0,    SSL_kDHd,  0,0,0,0,0,0,0,0},
     243                 :            :         {0,SSL_TXT_kDH,0,     SSL_kDHr|SSL_kDHd,0,0,0,0,0,0,0,0},
     244                 :            :         {0,SSL_TXT_kEDH,0,    SSL_kDHE,  0,0,0,0,0,0,0,0},
     245                 :            :         {0,SSL_TXT_kDHE,0,    SSL_kDHE,  0,0,0,0,0,0,0,0},
     246                 :            :         {0,SSL_TXT_DH,0,      SSL_kDHr|SSL_kDHd|SSL_kDHE,0,0,0,0,0,0,0,0},
     247                 :            : 
     248                 :            :         {0,SSL_TXT_kKRB5,0,   SSL_kKRB5, 0,0,0,0,0,0,0,0},
     249                 :            : 
     250                 :            :         {0,SSL_TXT_kECDHr,0,  SSL_kECDHr,0,0,0,0,0,0,0,0},
     251                 :            :         {0,SSL_TXT_kECDHe,0,  SSL_kECDHe,0,0,0,0,0,0,0,0},
     252                 :            :         {0,SSL_TXT_kECDH,0,   SSL_kECDHr|SSL_kECDHe,0,0,0,0,0,0,0,0},
     253                 :            :         {0,SSL_TXT_kEECDH,0,  SSL_kECDHE,0,0,0,0,0,0,0,0},
     254                 :            :         {0,SSL_TXT_kECDHE,0,  SSL_kECDHE,0,0,0,0,0,0,0,0},
     255                 :            :         {0,SSL_TXT_ECDH,0,    SSL_kECDHr|SSL_kECDHe|SSL_kECDHE,0,0,0,0,0,0,0,0},
     256                 :            : 
     257                 :            :         {0,SSL_TXT_kPSK,0,    SSL_kPSK,  0,0,0,0,0,0,0,0},
     258                 :            :         {0,SSL_TXT_kSRP,0,    SSL_kSRP,  0,0,0,0,0,0,0,0},
     259                 :            :         {0,SSL_TXT_kGOST,0, SSL_kGOST,0,0,0,0,0,0,0,0},
     260                 :            : 
     261                 :            :         /* server authentication aliases */
     262                 :            :         {0,SSL_TXT_aRSA,0,    0,SSL_aRSA,  0,0,0,0,0,0,0},
     263                 :            :         {0,SSL_TXT_aDSS,0,    0,SSL_aDSS,  0,0,0,0,0,0,0},
     264                 :            :         {0,SSL_TXT_DSS,0,     0,SSL_aDSS,   0,0,0,0,0,0,0},
     265                 :            :         {0,SSL_TXT_aKRB5,0,   0,SSL_aKRB5, 0,0,0,0,0,0,0},
     266                 :            :         {0,SSL_TXT_aNULL,0,   0,SSL_aNULL, 0,0,0,0,0,0,0},
     267                 :            :         {0,SSL_TXT_aDH,0,     0,SSL_aDH,   0,0,0,0,0,0,0}, /* no such ciphersuites supported! */
     268                 :            :         {0,SSL_TXT_aECDH,0,   0,SSL_aECDH, 0,0,0,0,0,0,0},
     269                 :            :         {0,SSL_TXT_aECDSA,0,  0,SSL_aECDSA,0,0,0,0,0,0,0},
     270                 :            :         {0,SSL_TXT_ECDSA,0,   0,SSL_aECDSA, 0,0,0,0,0,0,0},
     271                 :            :         {0,SSL_TXT_aPSK,0,    0,SSL_aPSK,  0,0,0,0,0,0,0},
     272                 :            :         {0,SSL_TXT_aGOST94,0,0,SSL_aGOST94,0,0,0,0,0,0,0},
     273                 :            :         {0,SSL_TXT_aGOST01,0,0,SSL_aGOST01,0,0,0,0,0,0,0},
     274                 :            :         {0,SSL_TXT_aGOST,0,0,SSL_aGOST94|SSL_aGOST01,0,0,0,0,0,0,0},
     275                 :            :         {0,SSL_TXT_aSRP,0,    0,SSL_aSRP,  0,0,0,0,0,0,0},
     276                 :            : 
     277                 :            :         /* aliases combining key exchange and server authentication */
     278                 :            :         {0,SSL_TXT_EDH,0,     SSL_kDHE,~SSL_aNULL,0,0,0,0,0,0,0},
     279                 :            :         {0,SSL_TXT_DHE,0,     SSL_kDHE,~SSL_aNULL,0,0,0,0,0,0,0},
     280                 :            :         {0,SSL_TXT_EECDH,0,   SSL_kECDHE,~SSL_aNULL,0,0,0,0,0,0,0},
     281                 :            :         {0,SSL_TXT_ECDHE,0,   SSL_kECDHE,~SSL_aNULL,0,0,0,0,0,0,0},
     282                 :            :         {0,SSL_TXT_NULL,0,    0,0,SSL_eNULL, 0,0,0,0,0,0},
     283                 :            :         {0,SSL_TXT_KRB5,0,    SSL_kKRB5,SSL_aKRB5,0,0,0,0,0,0,0},
     284                 :            :         {0,SSL_TXT_RSA,0,     SSL_kRSA,SSL_aRSA,0,0,0,0,0,0,0},
     285                 :            :         {0,SSL_TXT_ADH,0,     SSL_kDHE,SSL_aNULL,0,0,0,0,0,0,0},
     286                 :            :         {0,SSL_TXT_AECDH,0,   SSL_kECDHE,SSL_aNULL,0,0,0,0,0,0,0},
     287                 :            :         {0,SSL_TXT_PSK,0,     SSL_kPSK,SSL_aPSK,0,0,0,0,0,0,0},
     288                 :            :         {0,SSL_TXT_SRP,0,     SSL_kSRP,0,0,0,0,0,0,0,0},
     289                 :            : 
     290                 :            : 
     291                 :            :         /* symmetric encryption aliases */
     292                 :            :         {0,SSL_TXT_DES,0,     0,0,SSL_DES,   0,0,0,0,0,0},
     293                 :            :         {0,SSL_TXT_3DES,0,    0,0,SSL_3DES,  0,0,0,0,0,0},
     294                 :            :         {0,SSL_TXT_RC4,0,     0,0,SSL_RC4,   0,0,0,0,0,0},
     295                 :            :         {0,SSL_TXT_RC2,0,     0,0,SSL_RC2,   0,0,0,0,0,0},
     296                 :            :         {0,SSL_TXT_IDEA,0,    0,0,SSL_IDEA,  0,0,0,0,0,0},
     297                 :            :         {0,SSL_TXT_SEED,0,    0,0,SSL_SEED,  0,0,0,0,0,0},
     298                 :            :         {0,SSL_TXT_eNULL,0,   0,0,SSL_eNULL, 0,0,0,0,0,0},
     299                 :            :         {0,SSL_TXT_AES128,0,  0,0,SSL_AES128|SSL_AES128GCM,0,0,0,0,0,0},
     300                 :            :         {0,SSL_TXT_AES256,0,  0,0,SSL_AES256|SSL_AES256GCM,0,0,0,0,0,0},
     301                 :            :         {0,SSL_TXT_AES,0,     0,0,SSL_AES,0,0,0,0,0,0},
     302                 :            :         {0,SSL_TXT_AES_GCM,0, 0,0,SSL_AES128GCM|SSL_AES256GCM,0,0,0,0,0,0},
     303                 :            :         {0,SSL_TXT_CAMELLIA128,0,0,0,SSL_CAMELLIA128,0,0,0,0,0,0},
     304                 :            :         {0,SSL_TXT_CAMELLIA256,0,0,0,SSL_CAMELLIA256,0,0,0,0,0,0},
     305                 :            :         {0,SSL_TXT_CAMELLIA   ,0,0,0,SSL_CAMELLIA128|SSL_CAMELLIA256,0,0,0,0,0,0},
     306                 :            : 
     307                 :            :         /* MAC aliases */       
     308                 :            :         {0,SSL_TXT_MD5,0,     0,0,0,SSL_MD5,   0,0,0,0,0},
     309                 :            :         {0,SSL_TXT_SHA1,0,    0,0,0,SSL_SHA1,  0,0,0,0,0},
     310                 :            :         {0,SSL_TXT_SHA,0,     0,0,0,SSL_SHA1,  0,0,0,0,0},
     311                 :            :         {0,SSL_TXT_GOST94,0,     0,0,0,SSL_GOST94,  0,0,0,0,0},
     312                 :            :         {0,SSL_TXT_GOST89MAC,0,     0,0,0,SSL_GOST89MAC,  0,0,0,0,0},
     313                 :            :         {0,SSL_TXT_SHA256,0,    0,0,0,SSL_SHA256,  0,0,0,0,0},
     314                 :            :         {0,SSL_TXT_SHA384,0,    0,0,0,SSL_SHA384,  0,0,0,0,0},
     315                 :            : 
     316                 :            :         /* protocol version aliases */
     317                 :            :         {0,SSL_TXT_SSLV2,0,   0,0,0,0,SSL_SSLV2, 0,0,0,0},
     318                 :            :         {0,SSL_TXT_SSLV3,0,   0,0,0,0,SSL_SSLV3, 0,0,0,0},
     319                 :            :         {0,SSL_TXT_TLSV1,0,   0,0,0,0,SSL_TLSV1, 0,0,0,0},
     320                 :            :         {0,SSL_TXT_TLSV1_2,0, 0,0,0,0,SSL_TLSV1_2, 0,0,0,0},
     321                 :            : 
     322                 :            :         /* export flag */
     323                 :            :         {0,SSL_TXT_EXP,0,     0,0,0,0,0,SSL_EXPORT,0,0,0},
     324                 :            :         {0,SSL_TXT_EXPORT,0,  0,0,0,0,0,SSL_EXPORT,0,0,0},
     325                 :            : 
     326                 :            :         /* strength classes */
     327                 :            :         {0,SSL_TXT_EXP40,0,   0,0,0,0,0,SSL_EXP40, 0,0,0},
     328                 :            :         {0,SSL_TXT_EXP56,0,   0,0,0,0,0,SSL_EXP56, 0,0,0},
     329                 :            :         {0,SSL_TXT_LOW,0,     0,0,0,0,0,SSL_LOW,   0,0,0},
     330                 :            :         {0,SSL_TXT_MEDIUM,0,  0,0,0,0,0,SSL_MEDIUM,0,0,0},
     331                 :            :         {0,SSL_TXT_HIGH,0,    0,0,0,0,0,SSL_HIGH,  0,0,0},
     332                 :            :         /* FIPS 140-2 approved ciphersuite */
     333                 :            :         {0,SSL_TXT_FIPS,0,    0,0,~SSL_eNULL,0,0,SSL_FIPS,  0,0,0},
     334                 :            : 
     335                 :            :         /* "EDH-" aliases to "DHE-" labels (for backward compatibility) */
     336                 :            :         {0,SSL3_TXT_EDH_DSS_DES_40_CBC_SHA,0,
     337                 :            :          SSL_kDHE,SSL_aDSS,SSL_DES,SSL_SHA1,SSL_SSLV3,SSL_EXPORT|SSL_EXP40,0,0,0,},
     338                 :            :         {0,SSL3_TXT_EDH_DSS_DES_64_CBC_SHA,0,
     339                 :            :          SSL_kDHE,SSL_aDSS,SSL_DES,SSL_SHA1,SSL_SSLV3,SSL_NOT_EXP|SSL_LOW,0,0,0,},
     340                 :            :         {0,SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA,0,
     341                 :            :          SSL_kDHE,SSL_aDSS,SSL_3DES,SSL_SHA1,SSL_SSLV3,SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,0,0,0,},
     342                 :            :         {0,SSL3_TXT_EDH_RSA_DES_40_CBC_SHA,0,
     343                 :            :          SSL_kDHE,SSL_aRSA,SSL_DES,SSL_SHA1,SSL_SSLV3,SSL_EXPORT|SSL_EXP40,0,0,0,},
     344                 :            :         {0,SSL3_TXT_EDH_RSA_DES_64_CBC_SHA,0,
     345                 :            :          SSL_kDHE,SSL_aRSA,SSL_DES,SSL_SHA1,SSL_SSLV3,SSL_NOT_EXP|SSL_LOW,0,0,0,},
     346                 :            :         {0,SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA,0,
     347                 :            :          SSL_kDHE,SSL_aRSA,SSL_3DES,SSL_SHA1,SSL_SSLV3,SSL_NOT_EXP|SSL_HIGH|SSL_FIPS,0,0,0,},
     348                 :            : 
     349                 :            :         };
     350                 :            : /* Search for public key algorithm with given name and 
     351                 :            :  * return its pkey_id if it is available. Otherwise return 0
     352                 :            :  */
     353                 :            : #ifdef OPENSSL_NO_ENGINE
     354                 :            : 
     355                 :            : static int get_optional_pkey_id(const char *pkey_name)
     356                 :            :         {
     357                 :            :         const EVP_PKEY_ASN1_METHOD *ameth;
     358                 :            :         int pkey_id=0;
     359                 :            :         ameth = EVP_PKEY_asn1_find_str(NULL,pkey_name,-1);
     360                 :            :         if (ameth) 
     361                 :            :                 {
     362                 :            :                 EVP_PKEY_asn1_get0_info(&pkey_id, NULL,NULL,NULL,NULL,ameth);
     363                 :            :                 }               
     364                 :            :         return pkey_id;
     365                 :            :         }
     366                 :            : 
     367                 :            : #else
     368                 :            : 
     369                 :       5825 : static int get_optional_pkey_id(const char *pkey_name)
     370                 :            :         {
     371                 :            :         const EVP_PKEY_ASN1_METHOD *ameth;
     372                 :       5825 :         ENGINE *tmpeng = NULL;
     373                 :       5825 :         int pkey_id=0;
     374                 :       5825 :         ameth = EVP_PKEY_asn1_find_str(&tmpeng,pkey_name,-1);
     375         [ -  + ]:       5825 :         if (ameth)
     376                 :            :                 {
     377                 :          0 :                 EVP_PKEY_asn1_get0_info(&pkey_id, NULL,NULL,NULL,NULL,ameth);
     378                 :            :                 }
     379         [ -  + ]:       5825 :         if (tmpeng) ENGINE_finish(tmpeng);
     380                 :       5825 :         return pkey_id;
     381                 :            :         }
     382                 :            : 
     383                 :            : #endif
     384                 :            : 
     385                 :        969 : void ssl_load_ciphers(void)
     386                 :            :         {
     387                 :        969 :         ssl_cipher_methods[SSL_ENC_DES_IDX]= 
     388                 :        969 :                 EVP_get_cipherbyname(SN_des_cbc);
     389                 :        969 :         ssl_cipher_methods[SSL_ENC_3DES_IDX]=
     390                 :        969 :                 EVP_get_cipherbyname(SN_des_ede3_cbc);
     391                 :        969 :         ssl_cipher_methods[SSL_ENC_RC4_IDX]=
     392                 :        969 :                 EVP_get_cipherbyname(SN_rc4);
     393                 :        969 :         ssl_cipher_methods[SSL_ENC_RC2_IDX]= 
     394                 :        969 :                 EVP_get_cipherbyname(SN_rc2_cbc);
     395                 :            : #ifndef OPENSSL_NO_IDEA
     396                 :        969 :         ssl_cipher_methods[SSL_ENC_IDEA_IDX]= 
     397                 :        969 :                 EVP_get_cipherbyname(SN_idea_cbc);
     398                 :            : #else
     399                 :            :         ssl_cipher_methods[SSL_ENC_IDEA_IDX]= NULL;
     400                 :            : #endif
     401                 :        969 :         ssl_cipher_methods[SSL_ENC_AES128_IDX]=
     402                 :        969 :           EVP_get_cipherbyname(SN_aes_128_cbc);
     403                 :        969 :         ssl_cipher_methods[SSL_ENC_AES256_IDX]=
     404                 :        969 :           EVP_get_cipherbyname(SN_aes_256_cbc);
     405                 :        969 :         ssl_cipher_methods[SSL_ENC_CAMELLIA128_IDX]=
     406                 :        969 :           EVP_get_cipherbyname(SN_camellia_128_cbc);
     407                 :        969 :         ssl_cipher_methods[SSL_ENC_CAMELLIA256_IDX]=
     408                 :        969 :           EVP_get_cipherbyname(SN_camellia_256_cbc);
     409                 :        969 :         ssl_cipher_methods[SSL_ENC_GOST89_IDX]=
     410                 :        969 :           EVP_get_cipherbyname(SN_gost89_cnt);
     411                 :        969 :         ssl_cipher_methods[SSL_ENC_SEED_IDX]=
     412                 :        969 :           EVP_get_cipherbyname(SN_seed_cbc);
     413                 :            : 
     414                 :        969 :         ssl_cipher_methods[SSL_ENC_AES128GCM_IDX]=
     415                 :        969 :           EVP_get_cipherbyname(SN_aes_128_gcm);
     416                 :        969 :         ssl_cipher_methods[SSL_ENC_AES256GCM_IDX]=
     417                 :        969 :           EVP_get_cipherbyname(SN_aes_256_gcm);
     418                 :            : 
     419                 :        969 :         ssl_digest_methods[SSL_MD_MD5_IDX]=
     420                 :        969 :                 EVP_get_digestbyname(SN_md5);
     421                 :        969 :         ssl_mac_secret_size[SSL_MD_MD5_IDX]=
     422                 :        969 :                 EVP_MD_size(ssl_digest_methods[SSL_MD_MD5_IDX]);
     423         [ -  + ]:        969 :         OPENSSL_assert(ssl_mac_secret_size[SSL_MD_MD5_IDX] >= 0);
     424                 :        969 :         ssl_digest_methods[SSL_MD_SHA1_IDX]=
     425                 :        969 :                 EVP_get_digestbyname(SN_sha1);
     426                 :        969 :         ssl_mac_secret_size[SSL_MD_SHA1_IDX]=
     427                 :        969 :                 EVP_MD_size(ssl_digest_methods[SSL_MD_SHA1_IDX]);
     428         [ -  + ]:        969 :         OPENSSL_assert(ssl_mac_secret_size[SSL_MD_SHA1_IDX] >= 0);
     429                 :        969 :         ssl_digest_methods[SSL_MD_GOST94_IDX]=
     430                 :        969 :                 EVP_get_digestbyname(SN_id_GostR3411_94);
     431         [ +  + ]:        969 :         if (ssl_digest_methods[SSL_MD_GOST94_IDX])
     432                 :            :                 {       
     433                 :         76 :                 ssl_mac_secret_size[SSL_MD_GOST94_IDX]=
     434                 :         76 :                         EVP_MD_size(ssl_digest_methods[SSL_MD_GOST94_IDX]);
     435         [ -  + ]:         76 :                 OPENSSL_assert(ssl_mac_secret_size[SSL_MD_GOST94_IDX] >= 0);
     436                 :            :                 }
     437                 :        969 :         ssl_digest_methods[SSL_MD_GOST89MAC_IDX]=
     438                 :        969 :                 EVP_get_digestbyname(SN_id_Gost28147_89_MAC);
     439                 :        969 :                 ssl_mac_pkey_id[SSL_MD_GOST89MAC_IDX] = get_optional_pkey_id("gost-mac");
     440         [ -  + ]:        969 :                 if (ssl_mac_pkey_id[SSL_MD_GOST89MAC_IDX]) {
     441                 :          0 :                         ssl_mac_secret_size[SSL_MD_GOST89MAC_IDX]=32;
     442                 :            :                 }               
     443                 :            : 
     444                 :        969 :         ssl_digest_methods[SSL_MD_SHA256_IDX]=
     445                 :        969 :                 EVP_get_digestbyname(SN_sha256);
     446                 :        969 :         ssl_mac_secret_size[SSL_MD_SHA256_IDX]=
     447                 :        969 :                 EVP_MD_size(ssl_digest_methods[SSL_MD_SHA256_IDX]);
     448                 :        969 :         ssl_digest_methods[SSL_MD_SHA384_IDX]=
     449                 :        969 :                 EVP_get_digestbyname(SN_sha384);
     450                 :        969 :         ssl_mac_secret_size[SSL_MD_SHA384_IDX]=
     451                 :        969 :                 EVP_MD_size(ssl_digest_methods[SSL_MD_SHA384_IDX]);
     452                 :        969 :         }
     453                 :            : #ifndef OPENSSL_NO_COMP
     454                 :            : 
     455                 :          0 : static int sk_comp_cmp(const SSL_COMP * const *a,
     456                 :            :                         const SSL_COMP * const *b)
     457                 :            :         {
     458                 :          0 :         return((*a)->id-(*b)->id);
     459                 :            :         }
     460                 :            : 
     461                 :       5830 : static void load_builtin_compressions(void)
     462                 :            :         {
     463                 :       5830 :         int got_write_lock = 0;
     464                 :            : 
     465                 :       5830 :         CRYPTO_r_lock(CRYPTO_LOCK_SSL);
     466         [ +  + ]:       5830 :         if (ssl_comp_methods == NULL)
     467                 :            :                 {
     468                 :        969 :                 CRYPTO_r_unlock(CRYPTO_LOCK_SSL);
     469                 :        969 :                 CRYPTO_w_lock(CRYPTO_LOCK_SSL);
     470                 :        969 :                 got_write_lock = 1;
     471                 :            :                 
     472         [ +  - ]:        969 :                 if (ssl_comp_methods == NULL)
     473                 :            :                         {
     474                 :        969 :                         SSL_COMP *comp = NULL;
     475                 :            : 
     476                 :        969 :                         MemCheck_off();
     477                 :        969 :                         ssl_comp_methods=sk_SSL_COMP_new(sk_comp_cmp);
     478         [ +  - ]:        969 :                         if (ssl_comp_methods != NULL)
     479                 :            :                                 {
     480                 :        969 :                                 comp=(SSL_COMP *)OPENSSL_malloc(sizeof(SSL_COMP));
     481         [ +  - ]:        969 :                                 if (comp != NULL)
     482                 :            :                                         {
     483                 :        969 :                                         comp->method=COMP_zlib();
     484         [ +  - ]:        969 :                                         if (comp->method
     485         [ +  - ]:        969 :                                                 && comp->method->type == NID_undef)
     486                 :        969 :                                                 OPENSSL_free(comp);
     487                 :            :                                         else
     488                 :            :                                                 {
     489                 :          0 :                                                 comp->id=SSL_COMP_ZLIB_IDX;
     490                 :          0 :                                                 comp->name=comp->method->name;
     491                 :          0 :                                                 sk_SSL_COMP_push(ssl_comp_methods,comp);
     492                 :            :                                                 }
     493                 :            :                                         }
     494                 :        969 :                                         sk_SSL_COMP_sort(ssl_comp_methods);
     495                 :            :                                 }
     496                 :        969 :                         MemCheck_on();
     497                 :            :                         }
     498                 :            :                 }
     499                 :            :         
     500         [ +  + ]:       5830 :         if (got_write_lock)
     501                 :        969 :                 CRYPTO_w_unlock(CRYPTO_LOCK_SSL);
     502                 :            :         else
     503                 :       4861 :                 CRYPTO_r_unlock(CRYPTO_LOCK_SSL);
     504                 :       5830 :         }
     505                 :            : #endif
     506                 :            : 
     507                 :       2600 : int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc,
     508                 :            :              const EVP_MD **md, int *mac_pkey_type, int *mac_secret_size,SSL_COMP **comp, int use_etm)
     509                 :            :         {
     510                 :            :         int i;
     511                 :            :         const SSL_CIPHER *c;
     512                 :            : 
     513                 :       2600 :         c=s->cipher;
     514         [ +  - ]:       2600 :         if (c == NULL) return(0);
     515         [ +  + ]:       2600 :         if (comp != NULL)
     516                 :            :                 {
     517                 :            :                 SSL_COMP ctmp;
     518                 :            : #ifndef OPENSSL_NO_COMP
     519                 :       2160 :                 load_builtin_compressions();
     520                 :            : #endif
     521                 :            : 
     522                 :       2160 :                 *comp=NULL;
     523                 :       2160 :                 ctmp.id=s->compress_meth;
     524         [ +  - ]:       2160 :                 if (ssl_comp_methods != NULL)
     525                 :            :                         {
     526                 :       2160 :                         i=sk_SSL_COMP_find(ssl_comp_methods,&ctmp);
     527         [ -  + ]:       2160 :                         if (i >= 0)
     528                 :          0 :                                 *comp=sk_SSL_COMP_value(ssl_comp_methods,i);
     529                 :            :                         else
     530                 :       2160 :                                 *comp=NULL;
     531                 :            :                         }
     532                 :            :                 }
     533                 :            : 
     534         [ +  - ]:       2600 :         if ((enc == NULL) || (md == NULL)) return(0);
     535                 :            : 
     536   [ +  +  +  +  :       2600 :         switch (c->algorithm_enc)
          +  +  +  +  +  
          -  +  +  +  -  
                      + ]
     537                 :            :                 {
     538                 :            :         case SSL_DES:
     539                 :            :                 i=SSL_ENC_DES_IDX;
     540                 :            :                 break;
     541                 :            :         case SSL_3DES:
     542                 :         22 :                 i=SSL_ENC_3DES_IDX;
     543                 :         22 :                 break;
     544                 :            :         case SSL_RC4:
     545                 :         66 :                 i=SSL_ENC_RC4_IDX;
     546                 :         66 :                 break;
     547                 :            :         case SSL_RC2:
     548                 :         22 :                 i=SSL_ENC_RC2_IDX;
     549                 :         22 :                 break;
     550                 :            :         case SSL_IDEA:
     551                 :        462 :                 i=SSL_ENC_IDEA_IDX;
     552                 :        462 :                 break;
     553                 :            :         case SSL_eNULL:
     554                 :         66 :                 i=SSL_ENC_NULL_IDX;
     555                 :         66 :                 break;
     556                 :            :         case SSL_AES128:
     557                 :         48 :                 i=SSL_ENC_AES128_IDX;
     558                 :         48 :                 break;
     559                 :            :         case SSL_AES256:
     560                 :       1474 :                 i=SSL_ENC_AES256_IDX;
     561                 :       1474 :                 break;
     562                 :            :         case SSL_CAMELLIA128:
     563                 :         44 :                 i=SSL_ENC_CAMELLIA128_IDX;
     564                 :         44 :                 break;
     565                 :            :         case SSL_CAMELLIA256:
     566                 :         44 :                 i=SSL_ENC_CAMELLIA256_IDX;
     567                 :         44 :                 break;
     568                 :            :         case SSL_eGOST2814789CNT:
     569                 :          0 :                 i=SSL_ENC_GOST89_IDX;
     570                 :          0 :                 break;
     571                 :            :         case SSL_SEED:
     572                 :         22 :                 i=SSL_ENC_SEED_IDX;
     573                 :         22 :                 break;
     574                 :            :         case SSL_AES128GCM:
     575                 :         22 :                 i=SSL_ENC_AES128GCM_IDX;
     576                 :         22 :                 break;
     577                 :            :         case SSL_AES256GCM:
     578                 :        264 :                 i=SSL_ENC_AES256GCM_IDX;
     579                 :        264 :                 break;
     580                 :            :         default:
     581                 :          0 :                 i= -1;
     582                 :          0 :                 break;
     583                 :            :                 }
     584                 :            : 
     585         [ -  + ]:       2600 :         if ((i < 0) || (i >= SSL_ENC_NUM_IDX))
     586                 :          0 :                 *enc=NULL;
     587                 :            :         else
     588                 :            :                 {
     589         [ +  + ]:       2600 :                 if (i == SSL_ENC_NULL_IDX)
     590                 :         66 :                         *enc=EVP_enc_null();
     591                 :            :                 else
     592                 :       2534 :                         *enc=ssl_cipher_methods[i];
     593                 :            :                 }
     594                 :            : 
     595         [ +  + ]:       2600 :         switch (c->algorithm_mac)
     596                 :            :                 {
     597                 :            :         case SSL_MD5:
     598                 :            :                 i=SSL_MD_MD5_IDX;
     599                 :            :                 break;
     600                 :            :         case SSL_SHA1:
     601                 :            :                 i=SSL_MD_SHA1_IDX;
     602                 :            :                 break;
     603                 :            :         case SSL_SHA256:
     604                 :            :                 i=SSL_MD_SHA256_IDX;
     605                 :            :                 break;
     606                 :            :         case SSL_SHA384:
     607                 :            :                 i=SSL_MD_SHA384_IDX;
     608                 :            :                 break;
     609                 :            :         case SSL_GOST94:
     610                 :            :                 i = SSL_MD_GOST94_IDX;
     611                 :            :                 break;
     612                 :            :         case SSL_GOST89MAC:
     613                 :            :                 i = SSL_MD_GOST89MAC_IDX;
     614                 :            :                 break;
     615                 :            :         default:
     616                 :            :                 i= -1;
     617                 :            :                 break;
     618                 :            :                 }
     619         [ +  + ]:       2600 :         if ((i < 0) || (i >= SSL_MD_NUM_IDX))
     620                 :            :         {
     621                 :        286 :                 *md=NULL; 
     622         [ +  - ]:        286 :                 if (mac_pkey_type!=NULL) *mac_pkey_type = NID_undef;
     623         [ +  - ]:        286 :                 if (mac_secret_size!=NULL) *mac_secret_size = 0;
     624         [ +  - ]:        286 :                 if (c->algorithm_mac == SSL_AEAD)
     625                 :        286 :                         mac_pkey_type = NULL;
     626                 :            :         }
     627                 :            :         else
     628                 :            :         {
     629                 :       2314 :                 *md=ssl_digest_methods[i];
     630         [ +  + ]:       2314 :                 if (mac_pkey_type!=NULL) *mac_pkey_type = ssl_mac_pkey_id[i];
     631         [ +  + ]:       2314 :                 if (mac_secret_size!=NULL) *mac_secret_size = ssl_mac_secret_size[i];
     632                 :            :         }
     633                 :            : 
     634 [ +  - ][ +  + ]:       2600 :         if ((*enc != NULL) &&
     635 [ +  - ][ +  + ]:       2600 :             (*md != NULL || (EVP_CIPHER_flags(*enc)&EVP_CIPH_FLAG_AEAD_CIPHER)) &&
     636         [ +  - ]:       1368 :             (!mac_pkey_type||*mac_pkey_type != NID_undef))
     637                 :            :                 {
     638                 :            :                 const EVP_CIPHER *evp;
     639                 :            : 
     640         [ +  + ]:       2600 :                 if (use_etm)
     641                 :            :                         return 1;
     642                 :            : 
     643 [ +  + ][ +  + ]:       1364 :                 if (s->ssl_version>>8 != TLS1_VERSION_MAJOR ||
     644                 :            :                     s->ssl_version < TLS1_VERSION)
     645                 :            :                         return 1;
     646                 :            : 
     647                 :            : #ifdef OPENSSL_FIPS
     648                 :            :                 if (FIPS_mode())
     649                 :            :                         return 1;
     650                 :            : #endif
     651                 :            : 
     652 [ -  + ][ #  # ]:        418 :                 if      (c->algorithm_enc == SSL_RC4 &&
     653         [ #  # ]:          0 :                          c->algorithm_mac == SSL_MD5 &&
     654                 :            :                          (evp=EVP_get_cipherbyname("RC4-HMAC-MD5")))
     655                 :          0 :                         *enc = evp, *md = NULL;
     656 [ -  + ][ #  # ]:        418 :                 else if (c->algorithm_enc == SSL_AES128 &&
     657         [ #  # ]:          0 :                          c->algorithm_mac == SSL_SHA1 &&
     658                 :            :                          (evp=EVP_get_cipherbyname("AES-128-CBC-HMAC-SHA1")))
     659                 :          0 :                         *enc = evp, *md = NULL;
     660 [ +  + ][ +  - ]:        418 :                 else if (c->algorithm_enc == SSL_AES256 &&
     661         [ +  - ]:        132 :                          c->algorithm_mac == SSL_SHA1 &&
     662                 :            :                          (evp=EVP_get_cipherbyname("AES-256-CBC-HMAC-SHA1")))
     663                 :        132 :                         *enc = evp, *md = NULL;
     664 [ -  + ][ #  # ]:        286 :                 else if (c->algorithm_enc == SSL_AES128 &&
     665         [ #  # ]:          0 :                          c->algorithm_mac == SSL_SHA256 &&
     666                 :            :                          (evp=EVP_get_cipherbyname("AES-128-CBC-HMAC-SHA256")))
     667                 :          0 :                         *enc = evp, *md = NULL;
     668 [ -  + ][ #  # ]:        286 :                 else if (c->algorithm_enc == SSL_AES256 &&
     669         [ #  # ]:          0 :                          c->algorithm_mac == SSL_SHA256 &&
     670                 :            :                          (evp=EVP_get_cipherbyname("AES-256-CBC-HMAC-SHA256")))
     671                 :          0 :                         *enc = evp, *md = NULL;
     672                 :            :                 return(1);
     673                 :            :                 }
     674                 :            :         else
     675                 :            :                 return(0);
     676                 :            :         }
     677                 :            : 
     678                 :     165326 : int ssl_get_handshake_digest(int idx, long *mask, const EVP_MD **md) 
     679                 :            : {
     680         [ +  + ]:     165326 :         if (idx <0||idx>=SSL_MD_NUM_IDX) 
     681                 :            :                 {
     682                 :            :                 return 0;
     683                 :            :                 }
     684                 :     141708 :         *mask = ssl_handshake_digest_flag[idx];
     685         [ +  + ]:     141708 :         if (*mask)
     686                 :     118090 :                 *md = ssl_digest_methods[idx];
     687                 :            :         else
     688                 :      23618 :                 *md = NULL;
     689                 :            :         return 1;
     690                 :            : }
     691                 :            : 
     692                 :            : #define ITEM_SEP(a) \
     693                 :            :         (((a) == ':') || ((a) == ' ') || ((a) == ';') || ((a) == ','))
     694                 :            : 
     695                 :    1116360 : static void ll_append_tail(CIPHER_ORDER **head, CIPHER_ORDER *curr,
     696                 :            :              CIPHER_ORDER **tail)
     697                 :            :         {
     698         [ +  + ]:    1116360 :         if (curr == *tail) return;
     699         [ +  + ]:    1116338 :         if (curr == *head)
     700                 :     489292 :                 *head=curr->next;
     701         [ +  + ]:    1116338 :         if (curr->prev != NULL)
     702                 :     627046 :                 curr->prev->next=curr->next;
     703         [ +  - ]:    1116338 :         if (curr->next != NULL)
     704                 :    1116338 :                 curr->next->prev=curr->prev;
     705                 :    1116338 :         (*tail)->next=curr;
     706                 :    1116338 :         curr->prev= *tail;
     707                 :    1116338 :         curr->next=NULL;
     708                 :    1116338 :         *tail=curr;
     709                 :            :         }
     710                 :            : 
     711                 :     376106 : static void ll_append_head(CIPHER_ORDER **head, CIPHER_ORDER *curr,
     712                 :            :              CIPHER_ORDER **tail)
     713                 :            :         {
     714         [ +  - ]:     376106 :         if (curr == *head) return;
     715         [ +  - ]:     376106 :         if (curr == *tail)
     716                 :     376106 :                 *tail=curr->prev;
     717         [ -  + ]:     376106 :         if (curr->next != NULL)
     718                 :          0 :                 curr->next->prev=curr->prev;
     719         [ +  - ]:     376106 :         if (curr->prev != NULL)
     720                 :     376106 :                 curr->prev->next=curr->next;
     721                 :     376106 :         (*head)->prev=curr;
     722                 :     376106 :         curr->next= *head;
     723                 :     376106 :         curr->prev=NULL;
     724                 :     376106 :         *head=curr;
     725                 :            :         }
     726                 :            : 
     727                 :       2428 : static void ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth, unsigned long *enc, unsigned long *mac, unsigned long *ssl)
     728                 :            :         {
     729                 :       2428 :         *mkey = 0;
     730                 :       2428 :         *auth = 0;
     731                 :       2428 :         *enc = 0;
     732                 :       2428 :         *mac = 0;
     733                 :       2428 :         *ssl = 0;
     734                 :            : 
     735                 :            : #ifdef OPENSSL_NO_RSA
     736                 :            :         *mkey |= SSL_kRSA;
     737                 :            :         *auth |= SSL_aRSA;
     738                 :            : #endif
     739                 :            : #ifdef OPENSSL_NO_DSA
     740                 :            :         *auth |= SSL_aDSS;
     741                 :            : #endif
     742                 :            : #ifdef OPENSSL_NO_DH
     743                 :            :         *mkey |= SSL_kDHr|SSL_kDHd|SSL_kDHE;
     744                 :            :         *auth |= SSL_aDH;
     745                 :            : #endif
     746                 :            : #ifdef OPENSSL_NO_KRB5
     747                 :       2428 :         *mkey |= SSL_kKRB5;
     748                 :       2428 :         *auth |= SSL_aKRB5;
     749                 :            : #endif
     750                 :            : #ifdef OPENSSL_NO_ECDSA
     751                 :            :         *auth |= SSL_aECDSA;
     752                 :            : #endif
     753                 :            : #ifdef OPENSSL_NO_ECDH
     754                 :            :         *mkey |= SSL_kECDHe|SSL_kECDHr;
     755                 :            :         *auth |= SSL_aECDH;
     756                 :            : #endif
     757                 :            : #ifdef OPENSSL_NO_PSK
     758                 :            :         *mkey |= SSL_kPSK;
     759                 :            :         *auth |= SSL_aPSK;
     760                 :            : #endif
     761                 :            : #ifdef OPENSSL_NO_SRP
     762                 :            :         *mkey |= SSL_kSRP;
     763                 :            : #endif
     764                 :            :         /* Check for presence of GOST 34.10 algorithms, and if they
     765                 :            :          * do not present, disable  appropriate auth and key exchange */
     766         [ +  - ]:       2428 :         if (!get_optional_pkey_id("gost94")) {
     767                 :       2428 :                 *auth |= SSL_aGOST94;
     768                 :            :         }
     769         [ +  - ]:       2428 :         if (!get_optional_pkey_id("gost2001")) {
     770                 :       2428 :                 *auth |= SSL_aGOST01;
     771                 :            :         }
     772                 :            :         /* Disable GOST key exchange if no GOST signature algs are available * */
     773         [ +  - ]:       2428 :         if ((*auth & (SSL_aGOST94|SSL_aGOST01)) == (SSL_aGOST94|SSL_aGOST01)) {
     774                 :       2428 :                 *mkey |= SSL_kGOST;
     775                 :            :         }       
     776                 :            : #ifdef SSL_FORBID_ENULL
     777                 :            :         *enc |= SSL_eNULL;
     778                 :            : #endif
     779                 :            :                 
     780                 :            : 
     781                 :            : 
     782         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_DES_IDX ] == NULL) ? SSL_DES :0;
     783         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_3DES_IDX] == NULL) ? SSL_3DES:0;
     784         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_RC4_IDX ] == NULL) ? SSL_RC4 :0;
     785         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_RC2_IDX ] == NULL) ? SSL_RC2 :0;
     786         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_IDEA_IDX] == NULL) ? SSL_IDEA:0;
     787         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_AES128_IDX] == NULL) ? SSL_AES128:0;
     788         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_AES256_IDX] == NULL) ? SSL_AES256:0;
     789         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_AES128GCM_IDX] == NULL) ? SSL_AES128GCM:0;
     790         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_AES256GCM_IDX] == NULL) ? SSL_AES256GCM:0;
     791         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_CAMELLIA128_IDX] == NULL) ? SSL_CAMELLIA128:0;
     792         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_CAMELLIA256_IDX] == NULL) ? SSL_CAMELLIA256:0;
     793         [ +  + ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_GOST89_IDX] == NULL) ? SSL_eGOST2814789CNT:0;
     794         [ +  - ]:       2428 :         *enc |= (ssl_cipher_methods[SSL_ENC_SEED_IDX] == NULL) ? SSL_SEED:0;
     795                 :            : 
     796         [ +  - ]:       2428 :         *mac |= (ssl_digest_methods[SSL_MD_MD5_IDX ] == NULL) ? SSL_MD5 :0;
     797         [ +  - ]:       2428 :         *mac |= (ssl_digest_methods[SSL_MD_SHA1_IDX] == NULL) ? SSL_SHA1:0;
     798         [ +  - ]:       2428 :         *mac |= (ssl_digest_methods[SSL_MD_SHA256_IDX] == NULL) ? SSL_SHA256:0;
     799         [ +  - ]:       2428 :         *mac |= (ssl_digest_methods[SSL_MD_SHA384_IDX] == NULL) ? SSL_SHA384:0;
     800         [ +  + ]:       2428 :         *mac |= (ssl_digest_methods[SSL_MD_GOST94_IDX] == NULL) ? SSL_GOST94:0;
     801 [ +  + ][ -  + ]:       2428 :         *mac |= (ssl_digest_methods[SSL_MD_GOST89MAC_IDX] == NULL || ssl_mac_pkey_id[SSL_MD_GOST89MAC_IDX]==NID_undef)? SSL_GOST89MAC:0;
     802                 :            : 
     803                 :       2428 :         }
     804                 :            : 
     805                 :       4856 : static void ssl_cipher_collect_ciphers(const SSL_METHOD *ssl_method,
     806                 :            :                 int num_of_ciphers,
     807                 :            :                 unsigned long disabled_mkey, unsigned long disabled_auth,
     808                 :            :                 unsigned long disabled_enc, unsigned long disabled_mac,
     809                 :            :                 unsigned long disabled_ssl,
     810                 :            :                 CIPHER_ORDER *co_list,
     811                 :            :                 CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p)
     812                 :            :         {
     813                 :            :         int i, co_list_num;
     814                 :            :         const SSL_CIPHER *c;
     815                 :            : 
     816                 :            :         /*
     817                 :            :          * We have num_of_ciphers descriptions compiled in, depending on the
     818                 :            :          * method selected (SSLv2 and/or SSLv3, TLSv1 etc).
     819                 :            :          * These will later be sorted in a linked list with at most num
     820                 :            :          * entries.
     821                 :            :          */
     822                 :            : 
     823                 :            :         /* Get the initial list of ciphers */
     824                 :       2428 :         co_list_num = 0;        /* actual count of ciphers */
     825         [ +  + ]:     337418 :         for (i = 0; i < num_of_ciphers; i++)
     826                 :            :                 {
     827                 :     334990 :                 c = ssl_method->get_cipher(i);
     828                 :            :                 /* drop those that use any of that is not available */
     829 [ +  - ][ +  - ]:     334990 :                 if ((c != NULL) && c->valid &&
                 [ +  + ]
     830                 :            : #ifdef OPENSSL_FIPS
     831                 :            :                     (!FIPS_mode() || (c->algo_strength & SSL_FIPS)) &&
     832                 :            : #endif
     833         [ +  - ]:     326334 :                     !(c->algorithm_mkey & disabled_mkey) &&
     834         [ +  - ]:     326334 :                     !(c->algorithm_auth & disabled_auth) &&
     835         [ +  - ]:     326334 :                     !(c->algorithm_enc & disabled_enc) &&
     836         [ +  - ]:     326334 :                     !(c->algorithm_mac & disabled_mac) &&
     837                 :     326334 :                     !(c->algorithm_ssl & disabled_ssl))
     838                 :            :                         {
     839                 :     326334 :                         co_list[co_list_num].cipher = c;
     840                 :     326334 :                         co_list[co_list_num].next = NULL;
     841                 :     326334 :                         co_list[co_list_num].prev = NULL;
     842                 :     326334 :                         co_list[co_list_num].active = 0;
     843                 :     326334 :                         co_list_num++;
     844                 :            : #ifdef KSSL_DEBUG
     845                 :            :                         printf("\t%d: %s %lx %lx %lx\n",i,c->name,c->id,c->algorithm_mkey,c->algorithm_auth);
     846                 :            : #endif  /* KSSL_DEBUG */
     847                 :            :                         /*
     848                 :            :                         if (!sk_push(ca_list,(char *)c)) goto err;
     849                 :            :                         */
     850                 :            :                         }
     851                 :            :                 }
     852                 :            : 
     853                 :            :         /*
     854                 :            :          * Prepare linked list from list entries
     855                 :            :          */     
     856         [ +  - ]:       2428 :         if (co_list_num > 0)
     857                 :            :                 {
     858                 :       2428 :                 co_list[0].prev = NULL;
     859                 :            : 
     860         [ +  - ]:       2428 :                 if (co_list_num > 1)
     861                 :            :                         {
     862                 :       2428 :                         co_list[0].next = &co_list[1];
     863                 :            :                         
     864         [ +  + ]:     323906 :                         for (i = 1; i < co_list_num - 1; i++)
     865                 :            :                                 {
     866                 :     321478 :                                 co_list[i].prev = &co_list[i - 1];
     867                 :     321478 :                                 co_list[i].next = &co_list[i + 1];
     868                 :            :                                 }
     869                 :            : 
     870                 :       2428 :                         co_list[co_list_num - 1].prev = &co_list[co_list_num - 2];
     871                 :            :                         }
     872                 :            :                 
     873                 :       2428 :                 co_list[co_list_num - 1].next = NULL;
     874                 :            : 
     875                 :       2428 :                 *head_p = &co_list[0];
     876                 :       2428 :                 *tail_p = &co_list[co_list_num - 1];
     877                 :            :                 }
     878                 :       2428 :         }
     879                 :            : 
     880                 :       2428 : static void ssl_cipher_collect_aliases(const SSL_CIPHER **ca_list,
     881                 :            :                         int num_of_group_aliases,
     882                 :            :                         unsigned long disabled_mkey, unsigned long disabled_auth,
     883                 :            :                         unsigned long disabled_enc, unsigned long disabled_mac,
     884                 :            :                         unsigned long disabled_ssl,
     885                 :            :                         CIPHER_ORDER *head)
     886                 :            :         {
     887                 :            :         CIPHER_ORDER *ciph_curr;
     888                 :            :         const SSL_CIPHER **ca_curr;
     889                 :            :         int i;
     890                 :       2428 :         unsigned long mask_mkey = ~disabled_mkey;
     891                 :       2428 :         unsigned long mask_auth = ~disabled_auth;
     892                 :       2428 :         unsigned long mask_enc = ~disabled_enc;
     893                 :       2428 :         unsigned long mask_mac = ~disabled_mac;
     894                 :       2428 :         unsigned long mask_ssl = ~disabled_ssl;
     895                 :            : 
     896                 :            :         /*
     897                 :            :          * First, add the real ciphers as already collected
     898                 :            :          */
     899                 :       2428 :         ciph_curr = head;
     900                 :       2428 :         ca_curr = ca_list;
     901         [ +  + ]:     328762 :         while (ciph_curr != NULL)
     902                 :            :                 {
     903                 :     326334 :                 *ca_curr = ciph_curr->cipher;
     904                 :     326334 :                 ca_curr++;
     905                 :     326334 :                 ciph_curr = ciph_curr->next;
     906                 :            :                 }
     907                 :            : 
     908                 :            :         /*
     909                 :            :          * Now we add the available ones from the cipher_aliases[] table.
     910                 :            :          * They represent either one or more algorithms, some of which
     911                 :            :          * in any affected category must be supported (set in enabled_mask),
     912                 :            :          * or represent a cipher strength value (will be added in any case because algorithms=0).
     913                 :            :          */
     914         [ +  + ]:     206380 :         for (i = 0; i < num_of_group_aliases; i++)
     915                 :            :                 {
     916                 :     203952 :                 unsigned long algorithm_mkey = cipher_aliases[i].algorithm_mkey;
     917                 :     203952 :                 unsigned long algorithm_auth = cipher_aliases[i].algorithm_auth;
     918                 :     203952 :                 unsigned long algorithm_enc = cipher_aliases[i].algorithm_enc;
     919                 :     203952 :                 unsigned long algorithm_mac = cipher_aliases[i].algorithm_mac;
     920                 :     203952 :                 unsigned long algorithm_ssl = cipher_aliases[i].algorithm_ssl;
     921                 :            : 
     922         [ +  + ]:     203952 :                 if (algorithm_mkey)
     923         [ +  + ]:      82552 :                         if ((algorithm_mkey & mask_mkey) == 0)
     924                 :       7284 :                                 continue;
     925                 :            :         
     926         [ +  + ]:     196668 :                 if (algorithm_auth)
     927         [ +  + ]:      70412 :                         if ((algorithm_auth & mask_auth) == 0)
     928                 :       9712 :                                 continue;
     929                 :            :                 
     930         [ +  + ]:     186956 :                 if (algorithm_enc)
     931         [ -  + ]:      60700 :                         if ((algorithm_enc & mask_enc) == 0)
     932                 :          0 :                                 continue;
     933                 :            :                 
     934         [ +  + ]:     186956 :                 if (algorithm_mac)
     935         [ +  + ]:      31564 :                         if ((algorithm_mac & mask_mac) == 0)
     936                 :       4812 :                                 continue;
     937                 :            :                 
     938         [ +  + ]:     182144 :                 if (algorithm_ssl)
     939         [ -  + ]:      24280 :                         if ((algorithm_ssl & mask_ssl) == 0)
     940                 :          0 :                                 continue;
     941                 :            :                 
     942                 :     182144 :                 *ca_curr = (SSL_CIPHER *)(cipher_aliases + i);
     943                 :     182144 :                 ca_curr++;
     944                 :            :                 }
     945                 :            : 
     946                 :       2428 :         *ca_curr = NULL;        /* end of list */
     947                 :       2428 :         }
     948                 :            : 
     949                 :     100472 : static void ssl_cipher_apply_rule(unsigned long cipher_id,
     950                 :            :                 unsigned long alg_mkey, unsigned long alg_auth,
     951                 :            :                 unsigned long alg_enc, unsigned long alg_mac,
     952                 :            :                 unsigned long alg_ssl,
     953                 :            :                 unsigned long algo_strength,
     954                 :            :                 int rule, int strength_bits,
     955                 :            :                 CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p)
     956                 :            :         {
     957                 :            :         CIPHER_ORDER *head, *tail, *curr, *next, *last;
     958                 :            :         const SSL_CIPHER *cp;
     959                 :      50236 :         int reverse = 0;
     960                 :            : 
     961                 :            : #ifdef CIPHER_DEBUG
     962                 :            :         printf("Applying rule %d with %08lx/%08lx/%08lx/%08lx/%08lx %08lx (%d)\n",
     963                 :            :                 rule, alg_mkey, alg_auth, alg_enc, alg_mac, alg_ssl, algo_strength, strength_bits);
     964                 :            : #endif
     965                 :            : 
     966         [ +  + ]:      50236 :         if (rule == CIPHER_DEL)
     967                 :       4856 :                 reverse = 1; /* needed to maintain sorting between currently deleted ciphers */
     968                 :            : 
     969                 :      50236 :         head = *head_p;
     970                 :      50236 :         tail = *tail_p;
     971                 :            : 
     972         [ +  + ]:      50236 :         if (reverse)
     973                 :            :                 {
     974                 :            :                 next = tail;
     975                 :            :                 last = head;
     976                 :            :                 }
     977                 :            :         else
     978                 :            :                 {
     979                 :      45380 :                 next = head;
     980                 :      45380 :                 last = tail;
     981                 :            :                 }
     982                 :            : 
     983                 :    6865628 :         curr = NULL;
     984                 :            :         for (;;)
     985                 :            :                 {
     986         [ +  + ]:    6865628 :                 if (curr == last) break;
     987                 :            : 
     988                 :    6815392 :                 curr = next;
     989                 :            : 
     990         [ +  - ]:    6815392 :                 if (curr == NULL) break;
     991                 :            : 
     992         [ +  + ]:    6815392 :                 next = reverse ? curr->prev : curr->next;
     993                 :            : 
     994                 :    6815392 :                 cp = curr->cipher;
     995                 :            : 
     996                 :            :                 /*
     997                 :            :                  * Selection criteria is either the value of strength_bits
     998                 :            :                  * or the algorithms used.
     999                 :            :                  */
    1000         [ +  + ]:    6815392 :                 if (strength_bits >= 0)
    1001                 :            :                         {
    1002         [ +  + ]:    1954308 :                         if (strength_bits != cp->strength_bits)
    1003                 :    1627974 :                                 continue;
    1004                 :            :                         }
    1005                 :            :                 else
    1006                 :            :                         {
    1007                 :            : #ifdef CIPHER_DEBUG
    1008                 :            :                         printf("\nName: %s:\nAlgo = %08lx/%08lx/%08lx/%08lx/%08lx Algo_strength = %08lx\n", cp->name, cp->algorithm_mkey, cp->algorithm_auth, cp->algorithm_enc, cp->algorithm_mac, cp->algorithm_ssl, cp->algo_strength);
    1009                 :            : #endif
    1010                 :            : #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
    1011                 :            :                         if (cipher_id && cipher_id != cp->id)
    1012                 :            :                                 continue;
    1013                 :            : #endif
    1014 [ +  + ][ +  + ]:    4861084 :                         if (alg_mkey && !(alg_mkey & cp->algorithm_mkey))
    1015                 :    1548800 :                                 continue;
    1016 [ +  + ][ +  + ]:    3312284 :                         if (alg_auth && !(alg_auth & cp->algorithm_auth))
    1017                 :     767930 :                                 continue;
    1018 [ +  + ][ +  + ]:    2544354 :                         if (alg_enc && !(alg_enc & cp->algorithm_enc))
    1019                 :     687104 :                                 continue;
    1020 [ +  + ][ +  + ]:    1857250 :                         if (alg_mac && !(alg_mac & cp->algorithm_mac))
    1021                 :     307688 :                                 continue;
    1022 [ +  + ][ +  + ]:    1549562 :                         if (alg_ssl && !(alg_ssl & cp->algorithm_ssl))
    1023                 :     185676 :                                 continue;
    1024 [ +  + ][ +  + ]:    1363886 :                         if ((algo_strength & SSL_EXP_MASK) && !(algo_strength & SSL_EXP_MASK & cp->algo_strength))
    1025                 :         88 :                                 continue;
    1026 [ +  + ][ -  + ]:    1363798 :                         if ((algo_strength & SSL_STRONG_MASK) && !(algo_strength & SSL_STRONG_MASK & cp->algo_strength))
    1027                 :          0 :                                 continue;
    1028                 :            :                         }
    1029                 :            : 
    1030                 :            : #ifdef CIPHER_DEBUG
    1031                 :            :                 printf("Action = %d\n", rule);
    1032                 :            : #endif
    1033                 :            : 
    1034                 :            :                 /* add the cipher if it has not been added yet. */
    1035         [ +  + ]:    1690132 :                 if (rule == CIPHER_ADD)
    1036                 :            :                         {
    1037                 :            :                         /* reverse == 0 */
    1038         [ +  + ]:     750202 :                         if (!curr->active)
    1039                 :            :                                 {
    1040                 :     598722 :                                 ll_append_tail(&head, curr, &tail);
    1041                 :     598722 :                                 curr->active = 1;
    1042                 :            :                                 }
    1043                 :            :                         }
    1044                 :            :                 /* Move the added cipher to this location */
    1045         [ +  + ]:     939930 :                 else if (rule == CIPHER_ORD)
    1046                 :            :                         {
    1047                 :            :                         /* reverse == 0 */
    1048         [ -  + ]:     517638 :                         if (curr->active)
    1049                 :            :                                 {
    1050                 :     517638 :                                 ll_append_tail(&head, curr, &tail);
    1051                 :            :                                 }
    1052                 :            :                         }
    1053         [ +  + ]:     422292 :                 else if (rule == CIPHER_DEL)
    1054                 :            :                         {
    1055                 :            :                         /* reverse == 1 */
    1056         [ -  + ]:     376106 :                         if (curr->active)
    1057                 :            :                                 {
    1058                 :            :                                 /* most recently deleted ciphersuites get best positions
    1059                 :            :                                  * for any future CIPHER_ADD (note that the CIPHER_DEL loop
    1060                 :            :                                  * works in reverse to maintain the order) */
    1061                 :     376106 :                                 ll_append_head(&head, curr, &tail);
    1062                 :     376106 :                                 curr->active = 0;
    1063                 :            :                                 }
    1064                 :            :                         }
    1065         [ -  + ]:      46186 :                 else if (rule == CIPHER_KILL)
    1066                 :            :                         {
    1067                 :            :                         /* reverse == 0 */
    1068         [ +  + ]:      46186 :                         if (head == curr)
    1069                 :      10808 :                                 head = curr->next;
    1070                 :            :                         else
    1071                 :      35378 :                                 curr->prev->next = curr->next;
    1072         [ +  + ]:      46186 :                         if (tail == curr)
    1073                 :        422 :                                 tail = curr->prev;
    1074                 :      46186 :                         curr->active = 0;
    1075         [ +  + ]:      46186 :                         if (curr->next != NULL)
    1076                 :      45764 :                                 curr->next->prev = curr->prev;
    1077         [ +  + ]:      46186 :                         if (curr->prev != NULL)
    1078                 :      35378 :                                 curr->prev->next = curr->next;
    1079                 :      46186 :                         curr->next = NULL;
    1080                 :      46186 :                         curr->prev = NULL;
    1081                 :            :                         }
    1082                 :            :                 }
    1083                 :            : 
    1084                 :      50236 :         *head_p = head;
    1085                 :      50236 :         *tail_p = tail;
    1086                 :      50236 :         }
    1087                 :            : 
    1088                 :       2428 : static int ssl_cipher_strength_sort(CIPHER_ORDER **head_p,
    1089                 :            :                                     CIPHER_ORDER **tail_p)
    1090                 :            :         {
    1091                 :            :         int max_strength_bits, i, *number_uses;
    1092                 :            :         CIPHER_ORDER *curr;
    1093                 :            : 
    1094                 :            :         /*
    1095                 :            :          * This routine sorts the ciphers with descending strength. The sorting
    1096                 :            :          * must keep the pre-sorted sequence, so we apply the normal sorting
    1097                 :            :          * routine as '+' movement to the end of the list.
    1098                 :            :          */
    1099                 :       2428 :         max_strength_bits = 0;
    1100                 :       2428 :         curr = *head_p;
    1101         [ +  + ]:     328762 :         while (curr != NULL)
    1102                 :            :                 {
    1103 [ +  - ][ +  + ]:     326334 :                 if (curr->active &&
    1104                 :     326334 :                     (curr->cipher->strength_bits > max_strength_bits))
    1105                 :       2692 :                     max_strength_bits = curr->cipher->strength_bits;
    1106                 :     326334 :                 curr = curr->next;
    1107                 :            :                 }
    1108                 :            : 
    1109                 :       2428 :         number_uses = OPENSSL_malloc((max_strength_bits + 1) * sizeof(int));
    1110         [ -  + ]:       2428 :         if (!number_uses)
    1111                 :            :                 {
    1112                 :          0 :                 SSLerr(SSL_F_SSL_CIPHER_STRENGTH_SORT,ERR_R_MALLOC_FAILURE);
    1113                 :          0 :                 return(0);
    1114                 :            :                 }
    1115                 :       2428 :         memset(number_uses, 0, (max_strength_bits + 1) * sizeof(int));
    1116                 :            : 
    1117                 :            :         /*
    1118                 :            :          * Now find the strength_bits values actually used
    1119                 :            :          */
    1120                 :       2428 :         curr = *head_p;
    1121         [ +  + ]:     328762 :         while (curr != NULL)
    1122                 :            :                 {
    1123         [ +  - ]:     326334 :                 if (curr->active)
    1124                 :     326334 :                         number_uses[curr->cipher->strength_bits]++;
    1125                 :     326334 :                 curr = curr->next;
    1126                 :            :                 }
    1127                 :            :         /*
    1128                 :            :          * Go through the list of used strength_bits values in descending
    1129                 :            :          * order.
    1130                 :            :          */
    1131         [ +  + ]:     592632 :         for (i = max_strength_bits; i >= 0; i--)
    1132         [ +  + ]:     590204 :                 if (number_uses[i] > 0)
    1133                 :      14040 :                         ssl_cipher_apply_rule(0, 0, 0, 0, 0, 0, 0, CIPHER_ORD, i, head_p, tail_p);
    1134                 :            : 
    1135                 :       2428 :         OPENSSL_free(number_uses);
    1136                 :       2428 :         return(1);
    1137                 :            :         }
    1138                 :            : 
    1139                 :      14120 : static int ssl_cipher_process_rulestr(const char *rule_str,
    1140                 :            :                 CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p,
    1141                 :            :                 const SSL_CIPHER **ca_list, CERT *c)
    1142                 :            :         {
    1143                 :            :         unsigned long alg_mkey, alg_auth, alg_enc, alg_mac, alg_ssl, algo_strength;
    1144                 :            :         const char *l, *buf;
    1145                 :            :         int j, multi, found, rule, retval, ok, buflen;
    1146                 :            :         unsigned long cipher_id = 0;
    1147                 :            :         char ch;
    1148                 :            : 
    1149                 :            :         retval = 1;
    1150                 :            :         l = rule_str;
    1151                 :            :         for (;;)
    1152                 :            :                 {
    1153                 :      11692 :                 ch = *l;
    1154                 :            : 
    1155         [ +  - ]:      11692 :                 if (ch == '\0')
    1156                 :            :                         break;          /* done */
    1157         [ -  + ]:      11692 :                 if (ch == '-')
    1158                 :          0 :                         { rule = CIPHER_DEL; l++; }
    1159         [ -  + ]:      11692 :                 else if (ch == '+')
    1160                 :          0 :                         { rule = CIPHER_ORD; l++; }
    1161         [ +  + ]:      11692 :                 else if (ch == '!')
    1162                 :       4632 :                         { rule = CIPHER_KILL; l++; }
    1163         [ -  + ]:       7060 :                 else if (ch == '@')
    1164                 :          0 :                         { rule = CIPHER_SPECIAL; l++; }
    1165                 :            :                 else
    1166                 :            :                         { rule = CIPHER_ADD; }
    1167                 :            : 
    1168 [ +  + ][ -  + ]:      11692 :                 if (ITEM_SEP(ch))
    1169                 :            :                         {
    1170                 :       4632 :                         l++;
    1171                 :      11692 :                         continue;
    1172                 :            :                         }
    1173                 :            : 
    1174                 :            :                 alg_mkey = 0;
    1175                 :            :                 alg_auth = 0;
    1176                 :            :                 alg_enc = 0;
    1177                 :            :                 alg_mac = 0;
    1178                 :            :                 alg_ssl = 0;
    1179                 :            :                 algo_strength = 0;
    1180                 :            : 
    1181                 :            :                 for (;;)
    1182                 :            :                         {
    1183                 :       7082 :                         ch = *l;
    1184                 :       7082 :                         buf = l;
    1185                 :       7082 :                         buflen = 0;
    1186                 :            : #ifndef CHARSET_EBCDIC
    1187         [ +  + ]:      42730 :                         while ( ((ch >= 'A') && (ch <= 'Z')) ||
    1188         [ +  + ]:      12719 :                                 ((ch >= '0') && (ch <= '9')) ||
    1189                 :      12719 :                                 ((ch >= 'a') && (ch <= 'z')) ||
    1190 [ +  + ][ -  + ]:       7801 :                                  (ch == '-') || (ch == '.')  ||
    1191                 :            :                                  (ch == '='))
    1192                 :            : #else
    1193                 :            :                         while ( isalnum(ch) || (ch == '-') || (ch == '.') ||
    1194                 :            :                                 (ch == '='))
    1195                 :            : #endif
    1196                 :            :                                  {
    1197                 :      35648 :                                  ch = *(++l);
    1198                 :      35648 :                                  buflen++;
    1199                 :            :                                  }
    1200                 :            : 
    1201         [ -  + ]:       7082 :                         if (buflen == 0)
    1202                 :            :                                 {
    1203                 :            :                                 /*
    1204                 :            :                                  * We hit something we cannot deal with,
    1205                 :            :                                  * it is no command or separator nor
    1206                 :            :                                  * alphanumeric, so we call this an error.
    1207                 :            :                                  */
    1208                 :          0 :                                 SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
    1209                 :            :                                        SSL_R_INVALID_COMMAND);
    1210                 :          0 :                                 retval = found = 0;
    1211                 :          0 :                                 l++;
    1212                 :            :                                 break;
    1213                 :            :                                 }
    1214                 :            : 
    1215         [ +  - ]:       7082 :                         if (rule == CIPHER_SPECIAL)
    1216                 :            :                                 {
    1217                 :            :                                 found = 0; /* unused -- avoid compiler warning */
    1218                 :            :                                 break;  /* special treatment */
    1219                 :            :                                 }
    1220                 :            : 
    1221                 :            :                         /* check for multi-part specification */
    1222         [ +  + ]:       7082 :                         if (ch == '+')
    1223                 :            :                                 {
    1224                 :         22 :                                 multi=1;
    1225                 :         22 :                                 l++;
    1226                 :            :                                 }
    1227                 :            :                         else
    1228                 :            :                                 multi=0;
    1229                 :            : 
    1230                 :            :                         /*
    1231                 :            :                          * Now search for the cipher alias in the ca_list. Be careful
    1232                 :            :                          * with the strncmp, because the "buflen" limitation
    1233                 :            :                          * will make the rule "ADH:SOME" and the cipher
    1234                 :            :                          * "ADH-MY-CIPHER" look like a match for buflen=3.
    1235                 :            :                          * So additionally check whether the cipher name found
    1236                 :            :                          * has the correct length. We can save a strlen() call:
    1237                 :            :                          * just checking for the '\0' at the right place is
    1238                 :            :                          * sufficient, we have to strncmp() anyway. (We cannot
    1239                 :            :                          * use strcmp(), because buf is not '\0' terminated.)
    1240                 :            :                          */
    1241                 :       7082 :                         j = found = 0;
    1242                 :       7082 :                         cipher_id = 0;
    1243         [ +  - ]:    1216380 :                         while (ca_list[j])
    1244                 :            :                                 {
    1245 [ +  + ][ +  + ]:    1216380 :                                 if (!strncmp(buf, ca_list[j]->name, buflen) &&
    1246                 :       8074 :                                     (ca_list[j]->name[buflen] == '\0'))
    1247                 :            :                                         {
    1248                 :            :                                         found = 1;
    1249                 :            :                                         break;
    1250                 :            :                                         }
    1251                 :            :                                 else
    1252                 :    1209298 :                                         j++;
    1253                 :            :                                 }
    1254                 :            : 
    1255         [ +  - ]:       7082 :                         if (!found)
    1256                 :            :                                 break;  /* ignore this entry */
    1257                 :            : 
    1258         [ +  + ]:       7082 :                         if (ca_list[j]->algorithm_mkey)
    1259                 :            :                                 {
    1260         [ -  + ]:        620 :                                 if (alg_mkey)
    1261                 :            :                                         {
    1262                 :          0 :                                         alg_mkey &= ca_list[j]->algorithm_mkey;
    1263         [ #  # ]:          0 :                                         if (!alg_mkey) { found = 0; break; }
    1264                 :            :                                         }
    1265                 :            :                                 else
    1266                 :            :                                         alg_mkey = ca_list[j]->algorithm_mkey;
    1267                 :            :                                 }
    1268                 :            : 
    1269         [ +  + ]:       7082 :                         if (ca_list[j]->algorithm_auth)
    1270                 :            :                                 {
    1271         [ -  + ]:       2120 :                                 if (alg_auth)
    1272                 :            :                                         {
    1273                 :          0 :                                         alg_auth &= ca_list[j]->algorithm_auth;
    1274         [ #  # ]:          0 :                                         if (!alg_auth) { found = 0; break; }
    1275                 :            :                                         }
    1276                 :            :                                 else
    1277                 :            :                                         alg_auth = ca_list[j]->algorithm_auth;
    1278                 :            :                                 }
    1279                 :            :                         
    1280         [ +  + ]:       7082 :                         if (ca_list[j]->algorithm_enc)
    1281                 :            :                                 {
    1282         [ -  + ]:       3576 :                                 if (alg_enc)
    1283                 :            :                                         {
    1284                 :          0 :                                         alg_enc &= ca_list[j]->algorithm_enc;
    1285         [ #  # ]:          0 :                                         if (!alg_enc) { found = 0; break; }
    1286                 :            :                                         }
    1287                 :            :                                 else
    1288                 :            :                                         alg_enc = ca_list[j]->algorithm_enc;
    1289                 :            :                                 }
    1290                 :            :                                                 
    1291         [ +  + ]:       7082 :                         if (ca_list[j]->algorithm_mac)
    1292                 :            :                                 {
    1293         [ -  + ]:        488 :                                 if (alg_mac)
    1294                 :            :                                         {
    1295                 :          0 :                                         alg_mac &= ca_list[j]->algorithm_mac;
    1296         [ #  # ]:          0 :                                         if (!alg_mac) { found = 0; break; }
    1297                 :            :                                         }
    1298                 :            :                                 else
    1299                 :            :                                         alg_mac = ca_list[j]->algorithm_mac;
    1300                 :            :                                 }
    1301                 :            :                         
    1302         [ +  + ]:       7082 :                         if (ca_list[j]->algo_strength & SSL_EXP_MASK)
    1303                 :            :                                 {
    1304         [ -  + ]:        488 :                                 if (algo_strength & SSL_EXP_MASK)
    1305                 :            :                                         {
    1306                 :          0 :                                         algo_strength &= (ca_list[j]->algo_strength & SSL_EXP_MASK) | ~SSL_EXP_MASK;
    1307         [ #  # ]:          0 :                                         if (!(algo_strength & SSL_EXP_MASK)) { found = 0; break; }
    1308                 :            :                                         }
    1309                 :            :                                 else
    1310                 :        488 :                                         algo_strength |= ca_list[j]->algo_strength & SSL_EXP_MASK;
    1311                 :            :                                 }
    1312                 :            : 
    1313         [ +  + ]:       7082 :                         if (ca_list[j]->algo_strength & SSL_STRONG_MASK)
    1314                 :            :                                 {
    1315         [ -  + ]:        488 :                                 if (algo_strength & SSL_STRONG_MASK)
    1316                 :            :                                         {
    1317                 :          0 :                                         algo_strength &= (ca_list[j]->algo_strength & SSL_STRONG_MASK) | ~SSL_STRONG_MASK;
    1318         [ #  # ]:          0 :                                         if (!(algo_strength & SSL_STRONG_MASK)) { found = 0; break; }
    1319                 :            :                                         }
    1320                 :            :                                 else
    1321                 :        488 :                                         algo_strength |= ca_list[j]->algo_strength & SSL_STRONG_MASK;
    1322                 :            :                                 }
    1323                 :            :                         
    1324         [ +  + ]:       7082 :                         if (ca_list[j]->valid)
    1325                 :            :                                 {
    1326                 :            :                                 /* explicit ciphersuite found; its protocol version
    1327                 :            :                                  * does not become part of the search pattern!*/
    1328                 :            : 
    1329                 :            :                                 cipher_id = ca_list[j]->id;
    1330                 :            :                                 }
    1331                 :            :                         else
    1332                 :            :                                 {
    1333                 :            :                                 /* not an explicit ciphersuite; only in this case, the
    1334                 :            :                                  * protocol version is considered part of the search pattern */
    1335                 :            : 
    1336         [ +  + ]:       6594 :                                 if (ca_list[j]->algorithm_ssl)
    1337                 :            :                                         {
    1338         [ -  + ]:       1830 :                                         if (alg_ssl)
    1339                 :            :                                                 {
    1340                 :          0 :                                                 alg_ssl &= ca_list[j]->algorithm_ssl;
    1341         [ #  # ]:          0 :                                                 if (!alg_ssl) { found = 0; break; }
    1342                 :            :                                                 }
    1343                 :            :                                         else
    1344                 :            :                                                 alg_ssl = ca_list[j]->algorithm_ssl;
    1345                 :            :                                         }
    1346                 :            :                                 }
    1347                 :            :                         
    1348         [ +  + ]:       7082 :                         if (!multi) break;
    1349                 :            :                         }
    1350                 :            : 
    1351                 :            :                 /*
    1352                 :            :                  * Ok, we have the rule, now apply it
    1353                 :            :                  */
    1354         [ -  + ]:       7060 :                 if (rule == CIPHER_SPECIAL)
    1355                 :            :                         {       /* special command */
    1356                 :          0 :                         ok = 0;
    1357 [ #  # ][ #  # ]:          0 :                         if ((buflen == 8) &&
    1358                 :          0 :                                 !strncmp(buf, "STRENGTH", 8))
    1359                 :          0 :                                 ok = ssl_cipher_strength_sort(head_p, tail_p);
    1360 [ #  # ][ #  # ]:          0 :                         else if (buflen == 10 && !strncmp(buf, "SECLEVEL=", 9))
    1361                 :            :                                 {
    1362                 :          0 :                                 int level = buf[9] - '0';
    1363         [ #  # ]:          0 :                                 if (level < 0 || level > 5)
    1364                 :            :                                         {
    1365                 :          0 :                                         SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
    1366                 :            :                                                 SSL_R_INVALID_COMMAND);
    1367                 :            :                                         }
    1368                 :            :                                 else
    1369                 :            :                                         {
    1370                 :          0 :                                         c->sec_level = level;
    1371                 :          0 :                                         ok = 1;
    1372                 :            :                                         }
    1373                 :            :                                 }
    1374                 :            :                         else
    1375                 :          0 :                                 SSLerr(SSL_F_SSL_CIPHER_PROCESS_RULESTR,
    1376                 :            :                                         SSL_R_INVALID_COMMAND);
    1377         [ #  # ]:          0 :                         if (ok == 0)
    1378                 :          0 :                                 retval = 0;
    1379                 :            :                         /*
    1380                 :            :                          * We do not support any "multi" options
    1381                 :            :                          * together with "@", so throw away the
    1382                 :            :                          * rest of the command, if any left, until
    1383                 :            :                          * end or ':' is found.
    1384                 :            :                          */
    1385 [ #  # ][ #  # ]:          0 :                         while ((*l != '\0') && !ITEM_SEP(*l))
         [ #  # ][ #  # ]
    1386                 :          0 :                                 l++;
    1387                 :            :                         }
    1388         [ -  + ]:       7060 :                 else if (found)
    1389                 :            :                         {
    1390                 :       7060 :                         ssl_cipher_apply_rule(cipher_id,
    1391                 :            :                                 alg_mkey, alg_auth, alg_enc, alg_mac, alg_ssl, algo_strength,
    1392                 :            :                                 rule, -1, head_p, tail_p);
    1393                 :            :                         }
    1394                 :            :                 else
    1395                 :            :                         {
    1396 [ #  # ][ #  # ]:          0 :                         while ((*l != '\0') && !ITEM_SEP(*l))
         [ #  # ][ #  # ]
    1397                 :          0 :                                 l++;
    1398                 :            :                         }
    1399         [ +  + ]:       7060 :                 if (*l == '\0') break; /* done */
    1400                 :            :                 }
    1401                 :            : 
    1402                 :       2428 :         return(retval);
    1403                 :            :         }
    1404                 :            : #ifndef OPENSSL_NO_EC
    1405                 :       2428 : static int check_suiteb_cipher_list(const SSL_METHOD *meth, CERT *c,
    1406                 :            :                                         const char **prule_str)
    1407                 :            :         {
    1408                 :       2428 :         unsigned int suiteb_flags = 0, suiteb_comb2 = 0;
    1409         [ +  - ]:       2428 :         if (!strcmp(*prule_str, "SUITEB128"))
    1410                 :            :                 suiteb_flags = SSL_CERT_FLAG_SUITEB_128_LOS;
    1411         [ +  - ]:       2428 :         else if (!strcmp(*prule_str, "SUITEB128ONLY"))
    1412                 :            :                 suiteb_flags = SSL_CERT_FLAG_SUITEB_128_LOS_ONLY;
    1413         [ +  - ]:       2428 :         else if (!strcmp(*prule_str, "SUITEB128C2"))
    1414                 :            :                 {
    1415                 :            :                 suiteb_comb2 = 1;
    1416                 :            :                 suiteb_flags = SSL_CERT_FLAG_SUITEB_128_LOS;
    1417                 :            :                 }
    1418         [ -  + ]:       2428 :         else if (!strcmp(*prule_str, "SUITEB192"))
    1419                 :          0 :                 suiteb_flags = SSL_CERT_FLAG_SUITEB_192_LOS;
    1420                 :            : 
    1421         [ -  + ]:       2428 :         if (suiteb_flags)
    1422                 :            :                 {
    1423                 :          0 :                 c->cert_flags &= ~SSL_CERT_FLAG_SUITEB_128_LOS;
    1424                 :          0 :                 c->cert_flags |= suiteb_flags;
    1425                 :            :                 }
    1426                 :            :         else
    1427                 :       2428 :                 suiteb_flags = c->cert_flags & SSL_CERT_FLAG_SUITEB_128_LOS;
    1428                 :            : 
    1429         [ -  + ]:       2428 :         if (!suiteb_flags)
    1430                 :            :                 return 1;
    1431                 :            :         /* Check version: if TLS 1.2 ciphers allowed we can use Suite B */
    1432                 :            : 
    1433         [ #  # ]:          0 :         if (!(meth->ssl3_enc->enc_flags & SSL_ENC_FLAG_TLS1_2_CIPHERS))
    1434                 :            :                 {
    1435         [ #  # ]:          0 :                 if (meth->ssl3_enc->enc_flags & SSL_ENC_FLAG_DTLS)
    1436                 :          0 :                         SSLerr(SSL_F_CHECK_SUITEB_CIPHER_LIST,
    1437                 :            :                                 SSL_R_ONLY_DTLS_1_2_ALLOWED_IN_SUITEB_MODE);
    1438                 :            :                 else
    1439                 :          0 :                         SSLerr(SSL_F_CHECK_SUITEB_CIPHER_LIST,
    1440                 :            :                                 SSL_R_ONLY_TLS_1_2_ALLOWED_IN_SUITEB_MODE);
    1441                 :            :                 return 0;
    1442                 :            :                 }
    1443                 :            : 
    1444   [ #  #  #  # ]:          0 :         switch(suiteb_flags)
    1445                 :            :                 {
    1446                 :            :         case SSL_CERT_FLAG_SUITEB_128_LOS:
    1447         [ #  # ]:          0 :                 if (suiteb_comb2)
    1448                 :          0 :                         *prule_str = "ECDHE-ECDSA-AES256-GCM-SHA384";
    1449                 :            :                 else
    1450                 :          0 :                         *prule_str = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384";
    1451                 :            :                 break;
    1452                 :            :         case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY:
    1453                 :          0 :                 *prule_str = "ECDHE-ECDSA-AES128-GCM-SHA256";
    1454                 :            :                 break;
    1455                 :            :         case SSL_CERT_FLAG_SUITEB_192_LOS:
    1456                 :          0 :                 *prule_str = "ECDHE-ECDSA-AES256-GCM-SHA384";
    1457                 :            :                 break;
    1458                 :            :                 }
    1459                 :            :         /* Set auto ECDH parameter determination */
    1460                 :          0 :         c->ecdh_tmp_auto = 1;
    1461                 :            :         return 1;
    1462                 :            :         }
    1463                 :            : #endif
    1464                 :            : 
    1465                 :       2428 : STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
    1466                 :            :                 STACK_OF(SSL_CIPHER) **cipher_list,
    1467                 :            :                 STACK_OF(SSL_CIPHER) **cipher_list_by_id,
    1468                 :            :                 const char *rule_str, CERT *c)
    1469                 :            :         {
    1470                 :            :         int ok, num_of_ciphers, num_of_alias_max, num_of_group_aliases;
    1471                 :            :         unsigned long disabled_mkey, disabled_auth, disabled_enc, disabled_mac, disabled_ssl;
    1472                 :            :         STACK_OF(SSL_CIPHER) *cipherstack, *tmp_cipher_list;
    1473                 :            :         const char *rule_p;
    1474                 :       2428 :         CIPHER_ORDER *co_list = NULL, *head = NULL, *tail = NULL, *curr;
    1475                 :       2428 :         const SSL_CIPHER **ca_list = NULL;
    1476                 :            : 
    1477                 :            :         /*
    1478                 :            :          * Return with error if nothing to do.
    1479                 :            :          */
    1480 [ +  - ][ +  - ]:       2428 :         if (rule_str == NULL || cipher_list == NULL || cipher_list_by_id == NULL)
    1481                 :            :                 return NULL;
    1482                 :            : #ifndef OPENSSL_NO_EC
    1483         [ +  - ]:       2428 :         if (!check_suiteb_cipher_list(ssl_method, c, &rule_str))
    1484                 :            :                 return NULL;
    1485                 :            : #endif
    1486                 :            : 
    1487                 :            :         /*
    1488                 :            :          * To reduce the work to do we only want to process the compiled
    1489                 :            :          * in algorithms, so we first get the mask of disabled ciphers.
    1490                 :            :          */
    1491                 :       2428 :         ssl_cipher_get_disabled(&disabled_mkey, &disabled_auth, &disabled_enc, &disabled_mac, &disabled_ssl);
    1492                 :            : 
    1493                 :            :         /*
    1494                 :            :          * Now we have to collect the available ciphers from the compiled
    1495                 :            :          * in ciphers. We cannot get more than the number compiled in, so
    1496                 :            :          * it is used for allocation.
    1497                 :            :          */
    1498                 :       2428 :         num_of_ciphers = ssl_method->num_ciphers();
    1499                 :            : #ifdef KSSL_DEBUG
    1500                 :            :         printf("ssl_create_cipher_list() for %d ciphers\n", num_of_ciphers);
    1501                 :            : #endif    /* KSSL_DEBUG */
    1502                 :       2428 :         co_list = (CIPHER_ORDER *)OPENSSL_malloc(sizeof(CIPHER_ORDER) * num_of_ciphers);
    1503         [ -  + ]:       2428 :         if (co_list == NULL)
    1504                 :            :                 {
    1505                 :          0 :                 SSLerr(SSL_F_SSL_CREATE_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
    1506                 :          0 :                 return(NULL);   /* Failure */
    1507                 :            :                 }
    1508                 :            : 
    1509                 :       2428 :         ssl_cipher_collect_ciphers(ssl_method, num_of_ciphers,
    1510                 :            :                                    disabled_mkey, disabled_auth, disabled_enc, disabled_mac, disabled_ssl,
    1511                 :            :                                    co_list, &head, &tail);
    1512                 :            : 
    1513                 :            : 
    1514                 :            :         /* Now arrange all ciphers by preference: */
    1515                 :            : 
    1516                 :            :         /* Everything else being equal, prefer ephemeral ECDH over other key exchange mechanisms */
    1517                 :       2428 :         ssl_cipher_apply_rule(0, SSL_kECDHE, 0, 0, 0, 0, 0, CIPHER_ADD, -1, &head, &tail);
    1518                 :       2428 :         ssl_cipher_apply_rule(0, SSL_kECDHE, 0, 0, 0, 0, 0, CIPHER_DEL, -1, &head, &tail);
    1519                 :            : 
    1520                 :            :         /* AES is our preferred symmetric cipher */
    1521                 :       2428 :         ssl_cipher_apply_rule(0, 0, 0, SSL_AES, 0, 0, 0, CIPHER_ADD, -1, &head, &tail);
    1522                 :            : 
    1523                 :            :         /* Temporarily enable everything else for sorting */
    1524                 :       2428 :         ssl_cipher_apply_rule(0, 0, 0, 0, 0, 0, 0, CIPHER_ADD, -1, &head, &tail);
    1525                 :            : 
    1526                 :            :         /* Low priority for MD5 */
    1527                 :       2428 :         ssl_cipher_apply_rule(0, 0, 0, 0, SSL_MD5, 0, 0, CIPHER_ORD, -1, &head, &tail);
    1528                 :            : 
    1529                 :            :         /* Move anonymous ciphers to the end.  Usually, these will remain disabled.
    1530                 :            :          * (For applications that allow them, they aren't too bad, but we prefer
    1531                 :            :          * authenticated ciphers.) */
    1532                 :       2428 :         ssl_cipher_apply_rule(0, 0, SSL_aNULL, 0, 0, 0, 0, CIPHER_ORD, -1, &head, &tail);
    1533                 :            : 
    1534                 :            :         /* Move ciphers without forward secrecy to the end */
    1535                 :       2428 :         ssl_cipher_apply_rule(0, 0, SSL_aECDH, 0, 0, 0, 0, CIPHER_ORD, -1, &head, &tail);
    1536                 :            :         /* ssl_cipher_apply_rule(0, 0, SSL_aDH, 0, 0, 0, 0, CIPHER_ORD, -1, &head, &tail); */
    1537                 :       2428 :         ssl_cipher_apply_rule(0, SSL_kRSA, 0, 0, 0, 0, 0, CIPHER_ORD, -1, &head, &tail);
    1538                 :       2428 :         ssl_cipher_apply_rule(0, SSL_kPSK, 0,0, 0, 0, 0, CIPHER_ORD, -1, &head, &tail);
    1539                 :       2428 :         ssl_cipher_apply_rule(0, SSL_kKRB5, 0,0, 0, 0, 0, CIPHER_ORD, -1, &head, &tail);
    1540                 :            : 
    1541                 :            :         /* RC4 is sort-of broken -- move the the end */
    1542                 :       2428 :         ssl_cipher_apply_rule(0, 0, 0, SSL_RC4, 0, 0, 0, CIPHER_ORD, -1, &head, &tail);
    1543                 :            : 
    1544                 :            :         /* Now sort by symmetric encryption strength.  The above ordering remains
    1545                 :            :          * in force within each class */
    1546         [ -  + ]:       2428 :         if (!ssl_cipher_strength_sort(&head, &tail))
    1547                 :            :                 {
    1548                 :          0 :                 OPENSSL_free(co_list);
    1549                 :          0 :                 return NULL;
    1550                 :            :                 }
    1551                 :            : 
    1552                 :            :         /* Now disable everything (maintaining the ordering!) */
    1553                 :       2428 :         ssl_cipher_apply_rule(0, 0, 0, 0, 0, 0, 0, CIPHER_DEL, -1, &head, &tail);
    1554                 :            : 
    1555                 :            : 
    1556                 :            :         /*
    1557                 :            :          * We also need cipher aliases for selecting based on the rule_str.
    1558                 :            :          * There might be two types of entries in the rule_str: 1) names
    1559                 :            :          * of ciphers themselves 2) aliases for groups of ciphers.
    1560                 :            :          * For 1) we need the available ciphers and for 2) the cipher
    1561                 :            :          * groups of cipher_aliases added together in one list (otherwise
    1562                 :            :          * we would be happy with just the cipher_aliases table).
    1563                 :            :          */
    1564                 :       2428 :         num_of_group_aliases = sizeof(cipher_aliases) / sizeof(SSL_CIPHER);
    1565                 :       2428 :         num_of_alias_max = num_of_ciphers + num_of_group_aliases + 1;
    1566                 :       2428 :         ca_list = OPENSSL_malloc(sizeof(SSL_CIPHER *) * num_of_alias_max);
    1567         [ -  + ]:       2428 :         if (ca_list == NULL)
    1568                 :            :                 {
    1569                 :          0 :                 OPENSSL_free(co_list);
    1570                 :          0 :                 SSLerr(SSL_F_SSL_CREATE_CIPHER_LIST,ERR_R_MALLOC_FAILURE);
    1571                 :          0 :                 return(NULL);   /* Failure */
    1572                 :            :                 }
    1573                 :       2428 :         ssl_cipher_collect_aliases(ca_list, num_of_group_aliases,
    1574                 :            :                                    disabled_mkey, disabled_auth, disabled_enc,
    1575                 :            :                                    disabled_mac, disabled_ssl, head);
    1576                 :            : 
    1577                 :            :         /*
    1578                 :            :          * If the rule_string begins with DEFAULT, apply the default rule
    1579                 :            :          * before using the (possibly available) additional rules.
    1580                 :            :          */
    1581                 :       2428 :         ok = 1;
    1582                 :       2428 :         rule_p = rule_str;
    1583         [ -  + ]:       2428 :         if (strncmp(rule_str,"DEFAULT",7) == 0)
    1584                 :            :                 {
    1585                 :          0 :                 ok = ssl_cipher_process_rulestr(SSL_DEFAULT_CIPHER_LIST,
    1586                 :            :                         &head, &tail, ca_list, c);
    1587                 :          0 :                 rule_p += 7;
    1588         [ #  # ]:          0 :                 if (*rule_p == ':')
    1589                 :          0 :                         rule_p++;
    1590                 :            :                 }
    1591                 :            : 
    1592 [ +  - ][ +  - ]:       2428 :         if (ok && (strlen(rule_p) > 0))
    1593                 :       2428 :                 ok = ssl_cipher_process_rulestr(rule_p, &head, &tail, ca_list, c);
    1594                 :            : 
    1595                 :       2428 :         OPENSSL_free((void *)ca_list);  /* Not needed anymore */
    1596                 :            : 
    1597         [ -  + ]:       2428 :         if (!ok)
    1598                 :            :                 {       /* Rule processing failure */
    1599                 :          0 :                 OPENSSL_free(co_list);
    1600                 :          0 :                 return(NULL);
    1601                 :            :                 }
    1602                 :            :         
    1603                 :            :         /*
    1604                 :            :          * Allocate new "cipherstack" for the result, return with error
    1605                 :            :          * if we cannot get one.
    1606                 :            :          */
    1607         [ -  + ]:       2428 :         if ((cipherstack = sk_SSL_CIPHER_new_null()) == NULL)
    1608                 :            :                 {
    1609                 :          0 :                 OPENSSL_free(co_list);
    1610                 :          0 :                 return(NULL);
    1611                 :            :                 }
    1612                 :            : 
    1613                 :            :         /*
    1614                 :            :          * The cipher selection for the list is done. The ciphers are added
    1615                 :            :          * to the resulting precedence to the STACK_OF(SSL_CIPHER).
    1616                 :            :          */
    1617         [ +  + ]:     282576 :         for (curr = head; curr != NULL; curr = curr->next)
    1618                 :            :                 {
    1619                 :            : #ifdef OPENSSL_FIPS
    1620                 :            :                 if (curr->active && (!FIPS_mode() || curr->cipher->algo_strength & SSL_FIPS))
    1621                 :            : #else
    1622         [ +  + ]:     280148 :                 if (curr->active)
    1623                 :            : #endif
    1624                 :            :                         {
    1625                 :     188782 :                         sk_SSL_CIPHER_push(cipherstack, curr->cipher);
    1626                 :            : #ifdef CIPHER_DEBUG
    1627                 :            :                         printf("<%s>\n",curr->cipher->name);
    1628                 :            : #endif
    1629                 :            :                         }
    1630                 :            :                 }
    1631                 :       2428 :         OPENSSL_free(co_list);  /* Not needed any longer */
    1632                 :            : 
    1633                 :       2428 :         tmp_cipher_list = sk_SSL_CIPHER_dup(cipherstack);
    1634         [ -  + ]:       2428 :         if (tmp_cipher_list == NULL)
    1635                 :            :                 {
    1636                 :          0 :                 sk_SSL_CIPHER_free(cipherstack);
    1637                 :          0 :                 return NULL;
    1638                 :            :                 }
    1639         [ +  + ]:       2428 :         if (*cipher_list != NULL)
    1640                 :        620 :                 sk_SSL_CIPHER_free(*cipher_list);
    1641                 :       2428 :         *cipher_list = cipherstack;
    1642         [ +  + ]:       2428 :         if (*cipher_list_by_id != NULL)
    1643                 :        620 :                 sk_SSL_CIPHER_free(*cipher_list_by_id);
    1644                 :       2428 :         *cipher_list_by_id = tmp_cipher_list;
    1645                 :       2428 :         (void)sk_SSL_CIPHER_set_cmp_func(*cipher_list_by_id,ssl_cipher_ptr_id_cmp);
    1646                 :            : 
    1647                 :       2428 :         sk_SSL_CIPHER_sort(*cipher_list_by_id);
    1648                 :       2428 :         return(cipherstack);
    1649                 :            :         }
    1650                 :            : 
    1651                 :          0 : char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len)
    1652                 :            :         {
    1653                 :            :         int is_export,pkl,kl;
    1654                 :            :         const char *ver,*exp_str;
    1655                 :            :         const char *kx,*au,*enc,*mac;
    1656                 :            :         unsigned long alg_mkey,alg_auth,alg_enc,alg_mac,alg_ssl,alg2;
    1657                 :            : #ifdef KSSL_DEBUG
    1658                 :            :         static const char *format="%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s AL=%lx/%lx/%lx/%lx/%lx\n";
    1659                 :            : #else
    1660                 :            :         static const char *format="%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s\n";
    1661                 :            : #endif /* KSSL_DEBUG */
    1662                 :            : 
    1663                 :          0 :         alg_mkey = cipher->algorithm_mkey;
    1664                 :          0 :         alg_auth = cipher->algorithm_auth;
    1665                 :          0 :         alg_enc = cipher->algorithm_enc;
    1666                 :          0 :         alg_mac = cipher->algorithm_mac;
    1667                 :          0 :         alg_ssl = cipher->algorithm_ssl;
    1668                 :            : 
    1669                 :          0 :         alg2=cipher->algorithm2;
    1670                 :            : 
    1671                 :          0 :         is_export=SSL_C_IS_EXPORT(cipher);
    1672         [ #  # ]:          0 :         pkl=SSL_C_EXPORT_PKEYLENGTH(cipher);
    1673 [ #  # ][ #  # ]:          0 :         kl=SSL_C_EXPORT_KEYLENGTH(cipher);
    1674         [ #  # ]:          0 :         exp_str=is_export?" export":"";
    1675                 :            :         
    1676         [ #  # ]:          0 :         if (alg_ssl & SSL_SSLV2)
    1677                 :            :                 ver="SSLv2";
    1678         [ #  # ]:          0 :         else if (alg_ssl & SSL_SSLV3)
    1679                 :            :                 ver="SSLv3";
    1680         [ #  # ]:          0 :         else if (alg_ssl & SSL_TLSV1_2)
    1681                 :            :                 ver="TLSv1.2";
    1682                 :            :         else
    1683                 :          0 :                 ver="unknown";
    1684                 :            : 
    1685   [ #  #  #  #  :          0 :         switch (alg_mkey)
          #  #  #  #  #  
                #  #  # ]
    1686                 :            :                 {
    1687                 :            :         case SSL_kRSA:
    1688 [ #  # ][ #  # ]:          0 :                 kx=is_export?(pkl == 512 ? "RSA(512)" : "RSA(1024)"):"RSA";
    1689                 :          0 :                 break;
    1690                 :            :         case SSL_kDHr:
    1691                 :            :                 kx="DH/RSA";
    1692                 :            :                 break;
    1693                 :            :         case SSL_kDHd:
    1694                 :          0 :                 kx="DH/DSS";
    1695                 :          0 :                 break;
    1696                 :            :         case SSL_kKRB5:
    1697                 :          0 :                 kx="KRB5";
    1698                 :          0 :                 break;
    1699                 :            :         case SSL_kDHE:
    1700 [ #  # ][ #  # ]:          0 :                 kx=is_export?(pkl == 512 ? "DH(512)" : "DH(1024)"):"DH";
    1701                 :          0 :                 break;
    1702                 :            :         case SSL_kECDHr:
    1703                 :          0 :                 kx="ECDH/RSA";
    1704                 :          0 :                 break;
    1705                 :            :         case SSL_kECDHe:
    1706                 :          0 :                 kx="ECDH/ECDSA";
    1707                 :          0 :                 break;
    1708                 :            :         case SSL_kECDHE:
    1709                 :          0 :                 kx="ECDH";
    1710                 :          0 :                 break;
    1711                 :            :         case SSL_kPSK:
    1712                 :          0 :                 kx="PSK";
    1713                 :          0 :                 break;
    1714                 :            :         case SSL_kSRP:
    1715                 :          0 :                 kx="SRP";
    1716                 :          0 :                 break;
    1717                 :            :         case SSL_kGOST:
    1718                 :          0 :                 kx="GOST";
    1719                 :          0 :                 break;
    1720                 :            :         default:
    1721                 :          0 :                 kx="unknown";
    1722                 :            :                 }
    1723                 :            : 
    1724   [ #  #  #  #  :          0 :         switch (alg_auth)
          #  #  #  #  #  
                #  #  # ]
    1725                 :            :                 {
    1726                 :            :         case SSL_aRSA:
    1727                 :            :                 au="RSA";
    1728                 :            :                 break;
    1729                 :            :         case SSL_aDSS:
    1730                 :          0 :                 au="DSS";
    1731                 :          0 :                 break;
    1732                 :            :         case SSL_aDH:
    1733                 :          0 :                 au="DH";
    1734                 :          0 :                 break;
    1735                 :            :         case SSL_aKRB5:
    1736                 :          0 :                 au="KRB5";
    1737                 :          0 :                 break;
    1738                 :            :         case SSL_aECDH:
    1739                 :          0 :                 au="ECDH";
    1740                 :          0 :                 break;
    1741                 :            :         case SSL_aNULL:
    1742                 :          0 :                 au="None";
    1743                 :          0 :                 break;
    1744                 :            :         case SSL_aECDSA:
    1745                 :          0 :                 au="ECDSA";
    1746                 :          0 :                 break;
    1747                 :            :         case SSL_aPSK:
    1748                 :          0 :                 au="PSK";
    1749                 :          0 :                 break;
    1750                 :            :         case SSL_aSRP:
    1751                 :          0 :                 au="SRP";
    1752                 :          0 :                 break;
    1753                 :            :         case SSL_aGOST94:
    1754                 :          0 :                 au="GOST94";
    1755                 :          0 :                 break;
    1756                 :            :         case SSL_aGOST01:
    1757                 :          0 :                 au="GOST01";
    1758                 :          0 :                 break;
    1759                 :            :         default:
    1760                 :          0 :                 au="unknown";
    1761                 :          0 :                 break;
    1762                 :            :                 }
    1763                 :            : 
    1764   [ #  #  #  #  :          0 :         switch (alg_enc)
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    1765                 :            :                 {
    1766                 :            :         case SSL_DES:
    1767         [ #  # ]:          0 :                 enc=(is_export && kl == 5)?"DES(40)":"DES(56)";
    1768                 :          0 :                 break;
    1769                 :            :         case SSL_3DES:
    1770                 :            :                 enc="3DES(168)";
    1771                 :            :                 break;
    1772                 :            :         case SSL_RC4:
    1773                 :          0 :                 enc=is_export?(kl == 5 ? "RC4(40)" : "RC4(56)")
    1774 [ #  # ][ #  # ]:          0 :                   :((alg2&SSL2_CF_8_BYTE_ENC)?"RC4(64)":"RC4(128)");
                 [ #  # ]
    1775                 :          0 :                 break;
    1776                 :            :         case SSL_RC2:
    1777 [ #  # ][ #  # ]:          0 :                 enc=is_export?(kl == 5 ? "RC2(40)" : "RC2(56)"):"RC2(128)";
    1778                 :          0 :                 break;
    1779                 :            :         case SSL_IDEA:
    1780                 :          0 :                 enc="IDEA(128)";
    1781                 :          0 :                 break;
    1782                 :            :         case SSL_eNULL:
    1783                 :          0 :                 enc="None";
    1784                 :          0 :                 break;
    1785                 :            :         case SSL_AES128:
    1786                 :          0 :                 enc="AES(128)";
    1787                 :          0 :                 break;
    1788                 :            :         case SSL_AES256:
    1789                 :          0 :                 enc="AES(256)";
    1790                 :          0 :                 break;
    1791                 :            :         case SSL_AES128GCM:
    1792                 :          0 :                 enc="AESGCM(128)";
    1793                 :          0 :                 break;
    1794                 :            :         case SSL_AES256GCM:
    1795                 :          0 :                 enc="AESGCM(256)";
    1796                 :          0 :                 break;
    1797                 :            :         case SSL_CAMELLIA128:
    1798                 :          0 :                 enc="Camellia(128)";
    1799                 :          0 :                 break;
    1800                 :            :         case SSL_CAMELLIA256:
    1801                 :          0 :                 enc="Camellia(256)";
    1802                 :          0 :                 break;
    1803                 :            :         case SSL_SEED:
    1804                 :          0 :                 enc="SEED(128)";
    1805                 :          0 :                 break;
    1806                 :            :         case SSL_eGOST2814789CNT:
    1807                 :          0 :                 enc="GOST89(256)";
    1808                 :          0 :                 break;
    1809                 :            :         default:
    1810                 :          0 :                 enc="unknown";
    1811                 :          0 :                 break;
    1812                 :            :                 }
    1813                 :            : 
    1814   [ #  #  #  #  :          0 :         switch (alg_mac)
             #  #  #  # ]
    1815                 :            :                 {
    1816                 :            :         case SSL_MD5:
    1817                 :            :                 mac="MD5";
    1818                 :            :                 break;
    1819                 :            :         case SSL_SHA1:
    1820                 :          0 :                 mac="SHA1";
    1821                 :          0 :                 break;
    1822                 :            :         case SSL_SHA256:
    1823                 :          0 :                 mac="SHA256";
    1824                 :          0 :                 break;
    1825                 :            :         case SSL_SHA384:
    1826                 :          0 :                 mac="SHA384";
    1827                 :          0 :                 break;
    1828                 :            :         case SSL_AEAD:
    1829                 :          0 :                 mac="AEAD";
    1830                 :          0 :                 break;
    1831                 :            :         case SSL_GOST89MAC:
    1832                 :          0 :                 mac="GOST89";
    1833                 :          0 :                 break;
    1834                 :            :         case SSL_GOST94:
    1835                 :          0 :                 mac="GOST94";
    1836                 :          0 :                 break;
    1837                 :            :         default:
    1838                 :          0 :                 mac="unknown";
    1839                 :          0 :                 break;
    1840                 :            :                 }
    1841                 :            : 
    1842         [ #  # ]:          0 :         if (buf == NULL)
    1843                 :            :                 {
    1844                 :          0 :                 len=128;
    1845                 :          0 :                 buf=OPENSSL_malloc(len);
    1846         [ #  # ]:          0 :                 if (buf == NULL) return("OPENSSL_malloc Error");
    1847                 :            :                 }
    1848         [ #  # ]:          0 :         else if (len < 128)
    1849                 :            :                 return("Buffer too small");
    1850                 :            : 
    1851                 :            : #ifdef KSSL_DEBUG
    1852                 :            :         BIO_snprintf(buf,len,format,cipher->name,ver,kx,au,enc,mac,exp_str,alg_mkey,alg_auth,alg_enc,alg_mac,alg_ssl);
    1853                 :            : #else
    1854                 :          0 :         BIO_snprintf(buf,len,format,cipher->name,ver,kx,au,enc,mac,exp_str);
    1855                 :            : #endif /* KSSL_DEBUG */
    1856                 :          0 :         return(buf);
    1857                 :            :         }
    1858                 :            : 
    1859                 :       1190 : char *SSL_CIPHER_get_version(const SSL_CIPHER *c)
    1860                 :            :         {
    1861                 :            :         int i;
    1862                 :            : 
    1863         [ +  + ]:       1190 :         if (c == NULL) return("(NONE)");
    1864                 :       1168 :         i=(int)(c->id>>24L);
    1865         [ +  + ]:       1168 :         if (i == 3)
    1866                 :            :                 return("TLSv1/SSLv3");
    1867         [ -  + ]:        110 :         else if (i == 2)
    1868                 :            :                 return("SSLv2");
    1869                 :            :         else
    1870                 :          0 :                 return("unknown");
    1871                 :            :         }
    1872                 :            : 
    1873                 :            : /* return the actual cipher being used */
    1874                 :       1432 : const char *SSL_CIPHER_get_name(const SSL_CIPHER *c)
    1875                 :            :         {
    1876         [ +  + ]:       1432 :         if (c != NULL)
    1877                 :       1410 :                 return(c->name);
    1878                 :            :         return("(NONE)");
    1879                 :            :         }
    1880                 :            : 
    1881                 :            : /* number of bits for symmetric cipher */
    1882                 :          0 : int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits)
    1883                 :            :         {
    1884                 :          0 :         int ret=0;
    1885                 :            : 
    1886         [ #  # ]:          0 :         if (c != NULL)
    1887                 :            :                 {
    1888         [ #  # ]:          0 :                 if (alg_bits != NULL) *alg_bits = c->alg_bits;
    1889                 :          0 :                 ret = c->strength_bits;
    1890                 :            :                 }
    1891                 :          0 :         return(ret);
    1892                 :            :         }
    1893                 :            : 
    1894                 :          0 : unsigned long SSL_CIPHER_get_id(const SSL_CIPHER *c)
    1895                 :            :         {
    1896                 :          0 :         return c->id;
    1897                 :            :         }
    1898                 :            : 
    1899                 :          0 : SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n)
    1900                 :            :         {
    1901                 :            :         SSL_COMP *ctmp;
    1902                 :            :         int i,nn;
    1903                 :            : 
    1904         [ #  # ]:          0 :         if ((n == 0) || (sk == NULL)) return(NULL);
    1905                 :          0 :         nn=sk_SSL_COMP_num(sk);
    1906         [ #  # ]:          0 :         for (i=0; i<nn; i++)
    1907                 :            :                 {
    1908                 :          0 :                 ctmp=sk_SSL_COMP_value(sk,i);
    1909         [ #  # ]:          0 :                 if (ctmp->id == n)
    1910                 :            :                         return(ctmp);
    1911                 :            :                 }
    1912                 :            :         return(NULL);
    1913                 :            :         }
    1914                 :            : 
    1915                 :            : #ifdef OPENSSL_NO_COMP
    1916                 :            : void *SSL_COMP_get_compression_methods(void)
    1917                 :            :         {
    1918                 :            :         return NULL;
    1919                 :            :         }
    1920                 :            : int SSL_COMP_add_compression_method(int id, void *cm)
    1921                 :            :         {
    1922                 :            :         return 1;
    1923                 :            :         }
    1924                 :            : 
    1925                 :            : const char *SSL_COMP_get_name(const void *comp)
    1926                 :            :         {
    1927                 :            :         return NULL;
    1928                 :            :         }
    1929                 :            : #else
    1930                 :       3670 : STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
    1931                 :            :         {
    1932                 :       3670 :         load_builtin_compressions();
    1933                 :       3670 :         return(ssl_comp_methods);
    1934                 :            :         }
    1935                 :            : 
    1936                 :          0 : STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP) *meths)
    1937                 :            :         {
    1938                 :          0 :         STACK_OF(SSL_COMP) *old_meths = ssl_comp_methods;
    1939                 :          0 :         ssl_comp_methods = meths;
    1940                 :          0 :         return old_meths;
    1941                 :            :         }
    1942                 :            : 
    1943                 :          0 : static void cmeth_free(SSL_COMP *cm)
    1944                 :            :         {
    1945                 :          0 :         OPENSSL_free(cm);
    1946                 :          0 :         }
    1947                 :            : 
    1948                 :          0 : void SSL_COMP_free_compression_methods(void)
    1949                 :            :         {
    1950                 :          0 :         STACK_OF(SSL_COMP) *old_meths = ssl_comp_methods;
    1951                 :          0 :         ssl_comp_methods = NULL;
    1952                 :          0 :         sk_SSL_COMP_pop_free(old_meths, cmeth_free);
    1953                 :          0 :         }
    1954                 :            : 
    1955                 :          0 : int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm)
    1956                 :            :         {
    1957                 :            :         SSL_COMP *comp;
    1958                 :            : 
    1959 [ #  # ][ #  # ]:          0 :         if (cm == NULL || cm->type == NID_undef)
    1960                 :            :                 return 1;
    1961                 :            : 
    1962                 :            :         /* According to draft-ietf-tls-compression-04.txt, the
    1963                 :            :            compression number ranges should be the following:
    1964                 :            : 
    1965                 :            :            0 to 63:    methods defined by the IETF
    1966                 :            :            64 to 192:  external party methods assigned by IANA
    1967                 :            :            193 to 255: reserved for private use */
    1968         [ #  # ]:          0 :         if (id < 193 || id > 255)
    1969                 :            :                 {
    1970                 :          0 :                 SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE);
    1971                 :          0 :                 return 0;
    1972                 :            :                 }
    1973                 :            : 
    1974                 :          0 :         MemCheck_off();
    1975                 :          0 :         comp=(SSL_COMP *)OPENSSL_malloc(sizeof(SSL_COMP));
    1976                 :          0 :         comp->id=id;
    1977                 :          0 :         comp->method=cm;
    1978                 :          0 :         load_builtin_compressions();
    1979         [ #  # ]:          0 :         if (ssl_comp_methods
    1980         [ #  # ]:          0 :                 && sk_SSL_COMP_find(ssl_comp_methods,comp) >= 0)
    1981                 :            :                 {
    1982                 :          0 :                 OPENSSL_free(comp);
    1983                 :          0 :                 MemCheck_on();
    1984                 :          0 :                 SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,SSL_R_DUPLICATE_COMPRESSION_ID);
    1985                 :          0 :                 return(1);
    1986                 :            :                 }
    1987         [ #  # ]:          0 :         else if ((ssl_comp_methods == NULL)
    1988         [ #  # ]:          0 :                 || !sk_SSL_COMP_push(ssl_comp_methods,comp))
    1989                 :            :                 {
    1990                 :          0 :                 OPENSSL_free(comp);
    1991                 :          0 :                 MemCheck_on();
    1992                 :          0 :                 SSLerr(SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD,ERR_R_MALLOC_FAILURE);
    1993                 :          0 :                 return(1);
    1994                 :            :                 }
    1995                 :            :         else
    1996                 :            :                 {
    1997                 :          0 :                 MemCheck_on();
    1998                 :          0 :                 return(0);
    1999                 :            :                 }
    2000                 :            :         }
    2001                 :            : 
    2002                 :          0 : const char *SSL_COMP_get_name(const COMP_METHOD *comp)
    2003                 :            :         {
    2004         [ #  # ]:          0 :         if (comp)
    2005                 :          0 :                 return comp->name;
    2006                 :            :         return NULL;
    2007                 :            :         }
    2008                 :            : #endif
    2009                 :            : /* For a cipher return the index corresponding to the certificate type */
    2010                 :       1940 : int ssl_cipher_get_cert_index(const SSL_CIPHER *c)
    2011                 :            :         {
    2012                 :            :         unsigned long alg_k, alg_a;
    2013                 :            : 
    2014                 :       1940 :         alg_k = c->algorithm_mkey;
    2015                 :       1940 :         alg_a = c->algorithm_auth;
    2016                 :            : 
    2017         [ +  - ]:       1940 :         if (alg_k & (SSL_kECDHr|SSL_kECDHe))
    2018                 :            :                 {
    2019                 :            :                 /* we don't need to look at SSL_kECDHE
    2020                 :            :                  * since no certificate is needed for
    2021                 :            :                  * anon ECDH and for authenticated
    2022                 :            :                  * ECDHE, the check for the auth
    2023                 :            :                  * algorithm will set i correctly
    2024                 :            :                  * NOTE: For ECDH-RSA, we need an ECC
    2025                 :            :                  * not an RSA cert but for ECDHE-RSA
    2026                 :            :                  * we need an RSA cert. Placing the
    2027                 :            :                  * checks for SSL_kECDH before RSA
    2028                 :            :                  * checks ensures the correct cert is chosen.
    2029                 :            :                  */
    2030                 :            :                 return SSL_PKEY_ECC;
    2031                 :            :                 }
    2032         [ +  - ]:       1940 :         else if (alg_a & SSL_aECDSA)
    2033                 :            :                 return SSL_PKEY_ECC;
    2034         [ +  - ]:       1940 :         else if (alg_k & SSL_kDHr)
    2035                 :            :                 return SSL_PKEY_DH_RSA;
    2036         [ +  - ]:       1940 :         else if (alg_k & SSL_kDHd)
    2037                 :            :                 return SSL_PKEY_DH_DSA;
    2038         [ +  - ]:       1940 :         else if (alg_a & SSL_aDSS)
    2039                 :            :                 return SSL_PKEY_DSA_SIGN;
    2040         [ -  + ]:       1940 :         else if (alg_a & SSL_aRSA)
    2041                 :            :                 return SSL_PKEY_RSA_ENC;
    2042         [ #  # ]:          0 :         else if (alg_a & SSL_aKRB5)
    2043                 :            :                 /* VRS something else here? */
    2044                 :            :                 return -1;
    2045         [ #  # ]:          0 :         else if (alg_a & SSL_aGOST94) 
    2046                 :            :                 return SSL_PKEY_GOST94;
    2047         [ #  # ]:          0 :         else if (alg_a & SSL_aGOST01)
    2048                 :            :                 return SSL_PKEY_GOST01;
    2049                 :          0 :         return -1;
    2050                 :            :         }
    2051                 :            : 
    2052                 :      57721 : const SSL_CIPHER *ssl_get_cipher_by_char(SSL *ssl, const unsigned char *ptr)
    2053                 :            :         {
    2054                 :            :         const SSL_CIPHER *c;
    2055                 :      57721 :         c = ssl->method->get_cipher_by_char(ptr);
    2056 [ +  - ][ +  - ]:      57721 :         if (c == NULL || c->valid == 0)
    2057                 :            :                 return NULL;
    2058                 :      57721 :         return c;
    2059                 :            :         }
    2060                 :            : 
    2061                 :          0 : const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr)
    2062                 :            :         {
    2063                 :          0 :         return ssl->method->get_cipher_by_char(ptr);
    2064                 :            :         }

Generated by: LCOV version 1.9