LCOV - code coverage report
Current view: top level - third_party/openssl/ssl - ssl_ciph.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 429 677 63.4 %
Date: 2015-10-10 Functions: 18 31 58.1 %

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

Generated by: LCOV version 1.10