LCOV - code coverage report
Current view: top level - third_party/openssl/ssl - s3_enc.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 45 341 13.2 %
Date: 2015-10-10 Functions: 5 16 31.2 %

          Line data    Source code
       1             : /* ssl/s3_enc.c */
       2             : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       3             :  * All rights reserved.
       4             :  *
       5             :  * This package is an SSL implementation written
       6             :  * by Eric Young (eay@cryptsoft.com).
       7             :  * The implementation was written so as to conform with Netscapes SSL.
       8             :  *
       9             :  * This library is free for commercial and non-commercial use as long as
      10             :  * the following conditions are aheared to.  The following conditions
      11             :  * apply to all code found in this distribution, be it the RC4, RSA,
      12             :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      13             :  * included with this distribution is covered by the same copyright terms
      14             :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      15             :  *
      16             :  * Copyright remains Eric Young's, and as such any Copyright notices in
      17             :  * the code are not to be removed.
      18             :  * If this package is used in a product, Eric Young should be given attribution
      19             :  * as the author of the parts of the library used.
      20             :  * This can be in the form of a textual message at program startup or
      21             :  * in documentation (online or textual) provided with the package.
      22             :  *
      23             :  * Redistribution and use in source and binary forms, with or without
      24             :  * modification, are permitted provided that the following conditions
      25             :  * are met:
      26             :  * 1. Redistributions of source code must retain the copyright
      27             :  *    notice, this list of conditions and the following disclaimer.
      28             :  * 2. Redistributions in binary form must reproduce the above copyright
      29             :  *    notice, this list of conditions and the following disclaimer in the
      30             :  *    documentation and/or other materials provided with the distribution.
      31             :  * 3. All advertising materials mentioning features or use of this software
      32             :  *    must display the following acknowledgement:
      33             :  *    "This product includes cryptographic software written by
      34             :  *     Eric Young (eay@cryptsoft.com)"
      35             :  *    The word 'cryptographic' can be left out if the rouines from the library
      36             :  *    being used are not cryptographic related :-).
      37             :  * 4. If you include any Windows specific code (or a derivative thereof) from
      38             :  *    the apps directory (application code) you must include an acknowledgement:
      39             :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      40             :  *
      41             :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      42             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      43             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      44             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      45             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      46             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      47             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      49             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      50             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      51             :  * SUCH DAMAGE.
      52             :  *
      53             :  * The licence and distribution terms for any publically available version or
      54             :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
      55             :  * copied and put under another distribution licence
      56             :  * [including the GNU Public Licence.]
      57             :  */
      58             : /* ====================================================================
      59             :  * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
      60             :  *
      61             :  * Redistribution and use in source and binary forms, with or without
      62             :  * modification, are permitted provided that the following conditions
      63             :  * are met:
      64             :  *
      65             :  * 1. Redistributions of source code must retain the above copyright
      66             :  *    notice, this list of conditions and the following disclaimer.
      67             :  *
      68             :  * 2. Redistributions in binary form must reproduce the above copyright
      69             :  *    notice, this list of conditions and the following disclaimer in
      70             :  *    the documentation and/or other materials provided with the
      71             :  *    distribution.
      72             :  *
      73             :  * 3. All advertising materials mentioning features or use of this
      74             :  *    software must display the following acknowledgment:
      75             :  *    "This product includes software developed by the OpenSSL Project
      76             :  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
      77             :  *
      78             :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      79             :  *    endorse or promote products derived from this software without
      80             :  *    prior written permission. For written permission, please contact
      81             :  *    openssl-core@openssl.org.
      82             :  *
      83             :  * 5. Products derived from this software may not be called "OpenSSL"
      84             :  *    nor may "OpenSSL" appear in their names without prior written
      85             :  *    permission of the OpenSSL Project.
      86             :  *
      87             :  * 6. Redistributions of any form whatsoever must retain the following
      88             :  *    acknowledgment:
      89             :  *    "This product includes software developed by the OpenSSL Project
      90             :  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
      91             :  *
      92             :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      93             :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      94             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      95             :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      96             :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      97             :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      98             :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      99             :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     100             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     101             :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     102             :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     103             :  * OF THE POSSIBILITY OF SUCH DAMAGE.
     104             :  * ====================================================================
     105             :  *
     106             :  * This product includes cryptographic software written by Eric Young
     107             :  * (eay@cryptsoft.com).  This product includes software written by Tim
     108             :  * Hudson (tjh@cryptsoft.com).
     109             :  *
     110             :  */
     111             : /* ====================================================================
     112             :  * Copyright 2005 Nokia. All rights reserved.
     113             :  *
     114             :  * The portions of the attached software ("Contribution") is developed by
     115             :  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
     116             :  * license.
     117             :  *
     118             :  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
     119             :  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
     120             :  * support (see RFC 4279) to OpenSSL.
     121             :  *
     122             :  * No patent licenses or other rights except those expressly stated in
     123             :  * the OpenSSL open source license shall be deemed granted or received
     124             :  * expressly, by implication, estoppel, or otherwise.
     125             :  *
     126             :  * No assurances are provided by Nokia that the Contribution does not
     127             :  * infringe the patent or other intellectual property rights of any third
     128             :  * party or that the license provides you with all the necessary rights
     129             :  * to make use of the Contribution.
     130             :  *
     131             :  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
     132             :  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
     133             :  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
     134             :  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
     135             :  * OTHERWISE.
     136             :  */
     137             : 
     138             : #include <stdio.h>
     139             : #include "ssl_locl.h"
     140             : #include <openssl/evp.h>
     141             : #include <openssl/md5.h>
     142             : 
     143             : static unsigned char ssl3_pad_1[48] = {
     144             :     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
     145             :     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
     146             :     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
     147             :     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
     148             :     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
     149             :     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
     150             : };
     151             : 
     152             : static unsigned char ssl3_pad_2[48] = {
     153             :     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
     154             :     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
     155             :     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
     156             :     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
     157             :     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
     158             :     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
     159             : };
     160             : 
     161             : static int ssl3_handshake_mac(SSL *s, int md_nid,
     162             :                               const char *sender, int len, unsigned char *p);
     163           0 : static int ssl3_generate_key_block(SSL *s, unsigned char *km, int num)
     164             : {
     165             :     EVP_MD_CTX m5;
     166             :     EVP_MD_CTX s1;
     167             :     unsigned char buf[16], smd[SHA_DIGEST_LENGTH];
     168             :     unsigned char c = 'A';
     169             :     unsigned int i, j, k;
     170             : 
     171             : #ifdef CHARSET_EBCDIC
     172             :     c = os_toascii[c];          /* 'A' in ASCII */
     173             : #endif
     174             :     k = 0;
     175           0 :     EVP_MD_CTX_init(&m5);
     176           0 :     EVP_MD_CTX_set_flags(&m5, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
     177           0 :     EVP_MD_CTX_init(&s1);
     178           0 :     for (i = 0; (int)i < num; i += MD5_DIGEST_LENGTH) {
     179           0 :         k++;
     180           0 :         if (k > sizeof buf) {
     181             :             /* bug: 'buf' is too small for this ciphersuite */
     182           0 :             SSLerr(SSL_F_SSL3_GENERATE_KEY_BLOCK, ERR_R_INTERNAL_ERROR);
     183             :             return 0;
     184             :         }
     185             : 
     186           0 :         for (j = 0; j < k; j++)
     187           0 :             buf[j] = c;
     188           0 :         c++;
     189           0 :         EVP_DigestInit_ex(&s1, EVP_sha1(), NULL);
     190           0 :         EVP_DigestUpdate(&s1, buf, k);
     191           0 :         EVP_DigestUpdate(&s1, s->session->master_key,
     192           0 :                          s->session->master_key_length);
     193           0 :         EVP_DigestUpdate(&s1, s->s3->server_random, SSL3_RANDOM_SIZE);
     194           0 :         EVP_DigestUpdate(&s1, s->s3->client_random, SSL3_RANDOM_SIZE);
     195           0 :         EVP_DigestFinal_ex(&s1, smd, NULL);
     196             : 
     197           0 :         EVP_DigestInit_ex(&m5, EVP_md5(), NULL);
     198           0 :         EVP_DigestUpdate(&m5, s->session->master_key,
     199           0 :                          s->session->master_key_length);
     200           0 :         EVP_DigestUpdate(&m5, smd, SHA_DIGEST_LENGTH);
     201           0 :         if ((int)(i + MD5_DIGEST_LENGTH) > num) {
     202           0 :             EVP_DigestFinal_ex(&m5, smd, NULL);
     203           0 :             memcpy(km, smd, (num - i));
     204             :         } else
     205           0 :             EVP_DigestFinal_ex(&m5, km, NULL);
     206             : 
     207           0 :         km += MD5_DIGEST_LENGTH;
     208             :     }
     209           0 :     OPENSSL_cleanse(smd, SHA_DIGEST_LENGTH);
     210           0 :     EVP_MD_CTX_cleanup(&m5);
     211           0 :     EVP_MD_CTX_cleanup(&s1);
     212             :     return 1;
     213             : }
     214             : 
     215           0 : int ssl3_change_cipher_state(SSL *s, int which)
     216             : {
     217             :     unsigned char *p, *mac_secret;
     218             :     unsigned char exp_key[EVP_MAX_KEY_LENGTH];
     219             :     unsigned char exp_iv[EVP_MAX_IV_LENGTH];
     220             :     unsigned char *ms, *key, *iv, *er1, *er2;
     221             :     EVP_CIPHER_CTX *dd;
     222             :     const EVP_CIPHER *c;
     223             : #ifndef OPENSSL_NO_COMP
     224             :     COMP_METHOD *comp;
     225             : #endif
     226             :     const EVP_MD *m;
     227             :     EVP_MD_CTX md;
     228             :     int is_exp, n, i, j, k, cl;
     229             :     int reuse_dd = 0;
     230             : 
     231           0 :     is_exp = SSL_C_IS_EXPORT(s->s3->tmp.new_cipher);
     232           0 :     c = s->s3->tmp.new_sym_enc;
     233           0 :     m = s->s3->tmp.new_hash;
     234             :     /* m == NULL will lead to a crash later */
     235           0 :     OPENSSL_assert(m);
     236             : #ifndef OPENSSL_NO_COMP
     237           0 :     if (s->s3->tmp.new_compression == NULL)
     238             :         comp = NULL;
     239             :     else
     240           0 :         comp = s->s3->tmp.new_compression->method;
     241             : #endif
     242             : 
     243           0 :     if (which & SSL3_CC_READ) {
     244           0 :         if (s->enc_read_ctx != NULL)
     245             :             reuse_dd = 1;
     246           0 :         else if ((s->enc_read_ctx =
     247           0 :                   OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
     248             :             goto err;
     249             :         else
     250             :             /*
     251             :              * make sure it's intialized in case we exit later with an error
     252             :              */
     253           0 :             EVP_CIPHER_CTX_init(s->enc_read_ctx);
     254           0 :         dd = s->enc_read_ctx;
     255             : 
     256           0 :         ssl_replace_hash(&s->read_hash, m);
     257             : #ifndef OPENSSL_NO_COMP
     258             :         /* COMPRESS */
     259           0 :         if (s->expand != NULL) {
     260           0 :             COMP_CTX_free(s->expand);
     261           0 :             s->expand = NULL;
     262             :         }
     263           0 :         if (comp != NULL) {
     264           0 :             s->expand = COMP_CTX_new(comp);
     265           0 :             if (s->expand == NULL) {
     266           0 :                 SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,
     267             :                        SSL_R_COMPRESSION_LIBRARY_ERROR);
     268           0 :                 goto err2;
     269             :             }
     270           0 :             if (s->s3->rrec.comp == NULL)
     271           0 :                 s->s3->rrec.comp = (unsigned char *)
     272           0 :                     OPENSSL_malloc(SSL3_RT_MAX_PLAIN_LENGTH);
     273           0 :             if (s->s3->rrec.comp == NULL)
     274             :                 goto err;
     275             :         }
     276             : #endif
     277           0 :         memset(&(s->s3->read_sequence[0]), 0, 8);
     278           0 :         mac_secret = &(s->s3->read_mac_secret[0]);
     279             :     } else {
     280           0 :         if (s->enc_write_ctx != NULL)
     281             :             reuse_dd = 1;
     282           0 :         else if ((s->enc_write_ctx =
     283           0 :                   OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
     284             :             goto err;
     285             :         else
     286             :             /*
     287             :              * make sure it's intialized in case we exit later with an error
     288             :              */
     289           0 :             EVP_CIPHER_CTX_init(s->enc_write_ctx);
     290           0 :         dd = s->enc_write_ctx;
     291           0 :         ssl_replace_hash(&s->write_hash, m);
     292             : #ifndef OPENSSL_NO_COMP
     293             :         /* COMPRESS */
     294           0 :         if (s->compress != NULL) {
     295           0 :             COMP_CTX_free(s->compress);
     296           0 :             s->compress = NULL;
     297             :         }
     298           0 :         if (comp != NULL) {
     299           0 :             s->compress = COMP_CTX_new(comp);
     300           0 :             if (s->compress == NULL) {
     301           0 :                 SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE,
     302             :                        SSL_R_COMPRESSION_LIBRARY_ERROR);
     303           0 :                 goto err2;
     304             :             }
     305             :         }
     306             : #endif
     307           0 :         memset(&(s->s3->write_sequence[0]), 0, 8);
     308           0 :         mac_secret = &(s->s3->write_mac_secret[0]);
     309             :     }
     310             : 
     311           0 :     if (reuse_dd)
     312           0 :         EVP_CIPHER_CTX_cleanup(dd);
     313             : 
     314           0 :     p = s->s3->tmp.key_block;
     315           0 :     i = EVP_MD_size(m);
     316           0 :     if (i < 0)
     317             :         goto err2;
     318           0 :     cl = EVP_CIPHER_key_length(c);
     319             :     j = is_exp ? (cl < SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher) ?
     320           0 :                   cl : SSL_C_EXPORT_KEYLENGTH(s->s3->tmp.new_cipher)) : cl;
     321             :     /* Was j=(is_exp)?5:EVP_CIPHER_key_length(c); */
     322           0 :     k = EVP_CIPHER_iv_length(c);
     323           0 :     if ((which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
     324           0 :         (which == SSL3_CHANGE_CIPHER_SERVER_READ)) {
     325             :         ms = &(p[0]);
     326           0 :         n = i + i;
     327           0 :         key = &(p[n]);
     328           0 :         n += j + j;
     329           0 :         iv = &(p[n]);
     330           0 :         n += k + k;
     331           0 :         er1 = &(s->s3->client_random[0]);
     332           0 :         er2 = &(s->s3->server_random[0]);
     333             :     } else {
     334             :         n = i;
     335           0 :         ms = &(p[n]);
     336           0 :         n += i + j;
     337           0 :         key = &(p[n]);
     338           0 :         n += j + k;
     339           0 :         iv = &(p[n]);
     340           0 :         n += k;
     341           0 :         er1 = &(s->s3->server_random[0]);
     342           0 :         er2 = &(s->s3->client_random[0]);
     343             :     }
     344             : 
     345           0 :     if (n > s->s3->tmp.key_block_length) {
     346           0 :         SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
     347           0 :         goto err2;
     348             :     }
     349             : 
     350           0 :     EVP_MD_CTX_init(&md);
     351           0 :     memcpy(mac_secret, ms, i);
     352           0 :     if (is_exp) {
     353             :         /*
     354             :          * In here I set both the read and write key/iv to the same value
     355             :          * since only the correct one will be used :-).
     356             :          */
     357           0 :         EVP_DigestInit_ex(&md, EVP_md5(), NULL);
     358           0 :         EVP_DigestUpdate(&md, key, j);
     359           0 :         EVP_DigestUpdate(&md, er1, SSL3_RANDOM_SIZE);
     360           0 :         EVP_DigestUpdate(&md, er2, SSL3_RANDOM_SIZE);
     361           0 :         EVP_DigestFinal_ex(&md, &(exp_key[0]), NULL);
     362             :         key = &(exp_key[0]);
     363             : 
     364           0 :         if (k > 0) {
     365           0 :             EVP_DigestInit_ex(&md, EVP_md5(), NULL);
     366           0 :             EVP_DigestUpdate(&md, er1, SSL3_RANDOM_SIZE);
     367           0 :             EVP_DigestUpdate(&md, er2, SSL3_RANDOM_SIZE);
     368           0 :             EVP_DigestFinal_ex(&md, &(exp_iv[0]), NULL);
     369             :             iv = &(exp_iv[0]);
     370             :         }
     371             :     }
     372             : 
     373           0 :     s->session->key_arg_length = 0;
     374             : 
     375           0 :     EVP_CipherInit_ex(dd, c, NULL, key, iv, (which & SSL3_CC_WRITE));
     376             : 
     377             : #ifdef OPENSSL_SSL_TRACE_CRYPTO
     378             :     if (s->msg_callback) {
     379             : 
     380             :         int wh = which & SSL3_CC_WRITE ?
     381             :             TLS1_RT_CRYPTO_WRITE : TLS1_RT_CRYPTO_READ;
     382             :         s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_MAC,
     383             :                         mac_secret, EVP_MD_size(m), s, s->msg_callback_arg);
     384             :         if (c->key_len)
     385             :             s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_KEY,
     386             :                             key, c->key_len, s, s->msg_callback_arg);
     387             :         if (k) {
     388             :             s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_IV,
     389             :                             iv, k, s, s->msg_callback_arg);
     390             :         }
     391             :     }
     392             : #endif
     393             : 
     394           0 :     OPENSSL_cleanse(&(exp_key[0]), sizeof(exp_key));
     395           0 :     OPENSSL_cleanse(&(exp_iv[0]), sizeof(exp_iv));
     396           0 :     EVP_MD_CTX_cleanup(&md);
     397           0 :     return (1);
     398             :  err:
     399           0 :     SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE, ERR_R_MALLOC_FAILURE);
     400             :  err2:
     401             :     return (0);
     402             : }
     403             : 
     404           0 : int ssl3_setup_key_block(SSL *s)
     405             : {
     406             :     unsigned char *p;
     407             :     const EVP_CIPHER *c;
     408             :     const EVP_MD *hash;
     409             :     int num;
     410             :     int ret = 0;
     411             :     SSL_COMP *comp;
     412             : 
     413           0 :     if (s->s3->tmp.key_block_length != 0)
     414             :         return (1);
     415             : 
     416           0 :     if (!ssl_cipher_get_evp(s->session, &c, &hash, NULL, NULL, &comp)) {
     417           0 :         SSLerr(SSL_F_SSL3_SETUP_KEY_BLOCK, SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
     418           0 :         return (0);
     419             :     }
     420             : 
     421           0 :     s->s3->tmp.new_sym_enc = c;
     422           0 :     s->s3->tmp.new_hash = hash;
     423             : #ifdef OPENSSL_NO_COMP
     424             :     s->s3->tmp.new_compression = NULL;
     425             : #else
     426           0 :     s->s3->tmp.new_compression = comp;
     427             : #endif
     428             : 
     429           0 :     num = EVP_MD_size(hash);
     430           0 :     if (num < 0)
     431             :         return 0;
     432             : 
     433           0 :     num = EVP_CIPHER_key_length(c) + num + EVP_CIPHER_iv_length(c);
     434           0 :     num *= 2;
     435             : 
     436           0 :     ssl3_cleanup_key_block(s);
     437             : 
     438           0 :     if ((p = OPENSSL_malloc(num)) == NULL)
     439             :         goto err;
     440             : 
     441           0 :     s->s3->tmp.key_block_length = num;
     442           0 :     s->s3->tmp.key_block = p;
     443             : 
     444           0 :     ret = ssl3_generate_key_block(s, p, num);
     445             : 
     446           0 :     if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)) {
     447             :         /*
     448             :          * enable vulnerability countermeasure for CBC ciphers with known-IV
     449             :          * problem (http://www.openssl.org/~bodo/tls-cbc.txt)
     450             :          */
     451           0 :         s->s3->need_empty_fragments = 1;
     452             : 
     453           0 :         if (s->session->cipher != NULL) {
     454           0 :             if (s->session->cipher->algorithm_enc == SSL_eNULL)
     455           0 :                 s->s3->need_empty_fragments = 0;
     456             : 
     457             : #ifndef OPENSSL_NO_RC4
     458           0 :             if (s->session->cipher->algorithm_enc == SSL_RC4)
     459           0 :                 s->s3->need_empty_fragments = 0;
     460             : #endif
     461             :         }
     462             :     }
     463             : 
     464           0 :     return ret;
     465             : 
     466             :  err:
     467           0 :     SSLerr(SSL_F_SSL3_SETUP_KEY_BLOCK, ERR_R_MALLOC_FAILURE);
     468           0 :     return (0);
     469             : }
     470             : 
     471        5212 : void ssl3_cleanup_key_block(SSL *s)
     472             : {
     473        5212 :     if (s->s3->tmp.key_block != NULL) {
     474         737 :         OPENSSL_cleanse(s->s3->tmp.key_block, s->s3->tmp.key_block_length);
     475         737 :         OPENSSL_free(s->s3->tmp.key_block);
     476         737 :         s->s3->tmp.key_block = NULL;
     477             :     }
     478        5212 :     s->s3->tmp.key_block_length = 0;
     479        5212 : }
     480             : 
     481             : /*-
     482             :  * ssl3_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|, respectively.
     483             :  *
     484             :  * Returns:
     485             :  *   0: (in non-constant time) if the record is publically invalid (i.e. too
     486             :  *       short etc).
     487             :  *   1: if the record's padding is valid / the encryption was successful.
     488             :  *   -1: if the record's padding is invalid or, if sending, an internal error
     489             :  *       occured.
     490             :  */
     491           0 : int ssl3_enc(SSL *s, int send)
     492             : {
     493             :     SSL3_RECORD *rec;
     494             :     EVP_CIPHER_CTX *ds;
     495             :     unsigned long l;
     496             :     int bs, i, mac_size = 0;
     497             :     const EVP_CIPHER *enc;
     498             : 
     499           0 :     if (send) {
     500           0 :         ds = s->enc_write_ctx;
     501           0 :         rec = &(s->s3->wrec);
     502           0 :         if (s->enc_write_ctx == NULL)
     503             :             enc = NULL;
     504             :         else
     505           0 :             enc = EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
     506             :     } else {
     507           0 :         ds = s->enc_read_ctx;
     508           0 :         rec = &(s->s3->rrec);
     509           0 :         if (s->enc_read_ctx == NULL)
     510             :             enc = NULL;
     511             :         else
     512           0 :             enc = EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
     513             :     }
     514             : 
     515           0 :     if ((s->session == NULL) || (ds == NULL) || (enc == NULL)) {
     516           0 :         memmove(rec->data, rec->input, rec->length);
     517           0 :         rec->input = rec->data;
     518             :     } else {
     519           0 :         l = rec->length;
     520           0 :         bs = EVP_CIPHER_block_size(ds->cipher);
     521             : 
     522             :         /* COMPRESS */
     523             : 
     524           0 :         if ((bs != 1) && send) {
     525           0 :             i = bs - ((int)l % bs);
     526             : 
     527             :             /* we need to add 'i-1' padding bytes */
     528           0 :             l += i;
     529             :             /*
     530             :              * the last of these zero bytes will be overwritten with the
     531             :              * padding length.
     532             :              */
     533           0 :             memset(&rec->input[rec->length], 0, i);
     534           0 :             rec->length += i;
     535           0 :             rec->input[l - 1] = (i - 1);
     536             :         }
     537             : 
     538           0 :         if (!send) {
     539           0 :             if (l == 0 || l % bs != 0)
     540             :                 return 0;
     541             :             /* otherwise, rec->length >= bs */
     542             :         }
     543             : 
     544           0 :         if (EVP_Cipher(ds, rec->data, rec->input, l) < 1)
     545             :             return -1;
     546             : 
     547           0 :         if (EVP_MD_CTX_md(s->read_hash) != NULL)
     548           0 :             mac_size = EVP_MD_CTX_size(s->read_hash);
     549           0 :         if ((bs != 1) && !send)
     550           0 :             return ssl3_cbc_remove_padding(s, rec, bs, mac_size);
     551             :     }
     552             :     return (1);
     553             : }
     554             : 
     555         746 : void ssl3_init_finished_mac(SSL *s)
     556             : {
     557         746 :     if (s->s3->handshake_buffer)
     558           0 :         BIO_free(s->s3->handshake_buffer);
     559         746 :     if (s->s3->handshake_dgst)
     560           0 :         ssl3_free_digest_list(s);
     561         746 :     s->s3->handshake_buffer = BIO_new(BIO_s_mem());
     562         746 :     (void)BIO_set_close(s->s3->handshake_buffer, BIO_CLOSE);
     563         746 : }
     564             : 
     565        1486 : void ssl3_free_digest_list(SSL *s)
     566             : {
     567             :     int i;
     568        1486 :     if (!s->s3->handshake_dgst)
     569        1486 :         return;
     570        4458 :     for (i = 0; i < SSL_MAX_DIGEST; i++) {
     571        4458 :         if (s->s3->handshake_dgst[i])
     572         743 :             EVP_MD_CTX_destroy(s->s3->handshake_dgst[i]);
     573             :     }
     574         743 :     OPENSSL_free(s->s3->handshake_dgst);
     575         743 :     s->s3->handshake_dgst = NULL;
     576             : }
     577             : 
     578        6656 : void ssl3_finish_mac(SSL *s, const unsigned char *buf, int len)
     579             : {
     580        6656 :     if (s->s3->handshake_buffer
     581        2226 :         && !(s->s3->flags & TLS1_FLAGS_KEEP_HANDSHAKE)) {
     582        2226 :         BIO_write(s->s3->handshake_buffer, (void *)buf, len);
     583             :     } else {
     584             :         int i;
     585       26580 :         for (i = 0; i < SSL_MAX_DIGEST; i++) {
     586       26580 :             if (s->s3->handshake_dgst[i] != NULL)
     587        4430 :                 EVP_DigestUpdate(s->s3->handshake_dgst[i], buf, len);
     588             :         }
     589             :     }
     590        6656 : }
     591             : 
     592         743 : int ssl3_digest_cached_records(SSL *s)
     593             : {
     594             :     int i;
     595             :     long mask;
     596             :     const EVP_MD *md;
     597             :     long hdatalen;
     598             :     void *hdata;
     599             : 
     600             :     /* Allocate handshake_dgst array */
     601         743 :     ssl3_free_digest_list(s);
     602        1486 :     s->s3->handshake_dgst =
     603         743 :         OPENSSL_malloc(SSL_MAX_DIGEST * sizeof(EVP_MD_CTX *));
     604         743 :     memset(s->s3->handshake_dgst, 0, SSL_MAX_DIGEST * sizeof(EVP_MD_CTX *));
     605         743 :     hdatalen = BIO_get_mem_data(s->s3->handshake_buffer, &hdata);
     606         743 :     if (hdatalen <= 0) {
     607           0 :         SSLerr(SSL_F_SSL3_DIGEST_CACHED_RECORDS, SSL_R_BAD_HANDSHAKE_LENGTH);
     608           0 :         return 0;
     609             :     }
     610             : 
     611             :     /* Loop through bitso of algorithm2 field and create MD_CTX-es */
     612        4458 :     for (i = 0; ssl_get_handshake_digest(i, &mask, &md); i++) {
     613        4458 :         if ((mask & ssl_get_algorithm2(s)) && md) {
     614         743 :             s->s3->handshake_dgst[i] = EVP_MD_CTX_create();
     615             : #ifdef OPENSSL_FIPS
     616             :             if (EVP_MD_nid(md) == NID_md5) {
     617             :                 EVP_MD_CTX_set_flags(s->s3->handshake_dgst[i],
     618             :                                      EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
     619             :             }
     620             : #endif
     621         743 :             EVP_DigestInit_ex(s->s3->handshake_dgst[i], md, NULL);
     622         743 :             EVP_DigestUpdate(s->s3->handshake_dgst[i], hdata, hdatalen);
     623             :         } else {
     624        3715 :             s->s3->handshake_dgst[i] = NULL;
     625             :         }
     626             :     }
     627         743 :     if (!(s->s3->flags & TLS1_FLAGS_KEEP_HANDSHAKE)) {
     628             :         /* Free handshake_buffer BIO */
     629         743 :         BIO_free(s->s3->handshake_buffer);
     630         743 :         s->s3->handshake_buffer = NULL;
     631             :     }
     632             : 
     633             :     return 1;
     634             : }
     635             : 
     636           0 : int ssl3_cert_verify_mac(SSL *s, int md_nid, unsigned char *p)
     637             : {
     638           0 :     return (ssl3_handshake_mac(s, md_nid, NULL, 0, p));
     639             : }
     640             : 
     641           0 : int ssl3_final_finish_mac(SSL *s,
     642             :                           const char *sender, int len, unsigned char *p)
     643             : {
     644             :     int ret, sha1len;
     645           0 :     ret = ssl3_handshake_mac(s, NID_md5, sender, len, p);
     646           0 :     if (ret == 0)
     647             :         return 0;
     648             : 
     649           0 :     p += ret;
     650             : 
     651           0 :     sha1len = ssl3_handshake_mac(s, NID_sha1, sender, len, p);
     652           0 :     if (sha1len == 0)
     653             :         return 0;
     654             : 
     655           0 :     ret += sha1len;
     656           0 :     return (ret);
     657             : }
     658             : 
     659           0 : static int ssl3_handshake_mac(SSL *s, int md_nid,
     660             :                               const char *sender, int len, unsigned char *p)
     661             : {
     662             :     unsigned int ret;
     663             :     int npad, n;
     664             :     unsigned int i;
     665             :     unsigned char md_buf[EVP_MAX_MD_SIZE];
     666             :     EVP_MD_CTX ctx, *d = NULL;
     667             : 
     668           0 :     if (s->s3->handshake_buffer)
     669           0 :         if (!ssl3_digest_cached_records(s))
     670             :             return 0;
     671             : 
     672             :     /*
     673             :      * Search for digest of specified type in the handshake_dgst array
     674             :      */
     675           0 :     for (i = 0; i < SSL_MAX_DIGEST; i++) {
     676           0 :         if (s->s3->handshake_dgst[i]
     677           0 :             && EVP_MD_CTX_type(s->s3->handshake_dgst[i]) == md_nid) {
     678           0 :             d = s->s3->handshake_dgst[i];
     679           0 :             break;
     680             :         }
     681             :     }
     682           0 :     if (!d) {
     683           0 :         SSLerr(SSL_F_SSL3_HANDSHAKE_MAC, SSL_R_NO_REQUIRED_DIGEST);
     684           0 :         return 0;
     685             :     }
     686           0 :     EVP_MD_CTX_init(&ctx);
     687           0 :     EVP_MD_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
     688           0 :     EVP_MD_CTX_copy_ex(&ctx, d);
     689           0 :     n = EVP_MD_CTX_size(&ctx);
     690           0 :     if (n < 0)
     691             :         return 0;
     692             : 
     693           0 :     npad = (48 / n) * n;
     694           0 :     if (sender != NULL)
     695           0 :         EVP_DigestUpdate(&ctx, sender, len);
     696           0 :     EVP_DigestUpdate(&ctx, s->session->master_key,
     697           0 :                      s->session->master_key_length);
     698           0 :     EVP_DigestUpdate(&ctx, ssl3_pad_1, npad);
     699           0 :     EVP_DigestFinal_ex(&ctx, md_buf, &i);
     700             : 
     701           0 :     EVP_DigestInit_ex(&ctx, EVP_MD_CTX_md(&ctx), NULL);
     702           0 :     EVP_DigestUpdate(&ctx, s->session->master_key,
     703           0 :                      s->session->master_key_length);
     704           0 :     EVP_DigestUpdate(&ctx, ssl3_pad_2, npad);
     705           0 :     EVP_DigestUpdate(&ctx, md_buf, i);
     706           0 :     EVP_DigestFinal_ex(&ctx, p, &ret);
     707             : 
     708           0 :     EVP_MD_CTX_cleanup(&ctx);
     709             : 
     710           0 :     return ((int)ret);
     711             : }
     712             : 
     713           0 : int n_ssl3_mac(SSL *ssl, unsigned char *md, int send)
     714             : {
     715             :     SSL3_RECORD *rec;
     716             :     unsigned char *mac_sec, *seq;
     717             :     EVP_MD_CTX md_ctx;
     718             :     const EVP_MD_CTX *hash;
     719             :     unsigned char *p, rec_char;
     720             :     size_t md_size, orig_len;
     721             :     int npad;
     722             :     int t;
     723             : 
     724           0 :     if (send) {
     725           0 :         rec = &(ssl->s3->wrec);
     726           0 :         mac_sec = &(ssl->s3->write_mac_secret[0]);
     727           0 :         seq = &(ssl->s3->write_sequence[0]);
     728           0 :         hash = ssl->write_hash;
     729             :     } else {
     730           0 :         rec = &(ssl->s3->rrec);
     731           0 :         mac_sec = &(ssl->s3->read_mac_secret[0]);
     732           0 :         seq = &(ssl->s3->read_sequence[0]);
     733           0 :         hash = ssl->read_hash;
     734             :     }
     735             : 
     736           0 :     t = EVP_MD_CTX_size(hash);
     737           0 :     if (t < 0)
     738             :         return -1;
     739           0 :     md_size = t;
     740           0 :     npad = (48 / md_size) * md_size;
     741             : 
     742             :     /*
     743             :      * kludge: ssl3_cbc_remove_padding passes padding length in rec->type
     744             :      */
     745           0 :     orig_len = rec->length + md_size + ((unsigned int)rec->type >> 8);
     746           0 :     rec->type &= 0xff;
     747             : 
     748           0 :     if (!send &&
     749           0 :         EVP_CIPHER_CTX_mode(ssl->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
     750           0 :         ssl3_cbc_record_digest_supported(hash)) {
     751             :         /*
     752             :          * This is a CBC-encrypted record. We must avoid leaking any
     753             :          * timing-side channel information about how many blocks of data we
     754             :          * are hashing because that gives an attacker a timing-oracle.
     755             :          */
     756             : 
     757             :         /*-
     758             :          * npad is, at most, 48 bytes and that's with MD5:
     759             :          *   16 + 48 + 8 (sequence bytes) + 1 + 2 = 75.
     760             :          *
     761             :          * With SHA-1 (the largest hash speced for SSLv3) the hash size
     762             :          * goes up 4, but npad goes down by 8, resulting in a smaller
     763             :          * total size.
     764             :          */
     765             :         unsigned char header[75];
     766             :         unsigned j = 0;
     767           0 :         memcpy(header + j, mac_sec, md_size);
     768           0 :         j += md_size;
     769           0 :         memcpy(header + j, ssl3_pad_1, npad);
     770           0 :         j += npad;
     771           0 :         memcpy(header + j, seq, 8);
     772           0 :         j += 8;
     773           0 :         header[j++] = rec->type;
     774           0 :         header[j++] = rec->length >> 8;
     775           0 :         header[j++] = rec->length & 0xff;
     776             : 
     777             :         /* Final param == is SSLv3 */
     778           0 :         ssl3_cbc_digest_record(hash,
     779             :                                md, &md_size,
     780           0 :                                header, rec->input,
     781           0 :                                rec->length + md_size, orig_len,
     782             :                                mac_sec, md_size, 1);
     783             :     } else {
     784             :         unsigned int md_size_u;
     785             :         /* Chop the digest off the end :-) */
     786           0 :         EVP_MD_CTX_init(&md_ctx);
     787             : 
     788           0 :         EVP_MD_CTX_copy_ex(&md_ctx, hash);
     789           0 :         EVP_DigestUpdate(&md_ctx, mac_sec, md_size);
     790           0 :         EVP_DigestUpdate(&md_ctx, ssl3_pad_1, npad);
     791           0 :         EVP_DigestUpdate(&md_ctx, seq, 8);
     792           0 :         rec_char = rec->type;
     793           0 :         EVP_DigestUpdate(&md_ctx, &rec_char, 1);
     794             :         p = md;
     795           0 :         s2n(rec->length, p);
     796           0 :         EVP_DigestUpdate(&md_ctx, md, 2);
     797           0 :         EVP_DigestUpdate(&md_ctx, rec->input, rec->length);
     798           0 :         EVP_DigestFinal_ex(&md_ctx, md, NULL);
     799             : 
     800           0 :         EVP_MD_CTX_copy_ex(&md_ctx, hash);
     801           0 :         EVP_DigestUpdate(&md_ctx, mac_sec, md_size);
     802           0 :         EVP_DigestUpdate(&md_ctx, ssl3_pad_2, npad);
     803           0 :         EVP_DigestUpdate(&md_ctx, md, md_size);
     804           0 :         EVP_DigestFinal_ex(&md_ctx, md, &md_size_u);
     805           0 :         md_size = md_size_u;
     806             : 
     807           0 :         EVP_MD_CTX_cleanup(&md_ctx);
     808             :     }
     809             : 
     810             :     ssl3_record_sequence_update(seq);
     811           0 :     return (md_size);
     812             : }
     813             : 
     814           0 : void ssl3_record_sequence_update(unsigned char *seq)
     815             : {
     816             :     int i;
     817             : 
     818           0 :     for (i = 7; i >= 0; i--) {
     819           0 :         ++seq[i];
     820           0 :         if (seq[i] != 0)
     821             :             break;
     822             :     }
     823           0 : }
     824             : 
     825           0 : int ssl3_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
     826             :                                 int len)
     827             : {
     828             :     static const unsigned char *salt[3] = {
     829             : #ifndef CHARSET_EBCDIC
     830             :         (const unsigned char *)"A",
     831             :         (const unsigned char *)"BB",
     832             :         (const unsigned char *)"CCC",
     833             : #else
     834             :         (const unsigned char *)"\x41",
     835             :         (const unsigned char *)"\x42\x42",
     836             :         (const unsigned char *)"\x43\x43\x43",
     837             : #endif
     838             :     };
     839             :     unsigned char buf[EVP_MAX_MD_SIZE];
     840             :     EVP_MD_CTX ctx;
     841             :     int i, ret = 0;
     842             :     unsigned int n;
     843             : #ifdef OPENSSL_SSL_TRACE_CRYPTO
     844             :     unsigned char *tmpout = out;
     845             : #endif
     846             : 
     847           0 :     EVP_MD_CTX_init(&ctx);
     848           0 :     for (i = 0; i < 3; i++) {
     849           0 :         EVP_DigestInit_ex(&ctx, s->ctx->sha1, NULL);
     850           0 :         EVP_DigestUpdate(&ctx, salt[i], strlen((const char *)salt[i]));
     851           0 :         EVP_DigestUpdate(&ctx, p, len);
     852           0 :         EVP_DigestUpdate(&ctx, &(s->s3->client_random[0]), SSL3_RANDOM_SIZE);
     853           0 :         EVP_DigestUpdate(&ctx, &(s->s3->server_random[0]), SSL3_RANDOM_SIZE);
     854           0 :         EVP_DigestFinal_ex(&ctx, buf, &n);
     855             : 
     856           0 :         EVP_DigestInit_ex(&ctx, s->ctx->md5, NULL);
     857           0 :         EVP_DigestUpdate(&ctx, p, len);
     858           0 :         EVP_DigestUpdate(&ctx, buf, n);
     859           0 :         EVP_DigestFinal_ex(&ctx, out, &n);
     860           0 :         out += n;
     861           0 :         ret += n;
     862             :     }
     863           0 :     EVP_MD_CTX_cleanup(&ctx);
     864             : 
     865             : #ifdef OPENSSL_SSL_TRACE_CRYPTO
     866             :     if (s->msg_callback) {
     867             :         s->msg_callback(2, s->version, TLS1_RT_CRYPTO_PREMASTER,
     868             :                         p, len, s, s->msg_callback_arg);
     869             :         s->msg_callback(2, s->version, TLS1_RT_CRYPTO_CLIENT_RANDOM,
     870             :                         s->s3->client_random, SSL3_RANDOM_SIZE,
     871             :                         s, s->msg_callback_arg);
     872             :         s->msg_callback(2, s->version, TLS1_RT_CRYPTO_SERVER_RANDOM,
     873             :                         s->s3->server_random, SSL3_RANDOM_SIZE,
     874             :                         s, s->msg_callback_arg);
     875             :         s->msg_callback(2, s->version, TLS1_RT_CRYPTO_MASTER,
     876             :                         tmpout, SSL3_MASTER_SECRET_SIZE,
     877             :                         s, s->msg_callback_arg);
     878             :     }
     879             : #endif
     880           0 :     OPENSSL_cleanse(buf, sizeof buf);
     881           0 :     return (ret);
     882             : }
     883             : 
     884           0 : int ssl3_alert_code(int code)
     885             : {
     886             :     switch (code) {
     887             :     case SSL_AD_CLOSE_NOTIFY:
     888             :         return (SSL3_AD_CLOSE_NOTIFY);
     889             :     case SSL_AD_UNEXPECTED_MESSAGE:
     890             :         return (SSL3_AD_UNEXPECTED_MESSAGE);
     891             :     case SSL_AD_BAD_RECORD_MAC:
     892             :         return (SSL3_AD_BAD_RECORD_MAC);
     893             :     case SSL_AD_DECRYPTION_FAILED:
     894             :         return (SSL3_AD_BAD_RECORD_MAC);
     895             :     case SSL_AD_RECORD_OVERFLOW:
     896             :         return (SSL3_AD_BAD_RECORD_MAC);
     897             :     case SSL_AD_DECOMPRESSION_FAILURE:
     898             :         return (SSL3_AD_DECOMPRESSION_FAILURE);
     899             :     case SSL_AD_HANDSHAKE_FAILURE:
     900             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     901             :     case SSL_AD_NO_CERTIFICATE:
     902             :         return (SSL3_AD_NO_CERTIFICATE);
     903             :     case SSL_AD_BAD_CERTIFICATE:
     904             :         return (SSL3_AD_BAD_CERTIFICATE);
     905             :     case SSL_AD_UNSUPPORTED_CERTIFICATE:
     906             :         return (SSL3_AD_UNSUPPORTED_CERTIFICATE);
     907             :     case SSL_AD_CERTIFICATE_REVOKED:
     908             :         return (SSL3_AD_CERTIFICATE_REVOKED);
     909             :     case SSL_AD_CERTIFICATE_EXPIRED:
     910             :         return (SSL3_AD_CERTIFICATE_EXPIRED);
     911             :     case SSL_AD_CERTIFICATE_UNKNOWN:
     912             :         return (SSL3_AD_CERTIFICATE_UNKNOWN);
     913             :     case SSL_AD_ILLEGAL_PARAMETER:
     914             :         return (SSL3_AD_ILLEGAL_PARAMETER);
     915             :     case SSL_AD_UNKNOWN_CA:
     916             :         return (SSL3_AD_BAD_CERTIFICATE);
     917             :     case SSL_AD_ACCESS_DENIED:
     918             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     919             :     case SSL_AD_DECODE_ERROR:
     920             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     921             :     case SSL_AD_DECRYPT_ERROR:
     922             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     923             :     case SSL_AD_EXPORT_RESTRICTION:
     924             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     925             :     case SSL_AD_PROTOCOL_VERSION:
     926             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     927             :     case SSL_AD_INSUFFICIENT_SECURITY:
     928             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     929             :     case SSL_AD_INTERNAL_ERROR:
     930             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     931             :     case SSL_AD_USER_CANCELLED:
     932             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     933             :     case SSL_AD_NO_RENEGOTIATION:
     934             :         return (-1);            /* Don't send it :-) */
     935             :     case SSL_AD_UNSUPPORTED_EXTENSION:
     936             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     937             :     case SSL_AD_CERTIFICATE_UNOBTAINABLE:
     938             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     939             :     case SSL_AD_UNRECOGNIZED_NAME:
     940             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     941             :     case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
     942             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     943             :     case SSL_AD_BAD_CERTIFICATE_HASH_VALUE:
     944             :         return (SSL3_AD_HANDSHAKE_FAILURE);
     945             :     case SSL_AD_UNKNOWN_PSK_IDENTITY:
     946             :         return (TLS1_AD_UNKNOWN_PSK_IDENTITY);
     947             :     case SSL_AD_INAPPROPRIATE_FALLBACK:
     948             :         return (TLS1_AD_INAPPROPRIATE_FALLBACK);
     949             :     default:
     950             :         return (-1);
     951             :     }
     952             : }

Generated by: LCOV version 1.10