tls13_enc.c 27.8 KB
Newer Older
1
/*
M
Matt Caswell 已提交
2
 * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
3 4 5 6 7 8 9 10 11
 *
 * Licensed under the OpenSSL license (the "License").  You may not use
 * 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
 */

#include <stdlib.h>
#include "ssl_locl.h"
12
#include "internal/cryptlib.h"
13 14 15 16 17 18 19 20 21
#include <openssl/evp.h>
#include <openssl/kdf.h>

#define TLS13_MAX_LABEL_LEN     246

/* Always filled with zeros */
static const unsigned char default_zeros[EVP_MAX_MD_SIZE];

/*
22 23 24 25
 * Given a |secret|; a |label| of length |labellen|; and |data| of length
 * |datalen| (e.g. typically a hash of the handshake messages), derive a new
 * secret |outlen| bytes long and store it in the location pointed to be |out|.
 * The |data| value may be zero length. Returns 1 on success  0 on failure.
26
 */
27
int tls13_hkdf_expand(SSL *s, const EVP_MD *md, const unsigned char *secret,
28
                             const unsigned char *label, size_t labellen,
29
                             const unsigned char *data, size_t datalen,
30 31
                             unsigned char *out, size_t outlen)
{
32
    const unsigned char label_prefix[] = "tls13 ";
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
    EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL);
    int ret;
    size_t hkdflabellen;
    size_t hashlen;
    /*
     * 2 bytes for length of whole HkdfLabel + 1 byte for length of combined
     * prefix and label + bytes for the label itself + bytes for the hash
     */
    unsigned char hkdflabel[sizeof(uint16_t) + sizeof(uint8_t) +
                            + sizeof(label_prefix) + TLS13_MAX_LABEL_LEN
                            + EVP_MAX_MD_SIZE];
    WPACKET pkt;

    if (pctx == NULL)
        return 0;

    hashlen = EVP_MD_size(md);

    if (!WPACKET_init_static_len(&pkt, hkdflabel, sizeof(hkdflabel), 0)
            || !WPACKET_put_bytes_u16(&pkt, outlen)
            || !WPACKET_start_sub_packet_u8(&pkt)
            || !WPACKET_memcpy(&pkt, label_prefix, sizeof(label_prefix) - 1)
            || !WPACKET_memcpy(&pkt, label, labellen)
            || !WPACKET_close(&pkt)
57
            || !WPACKET_sub_memcpy_u8(&pkt, data, (data == NULL) ? 0 : datalen)
58 59
            || !WPACKET_get_total_written(&pkt, &hkdflabellen)
            || !WPACKET_finish(&pkt)) {
60
        EVP_PKEY_CTX_free(pctx);
61
        WPACKET_cleanup(&pkt);
62 63
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_HKDF_EXPAND,
                 ERR_R_INTERNAL_ERROR);
64 65 66 67 68 69 70 71 72 73 74 75 76
        return 0;
    }

    ret = EVP_PKEY_derive_init(pctx) <= 0
            || EVP_PKEY_CTX_hkdf_mode(pctx, EVP_PKEY_HKDEF_MODE_EXPAND_ONLY)
               <= 0
            || EVP_PKEY_CTX_set_hkdf_md(pctx, md) <= 0
            || EVP_PKEY_CTX_set1_hkdf_key(pctx, secret, hashlen) <= 0
            || EVP_PKEY_CTX_add1_hkdf_info(pctx, hkdflabel, hkdflabellen) <= 0
            || EVP_PKEY_derive(pctx, out, &outlen) <= 0;

    EVP_PKEY_CTX_free(pctx);

77 78 79 80
    if (ret != 0)
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_HKDF_EXPAND,
                 ERR_R_INTERNAL_ERROR);

81 82 83 84
    return ret == 0;
}

/*
85 86
 * Given a |secret| generate a |key| of length |keylen| bytes. Returns 1 on
 * success  0 on failure.
87
 */
88 89
int tls13_derive_key(SSL *s, const EVP_MD *md, const unsigned char *secret,
                     unsigned char *key, size_t keylen)
90
{
91 92
    static const unsigned char keylabel[] = "key";

93
    return tls13_hkdf_expand(s, md, secret, keylabel, sizeof(keylabel) - 1,
94
                             NULL, 0, key, keylen);
95 96 97
}

/*
98 99
 * Given a |secret| generate an |iv| of length |ivlen| bytes. Returns 1 on
 * success  0 on failure.
100
 */
101 102
int tls13_derive_iv(SSL *s, const EVP_MD *md, const unsigned char *secret,
                    unsigned char *iv, size_t ivlen)
103
{
104 105
    static const unsigned char ivlabel[] = "iv";

106
    return tls13_hkdf_expand(s, md, secret, ivlabel, sizeof(ivlabel) - 1,
107
                             NULL, 0, iv, ivlen);
108 109
}

110 111 112
int tls13_derive_finishedkey(SSL *s, const EVP_MD *md,
                             const unsigned char *secret,
                             unsigned char *fin, size_t finlen)
M
Matt Caswell 已提交
113
{
114 115
    static const unsigned char finishedlabel[] = "finished";

116
    return tls13_hkdf_expand(s, md, secret, finishedlabel,
117
                             sizeof(finishedlabel) - 1, NULL, 0, fin, finlen);
M
Matt Caswell 已提交
118 119
}

120 121 122
/*
 * Given the previous secret |prevsecret| and a new input secret |insecret| of
 * length |insecretlen|, generate a new secret and store it in the location
123
 * pointed to by |outsecret|. Returns 1 on success  0 on failure.
124
 */
125 126 127 128 129
int tls13_generate_secret(SSL *s, const EVP_MD *md,
                          const unsigned char *prevsecret,
                          const unsigned char *insecret,
                          size_t insecretlen,
                          unsigned char *outsecret)
130 131 132 133
{
    size_t mdlen, prevsecretlen;
    int ret;
    EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL);
134
    static const char derived_secret_label[] = "derived";
135
    unsigned char preextractsec[EVP_MAX_MD_SIZE];
136

137 138 139
    if (pctx == NULL) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_GENERATE_SECRET,
                 ERR_R_INTERNAL_ERROR);
140
        return 0;
141
    }
142 143 144 145 146 147 148 149 150 151 152

    mdlen = EVP_MD_size(md);

    if (insecret == NULL) {
        insecret = default_zeros;
        insecretlen = mdlen;
    }
    if (prevsecret == NULL) {
        prevsecret = default_zeros;
        prevsecretlen = 0;
    } else {
153 154 155 156 157 158 159
        EVP_MD_CTX *mctx = EVP_MD_CTX_new();
        unsigned char hash[EVP_MAX_MD_SIZE];

        /* The pre-extract derive step uses a hash of no messages */
        if (mctx == NULL
                || EVP_DigestInit_ex(mctx, md, NULL) <= 0
                || EVP_DigestFinal_ex(mctx, hash, NULL) <= 0) {
160 161
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_GENERATE_SECRET,
                     ERR_R_INTERNAL_ERROR);
162
            EVP_MD_CTX_free(mctx);
163
            EVP_PKEY_CTX_free(pctx);
164 165 166 167 168 169 170
            return 0;
        }
        EVP_MD_CTX_free(mctx);

        /* Generate the pre-extract secret */
        if (!tls13_hkdf_expand(s, md, prevsecret,
                               (unsigned char *)derived_secret_label,
171
                               sizeof(derived_secret_label) - 1, hash, mdlen,
172
                               preextractsec, mdlen)) {
173
            /* SSLfatal() already called */
174
            EVP_PKEY_CTX_free(pctx);
175
            return 0;
176
        }
177 178

        prevsecret = preextractsec;
179 180 181 182 183 184 185 186 187 188 189 190 191
        prevsecretlen = mdlen;
    }

    ret = EVP_PKEY_derive_init(pctx) <= 0
            || EVP_PKEY_CTX_hkdf_mode(pctx, EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY)
               <= 0
            || EVP_PKEY_CTX_set_hkdf_md(pctx, md) <= 0
            || EVP_PKEY_CTX_set1_hkdf_key(pctx, insecret, insecretlen) <= 0
            || EVP_PKEY_CTX_set1_hkdf_salt(pctx, prevsecret, prevsecretlen)
               <= 0
            || EVP_PKEY_derive(pctx, outsecret, &mdlen)
               <= 0;

192 193 194 195
    if (ret != 0)
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_GENERATE_SECRET,
                 ERR_R_INTERNAL_ERROR);

196
    EVP_PKEY_CTX_free(pctx);
197 198
    if (prevsecret == preextractsec)
        OPENSSL_cleanse(preextractsec, mdlen);
199 200 201 202 203 204
    return ret == 0;
}

/*
 * Given an input secret |insecret| of length |insecretlen| generate the
 * handshake secret. This requires the early secret to already have been
205
 * generated. Returns 1 on success  0 on failure.
206 207 208 209
 */
int tls13_generate_handshake_secret(SSL *s, const unsigned char *insecret,
                                size_t insecretlen)
{
210
    /* Calls SSLfatal() if required */
211 212
    return tls13_generate_secret(s, ssl_handshake_md(s), s->early_secret,
                                 insecret, insecretlen,
213 214 215 216 217
                                 (unsigned char *)&s->handshake_secret);
}

/*
 * Given the handshake secret |prev| of length |prevlen| generate the master
218 219
 * secret and store its length in |*secret_size|. Returns 1 on success  0 on
 * failure.
220 221 222 223 224
 */
int tls13_generate_master_secret(SSL *s, unsigned char *out,
                                 unsigned char *prev, size_t prevlen,
                                 size_t *secret_size)
{
225 226 227
    const EVP_MD *md = ssl_handshake_md(s);

    *secret_size = EVP_MD_size(md);
228
    /* Calls SSLfatal() if required */
229
    return tls13_generate_secret(s, md, prev, NULL, 0, out);
230 231
}

232
/*
233 234
 * Generates the mac for the Finished message. Returns the length of the MAC or
 * 0 on error.
235 236 237 238
 */
size_t tls13_final_finish_mac(SSL *s, const char *str, size_t slen,
                             unsigned char *out)
{
M
Matt Caswell 已提交
239 240 241 242 243
    const EVP_MD *md = ssl_handshake_md(s);
    unsigned char hash[EVP_MAX_MD_SIZE];
    size_t hashlen, ret = 0;
    EVP_PKEY *key = NULL;
    EVP_MD_CTX *ctx = EVP_MD_CTX_new();
244

245 246
    if (!ssl_handshake_hash(s, hash, sizeof(hash), &hashlen)) {
        /* SSLfatal() already called */
M
Matt Caswell 已提交
247
        goto err;
248
    }
M
Matt Caswell 已提交
249 250

    if (str == s->method->ssl3_enc->server_finished_label)
251 252
        key = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL,
                                           s->server_finished_secret, hashlen);
M
Matt Caswell 已提交
253
    else
254 255
        key = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL,
                                           s->client_finished_secret, hashlen);
M
Matt Caswell 已提交
256 257 258 259 260

    if (key == NULL
            || ctx == NULL
            || EVP_DigestSignInit(ctx, NULL, md, NULL, key) <= 0
            || EVP_DigestSignUpdate(ctx, hash, hashlen) <= 0
261 262 263
            || EVP_DigestSignFinal(ctx, out, &hashlen) <= 0) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_FINAL_FINISH_MAC,
                 ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
264
        goto err;
265
    }
266

M
Matt Caswell 已提交
267 268 269 270 271
    ret = hashlen;
 err:
    EVP_PKEY_free(key);
    EVP_MD_CTX_free(ctx);
    return ret;
272 273 274 275
}

/*
 * There isn't really a key block in TLSv1.3, but we still need this function
276
 * for initialising the cipher and hash. Returns 1 on success or 0 on failure.
277 278 279 280 281 282 283 284 285 286
 */
int tls13_setup_key_block(SSL *s)
{
    const EVP_CIPHER *c;
    const EVP_MD *hash;
    int mac_type = NID_undef;

    s->session->cipher = s->s3->tmp.new_cipher;
    if (!ssl_cipher_get_evp
        (s->session, &c, &hash, &mac_type, NULL, NULL, 0)) {
287 288
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_SETUP_KEY_BLOCK,
                 SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
289 290 291 292 293 294 295 296 297
        return 0;
    }

    s->s3->tmp.new_sym_enc = c;
    s->s3->tmp.new_hash = hash;

    return 1;
}

T
Todd Short 已提交
298
static int derive_secret_key_and_iv(SSL *s, int sending, const EVP_MD *md,
299
                                    const EVP_CIPHER *ciph,
300 301 302 303 304 305 306 307 308 309
                                    const unsigned char *insecret,
                                    const unsigned char *hash,
                                    const unsigned char *label,
                                    size_t labellen, unsigned char *secret,
                                    unsigned char *iv, EVP_CIPHER_CTX *ciph_ctx)
{
    unsigned char key[EVP_MAX_KEY_LENGTH];
    size_t ivlen, keylen, taglen;
    size_t hashlen = EVP_MD_size(md);

310 311
    if (!tls13_hkdf_expand(s, md, insecret, label, labellen, hash, hashlen,
                           secret, hashlen)) {
312
        /* SSLfatal() already called */
313 314 315 316 317 318
        goto err;
    }

    /* TODO(size_t): convert me */
    keylen = EVP_CIPHER_key_length(ciph);
    if (EVP_CIPHER_mode(ciph) == EVP_CIPH_CCM_MODE) {
319 320
        uint32_t algenc;

321
        ivlen = EVP_CCM_TLS_IV_LEN;
322 323 324 325 326 327 328
        if (s->s3->tmp.new_cipher == NULL) {
            /* We've not selected a cipher yet - we must be doing early data */
            algenc = s->session->cipher->algorithm_enc;
        } else {
            algenc = s->s3->tmp.new_cipher->algorithm_enc;
        }
        if (algenc & (SSL_AES128CCM8 | SSL_AES256CCM8))
329 330 331 332 333 334 335 336
            taglen = EVP_CCM8_TLS_TAG_LEN;
         else
            taglen = EVP_CCM_TLS_TAG_LEN;
    } else {
        ivlen = EVP_CIPHER_iv_length(ciph);
        taglen = 0;
    }

337 338
    if (!tls13_derive_key(s, md, secret, key, keylen)
            || !tls13_derive_iv(s, md, secret, iv, ivlen)) {
339
        /* SSLfatal() already called */
340 341 342
        goto err;
    }

T
Todd Short 已提交
343
    if (EVP_CipherInit_ex(ciph_ctx, ciph, NULL, NULL, NULL, sending) <= 0
344 345 346 347
        || !EVP_CIPHER_CTX_ctrl(ciph_ctx, EVP_CTRL_AEAD_SET_IVLEN, ivlen, NULL)
        || (taglen != 0 && !EVP_CIPHER_CTX_ctrl(ciph_ctx, EVP_CTRL_AEAD_SET_TAG,
                                                taglen, NULL))
        || EVP_CipherInit_ex(ciph_ctx, NULL, NULL, key, NULL, -1) <= 0) {
348 349
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_DERIVE_SECRET_KEY_AND_IV,
                 ERR_R_EVP_LIB);
350 351 352 353 354 355 356 357 358
        goto err;
    }

    return 1;
 err:
    OPENSSL_cleanse(key, sizeof(key));
    return 0;
}

359 360
int tls13_change_cipher_state(SSL *s, int which)
{
361 362 363 364 365
    static const unsigned char client_early_traffic[] = "c e traffic";
    static const unsigned char client_handshake_traffic[] = "c hs traffic";
    static const unsigned char client_application_traffic[] = "c ap traffic";
    static const unsigned char server_handshake_traffic[] = "s hs traffic";
    static const unsigned char server_application_traffic[] = "s ap traffic";
366
    static const unsigned char exporter_master_secret[] = "exp master";
367
    static const unsigned char resumption_master_secret[] = "res master";
368
    static const unsigned char early_exporter_master_secret[] = "e exp master";
M
Matt Caswell 已提交
369
    unsigned char *iv;
370
    unsigned char secret[EVP_MAX_MD_SIZE];
371 372
    unsigned char hashval[EVP_MAX_MD_SIZE];
    unsigned char *hash = hashval;
373
    unsigned char *insecret;
M
Matt Caswell 已提交
374
    unsigned char *finsecret = NULL;
375
    const char *log_label = NULL;
376
    EVP_CIPHER_CTX *ciph_ctx;
377
    size_t finsecretlen = 0;
378
    const unsigned char *label;
379
    size_t labellen, hashlen = 0;
380
    int ret = 0;
M
Matt Caswell 已提交
381 382
    const EVP_MD *md = NULL;
    const EVP_CIPHER *cipher = NULL;
383 384 385 386 387 388 389

    if (which & SSL3_CC_READ) {
        if (s->enc_read_ctx != NULL) {
            EVP_CIPHER_CTX_reset(s->enc_read_ctx);
        } else {
            s->enc_read_ctx = EVP_CIPHER_CTX_new();
            if (s->enc_read_ctx == NULL) {
390 391
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_MALLOC_FAILURE);
392 393 394 395
                goto err;
            }
        }
        ciph_ctx = s->enc_read_ctx;
M
Matt Caswell 已提交
396
        iv = s->read_iv;
397 398 399 400 401 402 403 404

        RECORD_LAYER_reset_read_sequence(&s->rlayer);
    } else {
        if (s->enc_write_ctx != NULL) {
            EVP_CIPHER_CTX_reset(s->enc_write_ctx);
        } else {
            s->enc_write_ctx = EVP_CIPHER_CTX_new();
            if (s->enc_write_ctx == NULL) {
405 406
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_MALLOC_FAILURE);
407 408
                goto err;
            }
409
            EVP_CIPHER_CTX_ctrl(s->enc_write_ctx, EVP_CTRL_SET_DRBG, 0, s->drbg);
410 411
        }
        ciph_ctx = s->enc_write_ctx;
M
Matt Caswell 已提交
412
        iv = s->write_iv;
413 414 415 416 417 418

        RECORD_LAYER_reset_write_sequence(&s->rlayer);
    }

    if (((which & SSL3_CC_CLIENT) && (which & SSL3_CC_WRITE))
            || ((which & SSL3_CC_SERVER) && (which & SSL3_CC_READ))) {
419 420 421 422 423 424 425 426 427 428 429 430 431 432
        if (which & SSL3_CC_EARLY) {
            EVP_MD_CTX *mdctx = NULL;
            long handlen;
            void *hdata;
            unsigned int hashlenui;
            const SSL_CIPHER *sslcipher = SSL_SESSION_get0_cipher(s->session);

            insecret = s->early_secret;
            label = client_early_traffic;
            labellen = sizeof(client_early_traffic) - 1;
            log_label = CLIENT_EARLY_LABEL;

            handlen = BIO_get_mem_data(s->s3->handshake_buffer, &hdata);
            if (handlen <= 0) {
433 434 435
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS13_CHANGE_CIPHER_STATE,
                         SSL_R_BAD_HANDSHAKE_LENGTH);
436 437
                goto err;
            }
438

439 440 441 442 443 444 445 446 447 448 449
            if (s->early_data_state == SSL_EARLY_DATA_CONNECTING
                    && s->max_early_data > 0
                    && s->session->ext.max_early_data == 0) {
                /*
                 * If we are attempting to send early data, and we've decided to
                 * actually do it but max_early_data in s->session is 0 then we
                 * must be using an external PSK.
                 */
                if (!ossl_assert(s->psksession != NULL
                        && s->max_early_data ==
                           s->psksession->ext.max_early_data)) {
450 451 452
                    SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                             SSL_F_TLS13_CHANGE_CIPHER_STATE,
                             ERR_R_INTERNAL_ERROR);
453 454
                    goto err;
                }
455
                sslcipher = SSL_SESSION_get0_cipher(s->psksession);
456
            }
457
            if (sslcipher == NULL) {
458 459
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS13_CHANGE_CIPHER_STATE, SSL_R_BAD_PSK);
460 461 462 463 464 465 466 467 468 469
                goto err;
            }

            /*
             * We need to calculate the handshake digest using the digest from
             * the session. We haven't yet selected our ciphersuite so we can't
             * use ssl_handshake_md().
             */
            mdctx = EVP_MD_CTX_new();
            if (mdctx == NULL) {
470 471
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_MALLOC_FAILURE);
472 473 474 475 476 477 478
                goto err;
            }
            cipher = EVP_get_cipherbynid(SSL_CIPHER_get_cipher_nid(sslcipher));
            md = ssl_md(sslcipher->algorithm2);
            if (md == NULL || !EVP_DigestInit_ex(mdctx, md, NULL)
                    || !EVP_DigestUpdate(mdctx, hdata, handlen)
                    || !EVP_DigestFinal_ex(mdctx, hashval, &hashlenui)) {
479 480
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
481 482 483 484 485
                EVP_MD_CTX_free(mdctx);
                goto err;
            }
            hashlen = hashlenui;
            EVP_MD_CTX_free(mdctx);
486 487 488 489 490 491 492 493 494 495

            if (!tls13_hkdf_expand(s, md, insecret,
                                   early_exporter_master_secret,
                                   sizeof(early_exporter_master_secret) - 1,
                                   hashval, hashlen,
                                   s->early_exporter_master_secret, hashlen)) {
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
                goto err;
            }
496
        } else if (which & SSL3_CC_HANDSHAKE) {
497
            insecret = s->handshake_secret;
M
Matt Caswell 已提交
498
            finsecret = s->client_finished_secret;
499
            finsecretlen = EVP_MD_size(ssl_handshake_md(s));
500 501
            label = client_handshake_traffic;
            labellen = sizeof(client_handshake_traffic) - 1;
502
            log_label = CLIENT_HANDSHAKE_LABEL;
503
            /*
F
FdaSilvaYY 已提交
504
             * The handshake hash used for the server read/client write handshake
505 506 507 508 509 510
             * traffic secret is the same as the hash for the server
             * write/client read handshake traffic secret. However, if we
             * processed early data then we delay changing the server
             * read/client write cipher state until later, and the handshake
             * hashes have moved on. Therefore we use the value saved earlier
             * when we did the server write/client read change cipher state.
511
             */
512
            hash = s->handshake_traffic_hash;
513
        } else {
514
            insecret = s->master_secret;
515 516
            label = client_application_traffic;
            labellen = sizeof(client_application_traffic) - 1;
517
            log_label = CLIENT_APPLICATION_LABEL;
518 519 520 521 522 523 524
            /*
             * For this we only use the handshake hashes up until the server
             * Finished hash. We do not include the client's Finished, which is
             * what ssl_handshake_hash() would give us. Instead we use the
             * previously saved value.
             */
            hash = s->server_finished_hash;
525 526
        }
    } else {
527
        /* Early data never applies to client-read/server-write */
528 529
        if (which & SSL3_CC_HANDSHAKE) {
            insecret = s->handshake_secret;
M
Matt Caswell 已提交
530
            finsecret = s->server_finished_secret;
531
            finsecretlen = EVP_MD_size(ssl_handshake_md(s));
532 533
            label = server_handshake_traffic;
            labellen = sizeof(server_handshake_traffic) - 1;
534
            log_label = SERVER_HANDSHAKE_LABEL;
535
        } else {
536
            insecret = s->master_secret;
537 538
            label = server_application_traffic;
            labellen = sizeof(server_application_traffic) - 1;
539
            log_label = SERVER_APPLICATION_LABEL;
540 541 542
        }
    }

543 544 545 546 547
    if (!(which & SSL3_CC_EARLY)) {
        md = ssl_handshake_md(s);
        cipher = s->s3->tmp.new_sym_enc;
        if (!ssl3_digest_cached_records(s, 1)
                || !ssl_handshake_hash(s, hashval, sizeof(hashval), &hashlen)) {
548
            /* SSLfatal() already called */;
549 550
            goto err;
        }
551 552
    }

553 554 555 556 557 558 559
    /*
     * Save the hash of handshakes up to now for use when we calculate the
     * client application traffic secret
     */
    if (label == server_application_traffic)
        memcpy(s->server_finished_hash, hashval, hashlen);

560
    if (label == server_handshake_traffic)
561 562
        memcpy(s->handshake_traffic_hash, hashval, hashlen);

563 564 565 566 567 568 569 570
    if (label == client_application_traffic) {
        /*
         * We also create the resumption master secret, but this time use the
         * hash for the whole handshake including the Client Finished
         */
        if (!tls13_hkdf_expand(s, ssl_handshake_md(s), insecret,
                               resumption_master_secret,
                               sizeof(resumption_master_secret) - 1,
571 572
                               hashval, hashlen, s->session->master_key,
                               hashlen)) {
573
            /* SSLfatal() already called */
574 575 576 577 578
            goto err;
        }
        s->session->master_key_length = hashlen;
    }

579 580 581
    if (!derive_secret_key_and_iv(s, which & SSL3_CC_WRITE, md, cipher,
                                  insecret, hash, label, labellen, secret, iv,
                                  ciph_ctx)) {
582
        /* SSLfatal() already called */
583
        goto err;
584
    }
585

586
    if (label == server_application_traffic) {
587
        memcpy(s->server_app_traffic_secret, secret, hashlen);
588 589 590 591 592 593 594 595 596 597
        /* Now we create the exporter master secret */
        if (!tls13_hkdf_expand(s, ssl_handshake_md(s), insecret,
                               exporter_master_secret,
                               sizeof(exporter_master_secret) - 1,
                               hash, hashlen, s->exporter_master_secret,
                               hashlen)) {
            /* SSLfatal() already called */
            goto err;
        }
    } else if (label == client_application_traffic)
598 599
        memcpy(s->client_app_traffic_secret, secret, hashlen);

600
    if (!ssl_log_secret(s, log_label, secret, hashlen)) {
601
        /* SSLfatal() already called */
602 603 604
        goto err;
    }

605 606 607
    if (finsecret != NULL
            && !tls13_derive_finishedkey(s, ssl_handshake_md(s), secret,
                                         finsecret, finsecretlen)) {
608
        /* SSLfatal() already called */
609 610 611
        goto err;
    }

612 613 614 615 616
    ret = 1;
 err:
    OPENSSL_cleanse(secret, sizeof(secret));
    return ret;
}
617

T
Todd Short 已提交
618
int tls13_update_key(SSL *s, int sending)
619
{
620
    static const unsigned char application_traffic[] = "traffic upd";
621 622 623 624 625 626
    const EVP_MD *md = ssl_handshake_md(s);
    size_t hashlen = EVP_MD_size(md);
    unsigned char *insecret, *iv;
    unsigned char secret[EVP_MAX_MD_SIZE];
    EVP_CIPHER_CTX *ciph_ctx;
    int ret = 0;
627

T
Todd Short 已提交
628
    if (s->server == sending)
629 630 631
        insecret = s->server_app_traffic_secret;
    else
        insecret = s->client_app_traffic_secret;
M
Matt Caswell 已提交
632

T
Todd Short 已提交
633
    if (sending) {
634 635 636 637 638 639 640
        iv = s->write_iv;
        ciph_ctx = s->enc_write_ctx;
        RECORD_LAYER_reset_write_sequence(&s->rlayer);
    } else {
        iv = s->read_iv;
        ciph_ctx = s->enc_read_ctx;
        RECORD_LAYER_reset_read_sequence(&s->rlayer);
641
    }
642

T
Todd Short 已提交
643
    if (!derive_secret_key_and_iv(s, sending, ssl_handshake_md(s),
644 645
                                  s->s3->tmp.new_sym_enc, insecret, NULL,
                                  application_traffic,
646
                                  sizeof(application_traffic) - 1, secret, iv,
647 648
                                  ciph_ctx)) {
        /* SSLfatal() already called */
649
        goto err;
650
    }
651 652

    memcpy(insecret, secret, hashlen);
653

654
    ret = 1;
655 656
 err:
    OPENSSL_cleanse(secret, sizeof(secret));
657
    return ret;
658
}
659 660 661

int tls13_alert_code(int code)
{
662
    if (code == SSL_AD_MISSING_EXTENSION)
663 664 665 666
        return code;

    return tls1_alert_code(code);
}
667 668 669 670 671 672 673 674

int tls13_export_keying_material(SSL *s, unsigned char *out, size_t olen,
                                 const char *label, size_t llen,
                                 const unsigned char *context,
                                 size_t contextlen, int use_context)
{
    unsigned char exportsecret[EVP_MAX_MD_SIZE];
    static const unsigned char exporterlabel[] = "exporter";
675
    unsigned char hash[EVP_MAX_MD_SIZE], data[EVP_MAX_MD_SIZE];
676 677
    const EVP_MD *md = ssl_handshake_md(s);
    EVP_MD_CTX *ctx = EVP_MD_CTX_new();
678
    unsigned int hashsize, datalen;
679 680
    int ret = 0;

681
    if (ctx == NULL || !ossl_statem_export_allowed(s))
682 683 684 685 686 687 688 689
        goto err;

    if (!use_context)
        contextlen = 0;

    if (EVP_DigestInit_ex(ctx, md, NULL) <= 0
            || EVP_DigestUpdate(ctx, context, contextlen) <= 0
            || EVP_DigestFinal_ex(ctx, hash, &hashsize) <= 0
690 691
            || EVP_DigestInit_ex(ctx, md, NULL) <= 0
            || EVP_DigestFinal_ex(ctx, data, &datalen) <= 0
692
            || !tls13_hkdf_expand(s, md, s->exporter_master_secret,
693 694
                                  (const unsigned char *)label, llen,
                                  data, datalen, exportsecret, hashsize)
695
            || !tls13_hkdf_expand(s, md, exportsecret, exporterlabel,
696 697
                                  sizeof(exporterlabel) - 1, hash, hashsize,
                                  out, olen))
698 699 700 701 702 703 704
        goto err;

    ret = 1;
 err:
    EVP_MD_CTX_free(ctx);
    return ret;
}
705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763

int tls13_export_keying_material_early(SSL *s, unsigned char *out, size_t olen,
                                       const char *label, size_t llen,
                                       const unsigned char *context,
                                       size_t contextlen)
{
    static const unsigned char exporterlabel[] = "exporter";
    unsigned char exportsecret[EVP_MAX_MD_SIZE];
    unsigned char hash[EVP_MAX_MD_SIZE], data[EVP_MAX_MD_SIZE];
    const EVP_MD *md;
    EVP_MD_CTX *ctx = EVP_MD_CTX_new();
    unsigned int hashsize, datalen;
    int ret = 0;
    const SSL_CIPHER *sslcipher;

    if (ctx == NULL || !ossl_statem_export_early_allowed(s))
        goto err;

    if (!s->server && s->max_early_data > 0
            && s->session->ext.max_early_data == 0)
        sslcipher = SSL_SESSION_get0_cipher(s->psksession);
    else
        sslcipher = SSL_SESSION_get0_cipher(s->session);

    md = ssl_md(sslcipher->algorithm2);

    /*
     * Calculate the hash value and store it in |data|. The reason why
     * the empty string is used is that the definition of TLS-Exporter
     * is like so:
     *
     * TLS-Exporter(label, context_value, key_length) =
     *     HKDF-Expand-Label(Derive-Secret(Secret, label, ""),
     *                       "exporter", Hash(context_value), key_length)
     *
     * Derive-Secret(Secret, Label, Messages) =
     *       HKDF-Expand-Label(Secret, Label,
     *                         Transcript-Hash(Messages), Hash.length)
     *
     * Here Transcript-Hash is the cipher suite hash algorithm.
     */
    if (EVP_DigestInit_ex(ctx, md, NULL) <= 0
            || EVP_DigestUpdate(ctx, context, contextlen) <= 0
            || EVP_DigestFinal_ex(ctx, hash, &hashsize) <= 0
            || EVP_DigestInit_ex(ctx, md, NULL) <= 0
            || EVP_DigestFinal_ex(ctx, data, &datalen) <= 0
            || !tls13_hkdf_expand(s, md, s->early_exporter_master_secret,
                                  (const unsigned char *)label, llen,
                                  data, datalen, exportsecret, hashsize)
            || !tls13_hkdf_expand(s, md, exportsecret, exporterlabel,
                                  sizeof(exporterlabel) - 1, hash, hashsize,
                                  out, olen))
        goto err;

    ret = 1;
 err:
    EVP_MD_CTX_free(ctx);
    return ret;
}