t1_enc.c 30.4 KB
Newer Older
R
Rich Salz 已提交
1
/*
M
Matt Caswell 已提交
2
 * Copyright 1995-2020 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
R
Rich Salz 已提交
6 7 8
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
9
 */
R
Rich Salz 已提交
10

11
#include <stdio.h>
12 13
#include "ssl_local.h"
#include "record/record_local.h"
B
Boris Pismenny 已提交
14 15
#include "internal/ktls.h"
#include "internal/cryptlib.h"
R
Rich Salz 已提交
16
#include <openssl/comp.h>
17
#include <openssl/evp.h>
D
Dr. Stephen Henson 已提交
18
#include <openssl/kdf.h>
19
#include <openssl/rand.h>
B
Boris Pismenny 已提交
20
#include <openssl/obj_mac.h>
P
Pauli 已提交
21
#include <openssl/core_names.h>
22
#include <openssl/trace.h>
23

D
Dr. Stephen Henson 已提交
24
/* seed1 through seed5 are concatenated */
25
static int tls1_PRF(SSL *s,
26 27 28 29 30 31
                    const void *seed1, size_t seed1_len,
                    const void *seed2, size_t seed2_len,
                    const void *seed3, size_t seed3_len,
                    const void *seed4, size_t seed4_len,
                    const void *seed5, size_t seed5_len,
                    const unsigned char *sec, size_t slen,
32
                    unsigned char *out, size_t olen, int fatal)
33
{
34
    const EVP_MD *md = ssl_prf_md(s);
P
Pauli 已提交
35
    EVP_KDF *kdf;
36
    EVP_KDF_CTX *kctx = NULL;
P
Pauli 已提交
37
    OSSL_PARAM params[8], *p = params;
38
    const char *mdname;
39

40
    if (md == NULL) {
M
Matt Caswell 已提交
41
        /* Should never happen */
42 43 44 45 46
        if (fatal)
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_PRF,
                     ERR_R_INTERNAL_ERROR);
        else
            SSLerr(SSL_F_TLS1_PRF, ERR_R_INTERNAL_ERROR);
47
        return 0;
M
Matt Caswell 已提交
48
    }
49
    kdf = EVP_KDF_fetch(s->ctx->libctx, OSSL_KDF_NAME_TLS1_PRF, s->ctx->propq);
P
Pauli 已提交
50 51
    if (kdf == NULL)
        goto err;
52
    kctx = EVP_KDF_CTX_new(kdf);
P
Pauli 已提交
53 54
    EVP_KDF_free(kdf);
    if (kctx == NULL)
D
Dr. Stephen Henson 已提交
55
        goto err;
56
    mdname = EVP_MD_name(md);
P
Pauli 已提交
57
    *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
58
                                            (char *)mdname, 0);
P
Pauli 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SECRET,
                                             (unsigned char *)sec,
                                             (size_t)slen);
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
                                             (void *)seed1, (size_t)seed1_len);
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
                                             (void *)seed2, (size_t)seed2_len);
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
                                             (void *)seed3, (size_t)seed3_len);
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
                                             (void *)seed4, (size_t)seed4_len);
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
                                             (void *)seed5, (size_t)seed5_len);
    *p = OSSL_PARAM_construct_end();
73
    if (EVP_KDF_CTX_set_params(kctx, params)
P
Pauli 已提交
74
            && EVP_KDF_derive(kctx, out, olen)) {
75
        EVP_KDF_CTX_free(kctx);
P
Pauli 已提交
76
        return 1;
77
    }
D
Dr. Stephen Henson 已提交
78

E
Emilia Kasper 已提交
79
 err:
P
Pauli 已提交
80 81 82 83 84
    if (fatal)
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_PRF,
                 ERR_R_INTERNAL_ERROR);
    else
        SSLerr(SSL_F_TLS1_PRF, ERR_R_INTERNAL_ERROR);
85
    EVP_KDF_CTX_free(kctx);
P
Pauli 已提交
86
    return 0;
87
}
88

89
static int tls1_generate_key_block(SSL *s, unsigned char *km, size_t num)
90 91
{
    int ret;
92 93

    /* Calls SSLfatal() as required */
94
    ret = tls1_PRF(s,
95
                   TLS_MD_KEY_EXPANSION_CONST,
96 97
                   TLS_MD_KEY_EXPANSION_CONST_SIZE, s->s3.server_random,
                   SSL3_RANDOM_SIZE, s->s3.client_random, SSL3_RANDOM_SIZE,
98
                   NULL, 0, NULL, 0, s->session->master_key,
99
                   s->session->master_key_length, km, num, 1);
100

101 102
    return ret;
}
103

B
Boris Pismenny 已提交
104 105 106 107 108 109 110 111
#ifndef OPENSSL_NO_KTLS
 /*
  * Count the number of records that were not processed yet from record boundary.
  *
  * This function assumes that there are only fully formed records read in the
  * record layer. If read_ahead is enabled, then this might be false and this
  * function will fail.
  */
112
# ifndef OPENSSL_NO_KTLS_RX
B
Boris Pismenny 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
static int count_unprocessed_records(SSL *s)
{
    SSL3_BUFFER *rbuf = RECORD_LAYER_get_rbuf(&s->rlayer);
    PACKET pkt, subpkt;
    int count = 0;

    if (!PACKET_buf_init(&pkt, rbuf->buf + rbuf->offset, rbuf->left))
        return -1;

    while (PACKET_remaining(&pkt) > 0) {
        /* Skip record type and version */
        if (!PACKET_forward(&pkt, 3))
            return -1;

        /* Read until next record */
        if (PACKET_get_length_prefixed_2(&pkt, &subpkt))
            return -1;

        count += 1;
    }

    return count;
}
136
# endif
B
Boris Pismenny 已提交
137 138
#endif

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177

int tls_provider_set_tls_params(SSL *s, EVP_CIPHER_CTX *ctx,
                                const EVP_CIPHER *ciph,
                                const EVP_MD *md)
{
    /*
     * Provided cipher, the TLS padding/MAC removal is performed provider
     * side so we need to tell the ctx about our TLS version and mac size
     */
    OSSL_PARAM params[3], *pprm = params;
    size_t macsize = 0;
    int imacsize = -1;

    if ((EVP_CIPHER_flags(ciph) & EVP_CIPH_FLAG_AEAD_CIPHER) == 0
               /*
                * We look at s->ext.use_etm instead of SSL_READ_ETM() or
                * SSL_WRITE_ETM() because this test applies to both reading
                * and writing.
                */
            && !s->ext.use_etm)
        imacsize = EVP_MD_size(md);
    if (imacsize >= 0)
        macsize = (size_t)imacsize;

    *pprm++ = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_TLS_VERSION,
                                       &s->version);
    *pprm++ = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_TLS_MAC_SIZE,
                                          &macsize);
    *pprm = OSSL_PARAM_construct_end();

    if (!EVP_CIPHER_CTX_set_params(ctx, params)) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                 ERR_R_INTERNAL_ERROR);
        return 0;
    }

    return 1;
}

U
Ulf Möller 已提交
178
int tls1_change_cipher_state(SSL *s, int which)
179 180 181 182 183
{
    unsigned char *p, *mac_secret;
    unsigned char *ms, *key, *iv;
    EVP_CIPHER_CTX *dd;
    const EVP_CIPHER *c;
184
#ifndef OPENSSL_NO_COMP
185
    const SSL_COMP *comp;
186
#endif
187 188
    const EVP_MD *m;
    int mac_type;
189
    size_t *mac_secret_size;
190 191
    EVP_MD_CTX *mac_ctx;
    EVP_PKEY *mac_key;
192
    size_t n, i, j, k, cl;
193
    int reuse_dd = 0;
B
Boris Pismenny 已提交
194
#ifndef OPENSSL_NO_KTLS
195 196 197
# ifdef __FreeBSD__
    struct tls_enable crypto_info;
# else
198 199 200 201
    struct tls_crypto_info_all crypto_info;
    unsigned char *rec_seq;
    void *rl_sequence;
#  ifndef OPENSSL_NO_KTLS_RX
B
Boris Pismenny 已提交
202 203
    int count_unprocessed;
    int bit;
204
#  endif
205 206
# endif
    BIO *bio;
B
Boris Pismenny 已提交
207
#endif
208

209 210 211
    c = s->s3.tmp.new_sym_enc;
    m = s->s3.tmp.new_hash;
    mac_type = s->s3.tmp.new_mac_pkey_type;
212
#ifndef OPENSSL_NO_COMP
213
    comp = s->s3.tmp.new_compression;
214
#endif
215

216
    if (which & SSL3_CC_READ) {
217
        if (s->ext.use_etm)
218
            s->s3.flags |= TLS1_FLAGS_ENCRYPT_THEN_MAC_READ;
219
        else
220
            s->s3.flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC_READ;
221

222
        if (s->s3.tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
223 224 225 226
            s->mac_flags |= SSL_MAC_FLAG_READ_MAC_STREAM;
        else
            s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_STREAM;

227 228 229 230 231
        if (s->s3.tmp.new_cipher->algorithm2 & TLS1_TLSTREE)
            s->mac_flags |= SSL_MAC_FLAG_READ_MAC_TLSTREE;
        else
            s->mac_flags &= ~SSL_MAC_FLAG_READ_MAC_TLSTREE;

232
        if (s->enc_read_ctx != NULL) {
233
            reuse_dd = 1;
234 235 236
        } else if ((s->enc_read_ctx = EVP_CIPHER_CTX_new()) == NULL) {
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                     ERR_R_MALLOC_FAILURE);
237
            goto err;
238
        } else {
239
            /*
F
FdaSilvaYY 已提交
240
             * make sure it's initialised in case we exit later with an error
241
             */
242
            EVP_CIPHER_CTX_reset(s->enc_read_ctx);
243
        }
244 245
        dd = s->enc_read_ctx;
        mac_ctx = ssl_replace_hash(&s->read_hash, NULL);
M
Matt Caswell 已提交
246 247 248
        if (mac_ctx == NULL) {
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                     ERR_R_INTERNAL_ERROR);
249
            goto err;
M
Matt Caswell 已提交
250
        }
251
#ifndef OPENSSL_NO_COMP
R
Rich Salz 已提交
252 253
        COMP_CTX_free(s->expand);
        s->expand = NULL;
254 255 256
        if (comp != NULL) {
            s->expand = COMP_CTX_new(comp->method);
            if (s->expand == NULL) {
257 258 259 260
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS1_CHANGE_CIPHER_STATE,
                         SSL_R_COMPRESSION_LIBRARY_ERROR);
                goto err;
261 262
            }
        }
263
#endif
264
        /*
265
         * this is done by dtls1_reset_seq_numbers for DTLS
266
         */
267
        if (!SSL_IS_DTLS(s))
268
            RECORD_LAYER_reset_read_sequence(&s->rlayer);
269 270
        mac_secret = &(s->s3.read_mac_secret[0]);
        mac_secret_size = &(s->s3.read_mac_secret_size);
271
    } else {
272
        s->statem.enc_write_state = ENC_WRITE_STATE_INVALID;
273
        if (s->ext.use_etm)
274
            s->s3.flags |= TLS1_FLAGS_ENCRYPT_THEN_MAC_WRITE;
275
        else
276
            s->s3.flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC_WRITE;
277

278
        if (s->s3.tmp.new_cipher->algorithm2 & TLS1_STREAM_MAC)
279 280 281
            s->mac_flags |= SSL_MAC_FLAG_WRITE_MAC_STREAM;
        else
            s->mac_flags &= ~SSL_MAC_FLAG_WRITE_MAC_STREAM;
282 283 284 285 286

        if (s->s3.tmp.new_cipher->algorithm2 & TLS1_TLSTREE)
            s->mac_flags |= SSL_MAC_FLAG_WRITE_MAC_TLSTREE;
        else
            s->mac_flags &= ~SSL_MAC_FLAG_WRITE_MAC_TLSTREE;
287
        if (s->enc_write_ctx != NULL && !SSL_IS_DTLS(s)) {
288
            reuse_dd = 1;
289 290 291
        } else if ((s->enc_write_ctx = EVP_CIPHER_CTX_new()) == NULL) {
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                     ERR_R_MALLOC_FAILURE);
292
            goto err;
293
        }
294 295
        dd = s->enc_write_ctx;
        if (SSL_IS_DTLS(s)) {
296
            mac_ctx = EVP_MD_CTX_new();
297 298 299 300
            if (mac_ctx == NULL) {
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS1_CHANGE_CIPHER_STATE,
                         ERR_R_MALLOC_FAILURE);
301
                goto err;
302
            }
303
            s->write_hash = mac_ctx;
304
        } else {
305
            mac_ctx = ssl_replace_hash(&s->write_hash, NULL);
306 307 308 309
            if (mac_ctx == NULL) {
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS1_CHANGE_CIPHER_STATE,
                         ERR_R_MALLOC_FAILURE);
310
                goto err;
311
            }
312
        }
313
#ifndef OPENSSL_NO_COMP
R
Rich Salz 已提交
314 315
        COMP_CTX_free(s->compress);
        s->compress = NULL;
316 317 318
        if (comp != NULL) {
            s->compress = COMP_CTX_new(comp->method);
            if (s->compress == NULL) {
319 320 321 322
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS1_CHANGE_CIPHER_STATE,
                        SSL_R_COMPRESSION_LIBRARY_ERROR);
                goto err;
323 324
            }
        }
325
#endif
326
        /*
327
         * this is done by dtls1_reset_seq_numbers for DTLS
328
         */
329
        if (!SSL_IS_DTLS(s))
330
            RECORD_LAYER_reset_write_sequence(&s->rlayer);
331 332
        mac_secret = &(s->s3.write_mac_secret[0]);
        mac_secret_size = &(s->s3.write_mac_secret_size);
333 334 335
    }

    if (reuse_dd)
336
        EVP_CIPHER_CTX_reset(dd);
337

338 339
    p = s->s3.tmp.key_block;
    i = *mac_secret_size = s->s3.tmp.new_mac_secret_size;
340

341
    /* TODO(size_t): convert me */
342
    cl = EVP_CIPHER_key_length(c);
343
    j = cl;
344
    /* Was j=(exp)?5:EVP_CIPHER_key_length(c); */
D
Dr. Stephen Henson 已提交
345
    /* If GCM/CCM mode only part of IV comes from PRF */
346 347
    if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
        k = EVP_GCM_TLS_FIXED_IV_LEN;
D
Dr. Stephen Henson 已提交
348 349
    else if (EVP_CIPHER_mode(c) == EVP_CIPH_CCM_MODE)
        k = EVP_CCM_TLS_FIXED_IV_LEN;
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
    else
        k = EVP_CIPHER_iv_length(c);
    if ((which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
        (which == SSL3_CHANGE_CIPHER_SERVER_READ)) {
        ms = &(p[0]);
        n = i + i;
        key = &(p[n]);
        n += j + j;
        iv = &(p[n]);
        n += k + k;
    } else {
        n = i;
        ms = &(p[n]);
        n += i + j;
        key = &(p[n]);
        n += j + k;
        iv = &(p[n]);
        n += k;
    }

370
    if (n > s->s3.tmp.key_block_length) {
371 372 373
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                 ERR_R_INTERNAL_ERROR);
        goto err;
374 375 376 377 378
    }

    memcpy(mac_secret, ms, i);

    if (!(EVP_CIPHER_flags(c) & EVP_CIPH_FLAG_AEAD_CIPHER)) {
379
        /* TODO(size_t): Convert this function */
380
        mac_key = EVP_PKEY_new_mac_key(mac_type, NULL, mac_secret,
381
                                               (int)*mac_secret_size);
382
        if (mac_key == NULL
383 384 385
            || EVP_DigestSignInit_with_libctx(mac_ctx, NULL, EVP_MD_name(m),
                                              s->ctx->libctx, s->ctx->propq,
                                              mac_key) <= 0) {
386
            EVP_PKEY_free(mac_key);
387 388 389
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
390
        }
391 392
        EVP_PKEY_free(mac_key);
    }
393 394 395 396 397

    OSSL_TRACE_BEGIN(TLS) {
        BIO_printf(trc_out, "which = %04X, mac key:\n", which);
        BIO_dump_indent(trc_out, ms, i, 4);
    } OSSL_TRACE_END(TLS);
398 399

    if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE) {
400
        if (!EVP_CipherInit_ex(dd, c, NULL, key, NULL, (which & SSL3_CC_WRITE))
401 402
            || !EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_GCM_SET_IV_FIXED, (int)k,
                                    iv)) {
403 404 405
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
406
        }
D
Dr. Stephen Henson 已提交
407
    } else if (EVP_CIPHER_mode(c) == EVP_CIPH_CCM_MODE) {
D
Dr. Stephen Henson 已提交
408
        int taglen;
409
        if (s->s3.tmp.
E
Emilia Kasper 已提交
410
            new_cipher->algorithm_enc & (SSL_AES128CCM8 | SSL_AES256CCM8))
411
            taglen = EVP_CCM8_TLS_TAG_LEN;
D
Dr. Stephen Henson 已提交
412
        else
413
            taglen = EVP_CCM_TLS_TAG_LEN;
D
Dr. Stephen Henson 已提交
414 415 416
        if (!EVP_CipherInit_ex(dd, c, NULL, NULL, NULL, (which & SSL3_CC_WRITE))
            || !EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_AEAD_SET_IVLEN, 12, NULL)
            || !EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_AEAD_SET_TAG, taglen, NULL)
417
            || !EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_CCM_SET_IV_FIXED, (int)k, iv)
D
Dr. Stephen Henson 已提交
418
            || !EVP_CipherInit_ex(dd, NULL, NULL, key, NULL, -1)) {
419 420 421
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
D
Dr. Stephen Henson 已提交
422
        }
423 424
    } else {
        if (!EVP_CipherInit_ex(dd, c, NULL, key, iv, (which & SSL3_CC_WRITE))) {
425 426 427
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
428 429
        }
    }
430
    /* Needed for "composite" AEADs, such as RC4-HMAC-MD5 */
431 432
    if ((EVP_CIPHER_flags(c) & EVP_CIPH_FLAG_AEAD_CIPHER) && *mac_secret_size
        && !EVP_CIPHER_CTX_ctrl(dd, EVP_CTRL_AEAD_SET_MAC_KEY,
433
                                (int)*mac_secret_size, mac_secret)) {
434 435 436
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                 ERR_R_INTERNAL_ERROR);
        goto err;
437
    }
438 439 440 441
    if (EVP_CIPHER_provider(c) != NULL
            && !tls_provider_set_tls_params(s, dd, c, m)) {
        /* SSLfatal already called */
        goto err;
442
    }
443

B
Boris Pismenny 已提交
444 445 446 447
#ifndef OPENSSL_NO_KTLS
    if (s->compress)
        goto skip_ktls;

B
Boris Pismenny 已提交
448 449
    if (((which & SSL3_CC_READ) && (s->mode & SSL_MODE_NO_KTLS_RX))
        || ((which & SSL3_CC_WRITE) && (s->mode & SSL_MODE_NO_KTLS_TX)))
B
Boris Pismenny 已提交
450 451 452 453 454 455
        goto skip_ktls;

    /* ktls supports only the maximum fragment size */
    if (ssl_get_max_send_fragment(s) != SSL3_RT_MAX_PLAIN_LENGTH)
        goto skip_ktls;

456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474
# ifdef __FreeBSD__
    memset(&crypto_info, 0, sizeof(crypto_info));
    switch (s->s3.tmp.new_cipher->algorithm_enc) {
    case SSL_AES128GCM:
    case SSL_AES256GCM:
        crypto_info.cipher_algorithm = CRYPTO_AES_NIST_GCM_16;
        crypto_info.iv_len = EVP_GCM_TLS_FIXED_IV_LEN;
        break;
    case SSL_AES128:
    case SSL_AES256:
        if (s->ext.use_etm)
            goto skip_ktls;
        switch (s->s3.tmp.new_cipher->algorithm_mac) {
        case SSL_SHA1:
            crypto_info.auth_algorithm = CRYPTO_SHA1_HMAC;
            break;
        case SSL_SHA256:
            crypto_info.auth_algorithm = CRYPTO_SHA2_256_HMAC;
            break;
475 476 477
        case SSL_SHA384:
            crypto_info.auth_algorithm = CRYPTO_SHA2_384_HMAC;
            break;
478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
        default:
            goto skip_ktls;
        }
        crypto_info.cipher_algorithm = CRYPTO_AES_CBC;
        crypto_info.iv_len = EVP_CIPHER_iv_length(c);
        crypto_info.auth_key = ms;
        crypto_info.auth_key_len = *mac_secret_size;
        break;
    default:
        goto skip_ktls;
    }
    crypto_info.cipher_key = key;
    crypto_info.cipher_key_len = EVP_CIPHER_key_length(c);
    crypto_info.iv = iv;
    crypto_info.tls_vmajor = (s->version >> 8) & 0x000000ff;
    crypto_info.tls_vminor = (s->version & 0x000000ff);
494 495 496
# else /* !defined(__FreeBSD__) */
    /* check that cipher is supported */
    if (!ktls_check_supported_cipher(c, dd))
B
Boris Pismenny 已提交
497 498
        goto skip_ktls;

499
    /* check version */
B
Boris Pismenny 已提交
500 501
    if (s->version != TLS1_2_VERSION)
        goto skip_ktls;
502
# endif
B
Boris Pismenny 已提交
503

B
Boris Pismenny 已提交
504 505 506 507 508 509
    if (which & SSL3_CC_WRITE)
        bio = s->wbio;
    else
        bio = s->rbio;

    if (!ossl_assert(bio != NULL)) {
B
Boris Pismenny 已提交
510 511 512 513 514 515
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                 ERR_R_INTERNAL_ERROR);
        goto err;
    }

    /* All future data will get encrypted by ktls. Flush the BIO or skip ktls */
B
Boris Pismenny 已提交
516 517 518 519
    if (which & SSL3_CC_WRITE) {
       if (BIO_flush(bio) <= 0)
           goto skip_ktls;
    }
B
Boris Pismenny 已提交
520 521

    /* ktls doesn't support renegotiation */
B
Boris Pismenny 已提交
522 523
    if ((BIO_get_ktls_send(s->wbio) && (which & SSL3_CC_WRITE)) ||
        (BIO_get_ktls_recv(s->rbio) && (which & SSL3_CC_READ))) {
B
Boris Pismenny 已提交
524 525 526 527 528
        SSLfatal(s, SSL_AD_NO_RENEGOTIATION, SSL_F_TLS1_CHANGE_CIPHER_STATE,
                 ERR_R_INTERNAL_ERROR);
        goto err;
    }

529
# ifndef __FreeBSD__
B
Boris Pismenny 已提交
530
    if (which & SSL3_CC_WRITE)
531
        rl_sequence = RECORD_LAYER_get_write_sequence(&s->rlayer);
B
Boris Pismenny 已提交
532
    else
533 534 535 536 537
        rl_sequence = RECORD_LAYER_get_read_sequence(&s->rlayer);

    if (!ktls_configure_crypto(c, s->version, dd, rl_sequence, &crypto_info,
                               &rec_seq, iv, key))
        goto skip_ktls;
B
Boris Pismenny 已提交
538 539

    if (which & SSL3_CC_READ) {
540
#  ifndef OPENSSL_NO_KTLS_RX
B
Boris Pismenny 已提交
541 542 543 544 545 546 547
        count_unprocessed = count_unprocessed_records(s);
        if (count_unprocessed < 0)
            goto skip_ktls;

        /* increment the crypto_info record sequence */
        while (count_unprocessed) {
            for (bit = 7; bit >= 0; bit--) { /* increment */
548 549
                ++rec_seq[bit];
                if (rec_seq[bit] != 0)
B
Boris Pismenny 已提交
550 551 552 553
                    break;
            }
            count_unprocessed--;
        }
554 555 556
#  else
        goto skip_ktls;
#  endif
B
Boris Pismenny 已提交
557
    }
558
# endif /* !__FreeBSD__ */
B
Boris Pismenny 已提交
559 560

    /* ktls works with user provided buffers directly */
B
Boris Pismenny 已提交
561 562 563
    if (BIO_set_ktls(bio, &crypto_info, which & SSL3_CC_WRITE)) {
        if (which & SSL3_CC_WRITE)
            ssl3_release_write_buffer(s);
B
Boris Pismenny 已提交
564 565 566 567 568
        SSL_set_options(s, SSL_OP_NO_RENEGOTIATION);
    }

 skip_ktls:
#endif                          /* OPENSSL_NO_KTLS */
569
    s->statem.enc_write_state = ENC_WRITE_STATE_VALID;
570

571 572 573 574 575 576
    OSSL_TRACE_BEGIN(TLS) {
        BIO_printf(trc_out, "which = %04X, key:\n", which);
        BIO_dump_indent(trc_out, key, EVP_CIPHER_key_length(c), 4);
        BIO_printf(trc_out, "iv:\n");
        BIO_dump_indent(trc_out, iv, k, 4);
    } OSSL_TRACE_END(TLS);
577

578
    return 1;
579
 err:
K
KaoruToda 已提交
580
    return 0;
581
}
582

U
Ulf Möller 已提交
583
int tls1_setup_key_block(SSL *s)
584
{
D
Dr. Stephen Henson 已提交
585
    unsigned char *p;
586 587 588
    const EVP_CIPHER *c;
    const EVP_MD *hash;
    SSL_COMP *comp;
589 590
    int mac_type = NID_undef;
    size_t num, mac_secret_size = 0;
591
    int ret = 0;
592

593
    if (s->s3.tmp.key_block_length != 0)
594
        return 1;
595

596 597
    if (!ssl_cipher_get_evp(s->ctx, s->session, &c, &hash, &mac_type,
                            &mac_secret_size, &comp, s->ext.use_etm)) {
598 599
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_SETUP_KEY_BLOCK,
                 SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
K
KaoruToda 已提交
600
        return 0;
601 602
    }

603
    ssl_evp_cipher_free(s->s3.tmp.new_sym_enc);
604
    s->s3.tmp.new_sym_enc = c;
605
    ssl_evp_md_free(s->s3.tmp.new_hash);
606 607 608
    s->s3.tmp.new_hash = hash;
    s->s3.tmp.new_mac_pkey_type = mac_type;
    s->s3.tmp.new_mac_secret_size = mac_secret_size;
E
Emilia Kasper 已提交
609
    num = EVP_CIPHER_key_length(c) + mac_secret_size + EVP_CIPHER_iv_length(c);
610 611 612 613
    num *= 2;

    ssl3_cleanup_key_block(s);

D
Dr. Stephen Henson 已提交
614
    if ((p = OPENSSL_malloc(num)) == NULL) {
615 616
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS1_SETUP_KEY_BLOCK,
                 ERR_R_MALLOC_FAILURE);
617 618 619
        goto err;
    }

620 621
    s->s3.tmp.key_block_length = num;
    s->s3.tmp.key_block = p;
622

623 624
    OSSL_TRACE_BEGIN(TLS) {
        BIO_printf(trc_out, "client random\n");
625
        BIO_dump_indent(trc_out, s->s3.client_random, SSL3_RANDOM_SIZE, 4);
626
        BIO_printf(trc_out, "server random\n");
627
        BIO_dump_indent(trc_out, s->s3.server_random, SSL3_RANDOM_SIZE, 4);
628 629 630 631 632 633
        BIO_printf(trc_out, "master key\n");
        BIO_dump_indent(trc_out,
                        s->session->master_key,
                        s->session->master_key_length, 4);
    } OSSL_TRACE_END(TLS);

634 635
    if (!tls1_generate_key_block(s, p, num)) {
        /* SSLfatal() already called */
636
        goto err;
637
    }
638 639 640 641 642

    OSSL_TRACE_BEGIN(TLS) {
        BIO_printf(trc_out, "key block\n");
        BIO_dump_indent(trc_out, p, num, 4);
    } OSSL_TRACE_END(TLS);
643

644 645 646 647 648 649
    if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)
        && s->method->version <= TLS1_VERSION) {
        /*
         * enable vulnerability countermeasure for CBC ciphers with known-IV
         * problem (http://www.openssl.org/~bodo/tls-cbc.txt)
         */
650
        s->s3.need_empty_fragments = 1;
651 652 653

        if (s->session->cipher != NULL) {
            if (s->session->cipher->algorithm_enc == SSL_eNULL)
654
                s->s3.need_empty_fragments = 0;
655

656
#ifndef OPENSSL_NO_RC4
657
            if (s->session->cipher->algorithm_enc == SSL_RC4)
658
                s->s3.need_empty_fragments = 0;
659
#endif
660 661 662 663 664
        }
    }

    ret = 1;
 err:
K
KaoruToda 已提交
665
    return ret;
666
}
667

668 669
size_t tls1_final_finish_mac(SSL *s, const char *str, size_t slen,
                             unsigned char *out)
670
{
671
    size_t hashlen;
672
    unsigned char hash[EVP_MAX_MD_SIZE];
673 674 675 676
    size_t finished_size = TLS1_FINISH_MAC_LENGTH;

    if (s->s3.tmp.new_cipher->algorithm_mkey & SSL_kGOST18)
        finished_size = 32;
677

678 679
    if (!ssl3_digest_cached_records(s, 0)) {
        /* SSLfatal() already called */
680
        return 0;
681
    }
682

683 684
    if (!ssl_handshake_hash(s, hash, sizeof(hash), &hashlen)) {
        /* SSLfatal() already called */
685
        return 0;
686
    }
687

D
Dr. Stephen Henson 已提交
688
    if (!tls1_PRF(s, str, slen, hash, hashlen, NULL, 0, NULL, 0, NULL, 0,
689
                  s->session->master_key, s->session->master_key_length,
690
                  out, finished_size, 1)) {
691
        /* SSLfatal() already called */
692
        return 0;
693
    }
M
Matt Caswell 已提交
694
    OPENSSL_cleanse(hash, hashlen);
695
    return finished_size;
696
}
697

U
Ulf Möller 已提交
698
int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
699
                                size_t len, size_t *secret_size)
700
{
701
    if (s->session->flags & SSL_SESS_FLAG_EXTMS) {
702
        unsigned char hash[EVP_MAX_MD_SIZE * 2];
703
        size_t hashlen;
E
Emilia Kasper 已提交
704
        /*
V
Veres Lajos 已提交
705
         * Digest cached records keeping record buffer (if present): this won't
E
Emilia Kasper 已提交
706 707
         * affect client auth because we're freezing the buffer at the same
         * point (after client key exchange and before certificate verify)
708
         */
709 710 711
        if (!ssl3_digest_cached_records(s, 1)
                || !ssl_handshake_hash(s, hash, sizeof(hash), &hashlen)) {
            /* SSLfatal() already called */
712
            return 0;
713
        }
714 715 716 717
        OSSL_TRACE_BEGIN(TLS) {
            BIO_printf(trc_out, "Handshake hashes:\n");
            BIO_dump(trc_out, (char *)hash, hashlen);
        } OSSL_TRACE_END(TLS);
718 719 720 721 722 723 724 725 726 727 728
        if (!tls1_PRF(s,
                      TLS_MD_EXTENDED_MASTER_SECRET_CONST,
                      TLS_MD_EXTENDED_MASTER_SECRET_CONST_SIZE,
                      hash, hashlen,
                      NULL, 0,
                      NULL, 0,
                      NULL, 0, p, len, out,
                      SSL3_MASTER_SECRET_SIZE, 1)) {
            /* SSLfatal() already called */
            return 0;
        }
729 730
        OPENSSL_cleanse(hash, hashlen);
    } else {
731 732 733
        if (!tls1_PRF(s,
                      TLS_MD_MASTER_SECRET_CONST,
                      TLS_MD_MASTER_SECRET_CONST_SIZE,
734
                      s->s3.client_random, SSL3_RANDOM_SIZE,
735
                      NULL, 0,
736
                      s->s3.server_random, SSL3_RANDOM_SIZE,
737 738 739 740 741
                      NULL, 0, p, len, out,
                      SSL3_MASTER_SECRET_SIZE, 1)) {
           /* SSLfatal() already called */
            return 0;
        }
742
    }
743 744 745 746 747

    OSSL_TRACE_BEGIN(TLS) {
        BIO_printf(trc_out, "Premaster Secret:\n");
        BIO_dump_indent(trc_out, p, len, 4);
        BIO_printf(trc_out, "Client Random:\n");
748
        BIO_dump_indent(trc_out, s->s3.client_random, SSL3_RANDOM_SIZE, 4);
749
        BIO_printf(trc_out, "Server Random:\n");
750
        BIO_dump_indent(trc_out, s->s3.server_random, SSL3_RANDOM_SIZE, 4);
751 752 753 754 755
        BIO_printf(trc_out, "Master Secret:\n");
        BIO_dump_indent(trc_out,
                        s->session->master_key,
                        SSL3_MASTER_SECRET_SIZE, 4);
    } OSSL_TRACE_END(TLS);
756

757 758
    *secret_size = SSL3_MASTER_SECRET_SIZE;
    return 1;
759
}
760

761
int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen,
762 763 764 765 766
                                const char *label, size_t llen,
                                const unsigned char *context,
                                size_t contextlen, int use_context)
{
    unsigned char *val = NULL;
767
    size_t vallen = 0, currentvalpos;
768
    int rv;
B
Ben Laurie 已提交
769

770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
    /*
     * construct PRF arguments we construct the PRF argument ourself rather
     * than passing separate values into the TLS PRF to ensure that the
     * concatenation of values does not create a prohibited label.
     */
    vallen = llen + SSL3_RANDOM_SIZE * 2;
    if (use_context) {
        vallen += 2 + contextlen;
    }

    val = OPENSSL_malloc(vallen);
    if (val == NULL)
        goto err2;
    currentvalpos = 0;
    memcpy(val + currentvalpos, (unsigned char *)label, llen);
    currentvalpos += llen;
786
    memcpy(val + currentvalpos, s->s3.client_random, SSL3_RANDOM_SIZE);
787
    currentvalpos += SSL3_RANDOM_SIZE;
788
    memcpy(val + currentvalpos, s->s3.server_random, SSL3_RANDOM_SIZE);
789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
    currentvalpos += SSL3_RANDOM_SIZE;

    if (use_context) {
        val[currentvalpos] = (contextlen >> 8) & 0xff;
        currentvalpos++;
        val[currentvalpos] = contextlen & 0xff;
        currentvalpos++;
        if ((contextlen > 0) || (context != NULL)) {
            memcpy(val + currentvalpos, context, contextlen);
        }
    }

    /*
     * disallow prohibited labels note that SSL3_RANDOM_SIZE > max(prohibited
     * label len) = 15, so size of val > max(prohibited label len) = 15 and
     * the comparisons won't have buffer overflow
     */
    if (memcmp(val, TLS_MD_CLIENT_FINISH_CONST,
               TLS_MD_CLIENT_FINISH_CONST_SIZE) == 0)
        goto err1;
    if (memcmp(val, TLS_MD_SERVER_FINISH_CONST,
               TLS_MD_SERVER_FINISH_CONST_SIZE) == 0)
        goto err1;
    if (memcmp(val, TLS_MD_MASTER_SECRET_CONST,
               TLS_MD_MASTER_SECRET_CONST_SIZE) == 0)
        goto err1;
815 816 817
    if (memcmp(val, TLS_MD_EXTENDED_MASTER_SECRET_CONST,
               TLS_MD_EXTENDED_MASTER_SECRET_CONST_SIZE) == 0)
        goto err1;
818 819 820 821
    if (memcmp(val, TLS_MD_KEY_EXPANSION_CONST,
               TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0)
        goto err1;

822
    rv = tls1_PRF(s,
823 824 825 826 827 828
                  val, vallen,
                  NULL, 0,
                  NULL, 0,
                  NULL, 0,
                  NULL, 0,
                  s->session->master_key, s->session->master_key_length,
829
                  out, olen, 0);
B
Ben Laurie 已提交
830

831 832
    goto ret;
 err1:
E
Emilia Kasper 已提交
833
    SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL);
834 835 836 837 838 839
    rv = 0;
    goto ret;
 err2:
    SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, ERR_R_MALLOC_FAILURE);
    rv = 0;
 ret:
840
    OPENSSL_clear_free(val, vallen);
K
KaoruToda 已提交
841
    return rv;
842
}
B
Ben Laurie 已提交
843

U
Ulf Möller 已提交
844
int tls1_alert_code(int code)
845 846 847
{
    switch (code) {
    case SSL_AD_CLOSE_NOTIFY:
K
KaoruToda 已提交
848
        return SSL3_AD_CLOSE_NOTIFY;
849
    case SSL_AD_UNEXPECTED_MESSAGE:
K
KaoruToda 已提交
850
        return SSL3_AD_UNEXPECTED_MESSAGE;
851
    case SSL_AD_BAD_RECORD_MAC:
K
KaoruToda 已提交
852
        return SSL3_AD_BAD_RECORD_MAC;
853
    case SSL_AD_DECRYPTION_FAILED:
K
KaoruToda 已提交
854
        return TLS1_AD_DECRYPTION_FAILED;
855
    case SSL_AD_RECORD_OVERFLOW:
K
KaoruToda 已提交
856
        return TLS1_AD_RECORD_OVERFLOW;
857
    case SSL_AD_DECOMPRESSION_FAILURE:
K
KaoruToda 已提交
858
        return SSL3_AD_DECOMPRESSION_FAILURE;
859
    case SSL_AD_HANDSHAKE_FAILURE:
K
KaoruToda 已提交
860
        return SSL3_AD_HANDSHAKE_FAILURE;
861
    case SSL_AD_NO_CERTIFICATE:
K
KaoruToda 已提交
862
        return -1;
863
    case SSL_AD_BAD_CERTIFICATE:
K
KaoruToda 已提交
864
        return SSL3_AD_BAD_CERTIFICATE;
865
    case SSL_AD_UNSUPPORTED_CERTIFICATE:
K
KaoruToda 已提交
866
        return SSL3_AD_UNSUPPORTED_CERTIFICATE;
867
    case SSL_AD_CERTIFICATE_REVOKED:
K
KaoruToda 已提交
868
        return SSL3_AD_CERTIFICATE_REVOKED;
869
    case SSL_AD_CERTIFICATE_EXPIRED:
K
KaoruToda 已提交
870
        return SSL3_AD_CERTIFICATE_EXPIRED;
871
    case SSL_AD_CERTIFICATE_UNKNOWN:
K
KaoruToda 已提交
872
        return SSL3_AD_CERTIFICATE_UNKNOWN;
873
    case SSL_AD_ILLEGAL_PARAMETER:
K
KaoruToda 已提交
874
        return SSL3_AD_ILLEGAL_PARAMETER;
875
    case SSL_AD_UNKNOWN_CA:
K
KaoruToda 已提交
876
        return TLS1_AD_UNKNOWN_CA;
877
    case SSL_AD_ACCESS_DENIED:
K
KaoruToda 已提交
878
        return TLS1_AD_ACCESS_DENIED;
879
    case SSL_AD_DECODE_ERROR:
K
KaoruToda 已提交
880
        return TLS1_AD_DECODE_ERROR;
881
    case SSL_AD_DECRYPT_ERROR:
K
KaoruToda 已提交
882
        return TLS1_AD_DECRYPT_ERROR;
883
    case SSL_AD_EXPORT_RESTRICTION:
K
KaoruToda 已提交
884
        return TLS1_AD_EXPORT_RESTRICTION;
885
    case SSL_AD_PROTOCOL_VERSION:
K
KaoruToda 已提交
886
        return TLS1_AD_PROTOCOL_VERSION;
887
    case SSL_AD_INSUFFICIENT_SECURITY:
K
KaoruToda 已提交
888
        return TLS1_AD_INSUFFICIENT_SECURITY;
889
    case SSL_AD_INTERNAL_ERROR:
K
KaoruToda 已提交
890
        return TLS1_AD_INTERNAL_ERROR;
891
    case SSL_AD_USER_CANCELLED:
K
KaoruToda 已提交
892
        return TLS1_AD_USER_CANCELLED;
893
    case SSL_AD_NO_RENEGOTIATION:
K
KaoruToda 已提交
894
        return TLS1_AD_NO_RENEGOTIATION;
895
    case SSL_AD_UNSUPPORTED_EXTENSION:
K
KaoruToda 已提交
896
        return TLS1_AD_UNSUPPORTED_EXTENSION;
897
    case SSL_AD_CERTIFICATE_UNOBTAINABLE:
K
KaoruToda 已提交
898
        return TLS1_AD_CERTIFICATE_UNOBTAINABLE;
899
    case SSL_AD_UNRECOGNIZED_NAME:
K
KaoruToda 已提交
900
        return TLS1_AD_UNRECOGNIZED_NAME;
901
    case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
K
KaoruToda 已提交
902
        return TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
903
    case SSL_AD_BAD_CERTIFICATE_HASH_VALUE:
K
KaoruToda 已提交
904
        return TLS1_AD_BAD_CERTIFICATE_HASH_VALUE;
905
    case SSL_AD_UNKNOWN_PSK_IDENTITY:
K
KaoruToda 已提交
906
        return TLS1_AD_UNKNOWN_PSK_IDENTITY;
907
    case SSL_AD_INAPPROPRIATE_FALLBACK:
K
KaoruToda 已提交
908
        return TLS1_AD_INAPPROPRIATE_FALLBACK;
909
    case SSL_AD_NO_APPLICATION_PROTOCOL:
K
KaoruToda 已提交
910
        return TLS1_AD_NO_APPLICATION_PROTOCOL;
911 912
    case SSL_AD_CERTIFICATE_REQUIRED:
        return SSL_AD_HANDSHAKE_FAILURE;
913
    default:
K
KaoruToda 已提交
914
        return -1;
915 916
    }
}