Home | History | Annotate | Line # | Download | only in ssl
      1 /*
      2  * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
      3  * Copyright 2005 Nokia. All rights reserved.
      4  *
      5  * Licensed under the Apache License 2.0 (the "License").  You may not use
      6  * this file except in compliance with the License.  You can obtain a copy
      7  * in the file LICENSE in the source distribution or at
      8  * https://www.openssl.org/source/license.html
      9  */
     10 
     11 #include <stdio.h>
     12 #include "ssl_local.h"
     13 #include <openssl/evp.h>
     14 #include <openssl/md5.h>
     15 #include <openssl/core_names.h>
     16 #include "internal/cryptlib.h"
     17 #include "internal/ssl_unwrap.h"
     18 
     19 static int ssl3_generate_key_block(SSL_CONNECTION *s, unsigned char *km, int num)
     20 {
     21     const EVP_MD *md5 = NULL, *sha1 = NULL;
     22     EVP_MD_CTX *m5;
     23     EVP_MD_CTX *s1;
     24     unsigned char buf[16], smd[SHA_DIGEST_LENGTH];
     25     unsigned char c = 'A';
     26     unsigned int i, k;
     27     int ret = 0;
     28     SSL_CTX *sctx = SSL_CONNECTION_GET_CTX(s);
     29 
     30 #ifdef CHARSET_EBCDIC
     31     c = os_toascii[c]; /* 'A' in ASCII */
     32 #endif
     33     k = 0;
     34     md5 = ssl_evp_md_fetch(sctx->libctx, NID_md5, sctx->propq);
     35     sha1 = ssl_evp_md_fetch(sctx->libctx, NID_sha1, sctx->propq);
     36     m5 = EVP_MD_CTX_new();
     37     s1 = EVP_MD_CTX_new();
     38     if (md5 == NULL || sha1 == NULL || m5 == NULL || s1 == NULL) {
     39         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_EVP_LIB);
     40         goto err;
     41     }
     42     for (i = 0; (int)i < num; i += MD5_DIGEST_LENGTH) {
     43         k++;
     44         if (k > sizeof(buf)) {
     45             /* bug: 'buf' is too small for this ciphersuite */
     46             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
     47             goto err;
     48         }
     49 
     50         memset(buf, c, k);
     51         c++;
     52         if (!EVP_DigestInit_ex(s1, sha1, NULL)
     53             || !EVP_DigestUpdate(s1, buf, k)
     54             || !EVP_DigestUpdate(s1, s->session->master_key,
     55                 s->session->master_key_length)
     56             || !EVP_DigestUpdate(s1, s->s3.server_random, SSL3_RANDOM_SIZE)
     57             || !EVP_DigestUpdate(s1, s->s3.client_random, SSL3_RANDOM_SIZE)
     58             || !EVP_DigestFinal_ex(s1, smd, NULL)
     59             || !EVP_DigestInit_ex(m5, md5, NULL)
     60             || !EVP_DigestUpdate(m5, s->session->master_key,
     61                 s->session->master_key_length)
     62             || !EVP_DigestUpdate(m5, smd, SHA_DIGEST_LENGTH)) {
     63             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
     64             goto err;
     65         }
     66         if ((int)(i + MD5_DIGEST_LENGTH) > num) {
     67             if (!EVP_DigestFinal_ex(m5, smd, NULL)) {
     68                 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
     69                 goto err;
     70             }
     71             memcpy(km, smd, (num - i));
     72         } else {
     73             if (!EVP_DigestFinal_ex(m5, km, NULL)) {
     74                 SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
     75                 goto err;
     76             }
     77         }
     78 
     79         km += MD5_DIGEST_LENGTH;
     80     }
     81     OPENSSL_cleanse(smd, sizeof(smd));
     82     ret = 1;
     83 err:
     84     EVP_MD_CTX_free(m5);
     85     EVP_MD_CTX_free(s1);
     86     ssl_evp_md_free(md5);
     87     ssl_evp_md_free(sha1);
     88     return ret;
     89 }
     90 
     91 int ssl3_change_cipher_state(SSL_CONNECTION *s, int which)
     92 {
     93     unsigned char *p, *mac_secret;
     94     size_t md_len;
     95     unsigned char *key, *iv;
     96     const EVP_CIPHER *ciph;
     97     const SSL_COMP *comp = NULL;
     98     const EVP_MD *md;
     99     int mdi;
    100     size_t n, iv_len, key_len;
    101     int direction = (which & SSL3_CC_READ) != 0 ? OSSL_RECORD_DIRECTION_READ
    102                                                 : OSSL_RECORD_DIRECTION_WRITE;
    103 
    104     ciph = s->s3.tmp.new_sym_enc;
    105     md = s->s3.tmp.new_hash;
    106     /* m == NULL will lead to a crash later */
    107     if (!ossl_assert(md != NULL)) {
    108         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    109         goto err;
    110     }
    111 #ifndef OPENSSL_NO_COMP
    112     comp = s->s3.tmp.new_compression;
    113 #endif
    114 
    115     p = s->s3.tmp.key_block;
    116     mdi = EVP_MD_get_size(md);
    117     if (mdi <= 0) {
    118         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    119         goto err;
    120     }
    121     md_len = (size_t)mdi;
    122     key_len = EVP_CIPHER_get_key_length(ciph);
    123     iv_len = EVP_CIPHER_get_iv_length(ciph);
    124 
    125     if ((which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) || (which == SSL3_CHANGE_CIPHER_SERVER_READ)) {
    126         mac_secret = &(p[0]);
    127         n = md_len + md_len;
    128         key = &(p[n]);
    129         n += key_len + key_len;
    130         iv = &(p[n]);
    131         n += iv_len + iv_len;
    132     } else {
    133         n = md_len;
    134         mac_secret = &(p[n]);
    135         n += md_len + key_len;
    136         key = &(p[n]);
    137         n += key_len + iv_len;
    138         iv = &(p[n]);
    139         n += iv_len;
    140     }
    141 
    142     if (n > s->s3.tmp.key_block_length) {
    143         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    144         goto err;
    145     }
    146 
    147     if (!ssl_set_new_record_layer(s, SSL3_VERSION,
    148             direction,
    149             OSSL_RECORD_PROTECTION_LEVEL_APPLICATION,
    150             NULL, 0, key, key_len, iv, iv_len, mac_secret,
    151             md_len, ciph, 0, NID_undef, md, comp, NULL)) {
    152         /* SSLfatal already called */
    153         goto err;
    154     }
    155 
    156     return 1;
    157 err:
    158     return 0;
    159 }
    160 
    161 int ssl3_setup_key_block(SSL_CONNECTION *s)
    162 {
    163     unsigned char *p;
    164     const EVP_CIPHER *c;
    165     const EVP_MD *hash;
    166     int num;
    167     int ret = 0;
    168     SSL_COMP *comp;
    169 
    170     if (s->s3.tmp.key_block_length != 0)
    171         return 1;
    172 
    173     if (!ssl_cipher_get_evp(SSL_CONNECTION_GET_CTX(s), s->session, &c, &hash,
    174             NULL, NULL, &comp, 0)) {
    175         /* Error is already recorded */
    176         SSLfatal_alert(s, SSL_AD_INTERNAL_ERROR);
    177         return 0;
    178     }
    179 
    180     ssl_evp_cipher_free(s->s3.tmp.new_sym_enc);
    181     s->s3.tmp.new_sym_enc = c;
    182     ssl_evp_md_free(s->s3.tmp.new_hash);
    183     s->s3.tmp.new_hash = hash;
    184 #ifdef OPENSSL_NO_COMP
    185     s->s3.tmp.new_compression = NULL;
    186 #else
    187     s->s3.tmp.new_compression = comp;
    188 #endif
    189 
    190     num = EVP_MD_get_size(hash);
    191     if (num <= 0)
    192         return 0;
    193 
    194     num = EVP_CIPHER_get_key_length(c) + num + EVP_CIPHER_get_iv_length(c);
    195     num *= 2;
    196 
    197     ssl3_cleanup_key_block(s);
    198 
    199     if ((p = OPENSSL_malloc(num)) == NULL) {
    200         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_CRYPTO_LIB);
    201         return 0;
    202     }
    203 
    204     s->s3.tmp.key_block_length = num;
    205     s->s3.tmp.key_block = p;
    206 
    207     /* Calls SSLfatal() as required */
    208     ret = ssl3_generate_key_block(s, p, num);
    209 
    210     return ret;
    211 }
    212 
    213 void ssl3_cleanup_key_block(SSL_CONNECTION *s)
    214 {
    215     OPENSSL_clear_free(s->s3.tmp.key_block, s->s3.tmp.key_block_length);
    216     s->s3.tmp.key_block = NULL;
    217     s->s3.tmp.key_block_length = 0;
    218 }
    219 
    220 int ssl3_init_finished_mac(SSL_CONNECTION *s)
    221 {
    222     BIO *buf = BIO_new(BIO_s_mem());
    223 
    224     if (buf == NULL) {
    225         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_BIO_LIB);
    226         return 0;
    227     }
    228     ssl3_free_digest_list(s);
    229     s->s3.handshake_buffer = buf;
    230     (void)BIO_set_close(s->s3.handshake_buffer, BIO_CLOSE);
    231     return 1;
    232 }
    233 
    234 /*
    235  * Free digest list. Also frees handshake buffer since they are always freed
    236  * together.
    237  */
    238 
    239 void ssl3_free_digest_list(SSL_CONNECTION *s)
    240 {
    241     BIO_free(s->s3.handshake_buffer);
    242     s->s3.handshake_buffer = NULL;
    243     EVP_MD_CTX_free(s->s3.handshake_dgst);
    244     s->s3.handshake_dgst = NULL;
    245 }
    246 
    247 int ssl3_finish_mac(SSL_CONNECTION *s, const unsigned char *buf, size_t len)
    248 {
    249     int ret;
    250 
    251     if (s->s3.handshake_dgst == NULL) {
    252         /* Note: this writes to a memory BIO so a failure is a fatal error */
    253         if (len > INT_MAX) {
    254             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_OVERFLOW_ERROR);
    255             return 0;
    256         }
    257         ret = BIO_write(s->s3.handshake_buffer, (void *)buf, (int)len);
    258         if (ret <= 0 || ret != (int)len) {
    259             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    260             return 0;
    261         }
    262     } else {
    263         ret = EVP_DigestUpdate(s->s3.handshake_dgst, buf, len);
    264         if (!ret) {
    265             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    266             return 0;
    267         }
    268     }
    269     return 1;
    270 }
    271 
    272 int ssl3_digest_cached_records(SSL_CONNECTION *s, int keep)
    273 {
    274     const EVP_MD *md;
    275     long hdatalen;
    276     void *hdata;
    277 
    278     if (s->s3.handshake_dgst == NULL) {
    279         hdatalen = BIO_get_mem_data(s->s3.handshake_buffer, &hdata);
    280         if (hdatalen <= 0) {
    281             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_BAD_HANDSHAKE_LENGTH);
    282             return 0;
    283         }
    284 
    285         s->s3.handshake_dgst = EVP_MD_CTX_new();
    286         if (s->s3.handshake_dgst == NULL) {
    287             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_EVP_LIB);
    288             return 0;
    289         }
    290 
    291         md = ssl_handshake_md(s);
    292         if (md == NULL) {
    293             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
    294                 SSL_R_NO_SUITABLE_DIGEST_ALGORITHM);
    295             return 0;
    296         }
    297         if (!EVP_DigestInit_ex(s->s3.handshake_dgst, md, NULL)
    298             || !EVP_DigestUpdate(s->s3.handshake_dgst, hdata, hdatalen)) {
    299             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    300             return 0;
    301         }
    302     }
    303     if (keep == 0) {
    304         BIO_free(s->s3.handshake_buffer);
    305         s->s3.handshake_buffer = NULL;
    306     }
    307 
    308     return 1;
    309 }
    310 
    311 void ssl3_digest_master_key_set_params(const SSL_SESSION *session,
    312     OSSL_PARAM params[])
    313 {
    314     int n = 0;
    315     params[n++] = OSSL_PARAM_construct_octet_string(OSSL_DIGEST_PARAM_SSL3_MS,
    316         (void *)session->master_key,
    317         session->master_key_length);
    318     params[n++] = OSSL_PARAM_construct_end();
    319 }
    320 
    321 size_t ssl3_final_finish_mac(SSL_CONNECTION *s, const char *sender, size_t len,
    322     unsigned char *p)
    323 {
    324     int ret;
    325     EVP_MD_CTX *ctx = NULL;
    326 
    327     if (!ssl3_digest_cached_records(s, 0)) {
    328         /* SSLfatal() already called */
    329         return 0;
    330     }
    331 
    332     if (EVP_MD_CTX_get_type(s->s3.handshake_dgst) != NID_md5_sha1) {
    333         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_R_NO_REQUIRED_DIGEST);
    334         return 0;
    335     }
    336 
    337     ctx = EVP_MD_CTX_new();
    338     if (ctx == NULL) {
    339         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_EVP_LIB);
    340         return 0;
    341     }
    342     if (!EVP_MD_CTX_copy_ex(ctx, s->s3.handshake_dgst)) {
    343         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    344         ret = 0;
    345         goto err;
    346     }
    347 
    348     ret = EVP_MD_CTX_get_size(ctx);
    349     if (ret < 0) {
    350         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    351         ret = 0;
    352         goto err;
    353     }
    354 
    355     if (sender != NULL) {
    356         OSSL_PARAM digest_cmd_params[3];
    357 
    358         ssl3_digest_master_key_set_params(s->session, digest_cmd_params);
    359 
    360         if (EVP_DigestUpdate(ctx, sender, len) <= 0
    361             || EVP_MD_CTX_set_params(ctx, digest_cmd_params) <= 0
    362             || EVP_DigestFinal_ex(ctx, p, NULL) <= 0) {
    363             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    364             ret = 0;
    365         }
    366     }
    367 
    368 err:
    369     EVP_MD_CTX_free(ctx);
    370 
    371     return ret;
    372 }
    373 
    374 int ssl3_generate_master_secret(SSL_CONNECTION *s, unsigned char *out,
    375     unsigned char *p,
    376     size_t len, size_t *secret_size)
    377 {
    378     static const unsigned char *const salt[3] = {
    379 #ifndef CHARSET_EBCDIC
    380         (const unsigned char *)"A",
    381         (const unsigned char *)"BB",
    382         (const unsigned char *)"CCC",
    383 #else
    384         (const unsigned char *)"\x41",
    385         (const unsigned char *)"\x42\x42",
    386         (const unsigned char *)"\x43\x43\x43",
    387 #endif
    388     };
    389     unsigned char buf[EVP_MAX_MD_SIZE];
    390     EVP_MD_CTX *ctx = EVP_MD_CTX_new();
    391     int i, ret = 1;
    392     unsigned int n;
    393     size_t ret_secret_size = 0;
    394 
    395     if (ctx == NULL) {
    396         SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_EVP_LIB);
    397         return 0;
    398     }
    399     for (i = 0; i < 3; i++) {
    400         if (EVP_DigestInit_ex(ctx, SSL_CONNECTION_GET_CTX(s)->sha1, NULL) <= 0
    401             || EVP_DigestUpdate(ctx, salt[i],
    402                    strlen((const char *)salt[i]))
    403                 <= 0
    404             || EVP_DigestUpdate(ctx, p, len) <= 0
    405             || EVP_DigestUpdate(ctx, &(s->s3.client_random[0]),
    406                    SSL3_RANDOM_SIZE)
    407                 <= 0
    408             || EVP_DigestUpdate(ctx, &(s->s3.server_random[0]),
    409                    SSL3_RANDOM_SIZE)
    410                 <= 0
    411             || EVP_DigestFinal_ex(ctx, buf, &n) <= 0
    412             || EVP_DigestInit_ex(ctx, SSL_CONNECTION_GET_CTX(s)->md5, NULL) <= 0
    413             || EVP_DigestUpdate(ctx, p, len) <= 0
    414             || EVP_DigestUpdate(ctx, buf, n) <= 0
    415             || EVP_DigestFinal_ex(ctx, out, &n) <= 0) {
    416             SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
    417             ret = 0;
    418             break;
    419         }
    420         out += n;
    421         ret_secret_size += n;
    422     }
    423     EVP_MD_CTX_free(ctx);
    424 
    425     OPENSSL_cleanse(buf, sizeof(buf));
    426     if (ret)
    427         *secret_size = ret_secret_size;
    428     return ret;
    429 }
    430 
    431 int ssl3_alert_code(int code)
    432 {
    433     switch (code) {
    434     case SSL_AD_CLOSE_NOTIFY:
    435         return SSL3_AD_CLOSE_NOTIFY;
    436     case SSL_AD_UNEXPECTED_MESSAGE:
    437         return SSL3_AD_UNEXPECTED_MESSAGE;
    438     case SSL_AD_BAD_RECORD_MAC:
    439         return SSL3_AD_BAD_RECORD_MAC;
    440     case SSL_AD_DECRYPTION_FAILED:
    441         return SSL3_AD_BAD_RECORD_MAC;
    442     case SSL_AD_RECORD_OVERFLOW:
    443         return SSL3_AD_BAD_RECORD_MAC;
    444     case SSL_AD_DECOMPRESSION_FAILURE:
    445         return SSL3_AD_DECOMPRESSION_FAILURE;
    446     case SSL_AD_HANDSHAKE_FAILURE:
    447         return SSL3_AD_HANDSHAKE_FAILURE;
    448     case SSL_AD_NO_CERTIFICATE:
    449         return SSL3_AD_NO_CERTIFICATE;
    450     case SSL_AD_BAD_CERTIFICATE:
    451         return SSL3_AD_BAD_CERTIFICATE;
    452     case SSL_AD_UNSUPPORTED_CERTIFICATE:
    453         return SSL3_AD_UNSUPPORTED_CERTIFICATE;
    454     case SSL_AD_CERTIFICATE_REVOKED:
    455         return SSL3_AD_CERTIFICATE_REVOKED;
    456     case SSL_AD_CERTIFICATE_EXPIRED:
    457         return SSL3_AD_CERTIFICATE_EXPIRED;
    458     case SSL_AD_CERTIFICATE_UNKNOWN:
    459         return SSL3_AD_CERTIFICATE_UNKNOWN;
    460     case SSL_AD_ILLEGAL_PARAMETER:
    461         return SSL3_AD_ILLEGAL_PARAMETER;
    462     case SSL_AD_UNKNOWN_CA:
    463         return SSL3_AD_BAD_CERTIFICATE;
    464     case SSL_AD_ACCESS_DENIED:
    465         return SSL3_AD_HANDSHAKE_FAILURE;
    466     case SSL_AD_DECODE_ERROR:
    467         return SSL3_AD_HANDSHAKE_FAILURE;
    468     case SSL_AD_DECRYPT_ERROR:
    469         return SSL3_AD_HANDSHAKE_FAILURE;
    470     case SSL_AD_EXPORT_RESTRICTION:
    471         return SSL3_AD_HANDSHAKE_FAILURE;
    472     case SSL_AD_PROTOCOL_VERSION:
    473         return SSL3_AD_HANDSHAKE_FAILURE;
    474     case SSL_AD_INSUFFICIENT_SECURITY:
    475         return SSL3_AD_HANDSHAKE_FAILURE;
    476     case SSL_AD_INTERNAL_ERROR:
    477         return SSL3_AD_HANDSHAKE_FAILURE;
    478     case SSL_AD_USER_CANCELLED:
    479         return SSL3_AD_HANDSHAKE_FAILURE;
    480     case SSL_AD_NO_RENEGOTIATION:
    481         return -1; /* Don't send it :-) */
    482     case SSL_AD_UNSUPPORTED_EXTENSION:
    483         return SSL3_AD_HANDSHAKE_FAILURE;
    484     case SSL_AD_CERTIFICATE_UNOBTAINABLE:
    485         return SSL3_AD_HANDSHAKE_FAILURE;
    486     case SSL_AD_UNRECOGNIZED_NAME:
    487         return SSL3_AD_HANDSHAKE_FAILURE;
    488     case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
    489         return SSL3_AD_HANDSHAKE_FAILURE;
    490     case SSL_AD_BAD_CERTIFICATE_HASH_VALUE:
    491         return SSL3_AD_HANDSHAKE_FAILURE;
    492     case SSL_AD_UNKNOWN_PSK_IDENTITY:
    493         return TLS1_AD_UNKNOWN_PSK_IDENTITY;
    494     case SSL_AD_INAPPROPRIATE_FALLBACK:
    495         return TLS1_AD_INAPPROPRIATE_FALLBACK;
    496     case SSL_AD_NO_APPLICATION_PROTOCOL:
    497         return TLS1_AD_NO_APPLICATION_PROTOCOL;
    498     case SSL_AD_CERTIFICATE_REQUIRED:
    499         return SSL_AD_HANDSHAKE_FAILURE;
    500     case TLS13_AD_MISSING_EXTENSION:
    501         return SSL_AD_HANDSHAKE_FAILURE;
    502     default:
    503         return -1;
    504     }
    505 }
    506