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