lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2016-2022 The OpenSSL Project Authors. All Rights Reserved. |
| 3 | * |
| 4 | * Licensed under the OpenSSL license (the "License"). You may not use |
| 5 | * this file except in compliance with the License. You can obtain a copy |
| 6 | * in the file LICENSE in the source distribution or at |
| 7 | * https://www.openssl.org/source/license.html |
| 8 | */ |
| 9 | |
| 10 | #include <stdlib.h> |
| 11 | #include "ssl_local.h" |
| 12 | #include "internal/cryptlib.h" |
| 13 | #include <openssl/evp.h> |
| 14 | #include <openssl/kdf.h> |
| 15 | |
| 16 | #define TLS13_MAX_LABEL_LEN 249 |
| 17 | |
| 18 | /* Always filled with zeros */ |
| 19 | static const unsigned char default_zeros[EVP_MAX_MD_SIZE]; |
| 20 | |
| 21 | /* |
| 22 | * Given a |secret|; a |label| of length |labellen|; and |data| of length |
| 23 | * |datalen| (e.g. typically a hash of the handshake messages), derive a new |
| 24 | * secret |outlen| bytes long and store it in the location pointed to be |out|. |
| 25 | * The |data| value may be zero length. Any errors will be treated as fatal if |
| 26 | * |fatal| is set. Returns 1 on success 0 on failure. |
| 27 | */ |
| 28 | int tls13_hkdf_expand(SSL *s, const EVP_MD *md, const unsigned char *secret, |
| 29 | const unsigned char *label, size_t labellen, |
| 30 | const unsigned char *data, size_t datalen, |
| 31 | unsigned char *out, size_t outlen, int fatal) |
| 32 | { |
| 33 | #ifdef CHARSET_EBCDIC |
| 34 | static const unsigned char label_prefix[] = { 0x74, 0x6C, 0x73, 0x31, 0x33, 0x20, 0x00 }; |
| 35 | #else |
| 36 | static const unsigned char label_prefix[] = "tls13 "; |
| 37 | #endif |
| 38 | EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL); |
| 39 | int ret; |
| 40 | size_t hkdflabellen; |
| 41 | size_t hashlen; |
| 42 | /* |
| 43 | * 2 bytes for length of derived secret + 1 byte for length of combined |
| 44 | * prefix and label + bytes for the label itself + 1 byte length of hash |
| 45 | * + bytes for the hash itself |
| 46 | */ |
| 47 | unsigned char hkdflabel[sizeof(uint16_t) + sizeof(uint8_t) |
| 48 | + (sizeof(label_prefix) - 1) + TLS13_MAX_LABEL_LEN |
| 49 | + 1 + EVP_MAX_MD_SIZE]; |
| 50 | WPACKET pkt; |
| 51 | |
| 52 | if (pctx == NULL) |
| 53 | return 0; |
| 54 | |
| 55 | if (labellen > TLS13_MAX_LABEL_LEN) { |
| 56 | if (fatal) { |
| 57 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_HKDF_EXPAND, |
| 58 | ERR_R_INTERNAL_ERROR); |
| 59 | } else { |
| 60 | /* |
| 61 | * Probably we have been called from SSL_export_keying_material(), |
| 62 | * or SSL_export_keying_material_early(). |
| 63 | */ |
| 64 | SSLerr(SSL_F_TLS13_HKDF_EXPAND, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL); |
| 65 | } |
| 66 | EVP_PKEY_CTX_free(pctx); |
| 67 | return 0; |
| 68 | } |
| 69 | |
| 70 | hashlen = EVP_MD_size(md); |
| 71 | |
| 72 | if (!WPACKET_init_static_len(&pkt, hkdflabel, sizeof(hkdflabel), 0) |
| 73 | || !WPACKET_put_bytes_u16(&pkt, outlen) |
| 74 | || !WPACKET_start_sub_packet_u8(&pkt) |
| 75 | || !WPACKET_memcpy(&pkt, label_prefix, sizeof(label_prefix) - 1) |
| 76 | || !WPACKET_memcpy(&pkt, label, labellen) |
| 77 | || !WPACKET_close(&pkt) |
| 78 | || !WPACKET_sub_memcpy_u8(&pkt, data, (data == NULL) ? 0 : datalen) |
| 79 | || !WPACKET_get_total_written(&pkt, &hkdflabellen) |
| 80 | || !WPACKET_finish(&pkt)) { |
| 81 | EVP_PKEY_CTX_free(pctx); |
| 82 | WPACKET_cleanup(&pkt); |
| 83 | if (fatal) |
| 84 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_HKDF_EXPAND, |
| 85 | ERR_R_INTERNAL_ERROR); |
| 86 | else |
| 87 | SSLerr(SSL_F_TLS13_HKDF_EXPAND, ERR_R_INTERNAL_ERROR); |
| 88 | return 0; |
| 89 | } |
| 90 | |
| 91 | ret = EVP_PKEY_derive_init(pctx) <= 0 |
| 92 | || EVP_PKEY_CTX_hkdf_mode(pctx, EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) |
| 93 | <= 0 |
| 94 | || EVP_PKEY_CTX_set_hkdf_md(pctx, md) <= 0 |
| 95 | || EVP_PKEY_CTX_set1_hkdf_key(pctx, secret, hashlen) <= 0 |
| 96 | || EVP_PKEY_CTX_add1_hkdf_info(pctx, hkdflabel, hkdflabellen) <= 0 |
| 97 | || EVP_PKEY_derive(pctx, out, &outlen) <= 0; |
| 98 | |
| 99 | EVP_PKEY_CTX_free(pctx); |
| 100 | |
| 101 | if (ret != 0) { |
| 102 | if (fatal) |
| 103 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_HKDF_EXPAND, |
| 104 | ERR_R_INTERNAL_ERROR); |
| 105 | else |
| 106 | SSLerr(SSL_F_TLS13_HKDF_EXPAND, ERR_R_INTERNAL_ERROR); |
| 107 | } |
| 108 | |
| 109 | return ret == 0; |
| 110 | } |
| 111 | |
| 112 | /* |
| 113 | * Given a |secret| generate a |key| of length |keylen| bytes. Returns 1 on |
| 114 | * success 0 on failure. |
| 115 | */ |
| 116 | int tls13_derive_key(SSL *s, const EVP_MD *md, const unsigned char *secret, |
| 117 | unsigned char *key, size_t keylen) |
| 118 | { |
| 119 | #ifdef CHARSET_EBCDIC |
| 120 | static const unsigned char keylabel[] ={ 0x6B, 0x65, 0x79, 0x00 }; |
| 121 | #else |
| 122 | static const unsigned char keylabel[] = "key"; |
| 123 | #endif |
| 124 | |
| 125 | return tls13_hkdf_expand(s, md, secret, keylabel, sizeof(keylabel) - 1, |
| 126 | NULL, 0, key, keylen, 1); |
| 127 | } |
| 128 | |
| 129 | /* |
| 130 | * Given a |secret| generate an |iv| of length |ivlen| bytes. Returns 1 on |
| 131 | * success 0 on failure. |
| 132 | */ |
| 133 | int tls13_derive_iv(SSL *s, const EVP_MD *md, const unsigned char *secret, |
| 134 | unsigned char *iv, size_t ivlen) |
| 135 | { |
| 136 | #ifdef CHARSET_EBCDIC |
| 137 | static const unsigned char ivlabel[] = { 0x69, 0x76, 0x00 }; |
| 138 | #else |
| 139 | static const unsigned char ivlabel[] = "iv"; |
| 140 | #endif |
| 141 | |
| 142 | return tls13_hkdf_expand(s, md, secret, ivlabel, sizeof(ivlabel) - 1, |
| 143 | NULL, 0, iv, ivlen, 1); |
| 144 | } |
| 145 | |
| 146 | int tls13_derive_finishedkey(SSL *s, const EVP_MD *md, |
| 147 | const unsigned char *secret, |
| 148 | unsigned char *fin, size_t finlen) |
| 149 | { |
| 150 | #ifdef CHARSET_EBCDIC |
| 151 | static const unsigned char finishedlabel[] = { 0x66, 0x69, 0x6E, 0x69, 0x73, 0x68, 0x65, 0x64, 0x00 }; |
| 152 | #else |
| 153 | static const unsigned char finishedlabel[] = "finished"; |
| 154 | #endif |
| 155 | |
| 156 | return tls13_hkdf_expand(s, md, secret, finishedlabel, |
| 157 | sizeof(finishedlabel) - 1, NULL, 0, fin, finlen, 1); |
| 158 | } |
| 159 | |
| 160 | /* |
| 161 | * Given the previous secret |prevsecret| and a new input secret |insecret| of |
| 162 | * length |insecretlen|, generate a new secret and store it in the location |
| 163 | * pointed to by |outsecret|. Returns 1 on success 0 on failure. |
| 164 | */ |
| 165 | int tls13_generate_secret(SSL *s, const EVP_MD *md, |
| 166 | const unsigned char *prevsecret, |
| 167 | const unsigned char *insecret, |
| 168 | size_t insecretlen, |
| 169 | unsigned char *outsecret) |
| 170 | { |
| 171 | size_t mdlen, prevsecretlen; |
| 172 | int mdleni; |
| 173 | int ret; |
| 174 | EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL); |
| 175 | #ifdef CHARSET_EBCDIC |
| 176 | static const char derived_secret_label[] = { 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x00 }; |
| 177 | #else |
| 178 | static const char derived_secret_label[] = "derived"; |
| 179 | #endif |
| 180 | unsigned char preextractsec[EVP_MAX_MD_SIZE]; |
| 181 | |
| 182 | if (pctx == NULL) { |
| 183 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_GENERATE_SECRET, |
| 184 | ERR_R_INTERNAL_ERROR); |
| 185 | return 0; |
| 186 | } |
| 187 | |
| 188 | mdleni = EVP_MD_size(md); |
| 189 | /* Ensure cast to size_t is safe */ |
| 190 | if (!ossl_assert(mdleni >= 0)) { |
| 191 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_GENERATE_SECRET, |
| 192 | ERR_R_INTERNAL_ERROR); |
| 193 | EVP_PKEY_CTX_free(pctx); |
| 194 | return 0; |
| 195 | } |
| 196 | mdlen = (size_t)mdleni; |
| 197 | |
| 198 | if (insecret == NULL) { |
| 199 | insecret = default_zeros; |
| 200 | insecretlen = mdlen; |
| 201 | } |
| 202 | if (prevsecret == NULL) { |
| 203 | prevsecret = default_zeros; |
| 204 | prevsecretlen = 0; |
| 205 | } else { |
| 206 | EVP_MD_CTX *mctx = EVP_MD_CTX_new(); |
| 207 | unsigned char hash[EVP_MAX_MD_SIZE]; |
| 208 | |
| 209 | /* The pre-extract derive step uses a hash of no messages */ |
| 210 | if (mctx == NULL |
| 211 | || EVP_DigestInit_ex(mctx, md, NULL) <= 0 |
| 212 | || EVP_DigestFinal_ex(mctx, hash, NULL) <= 0) { |
| 213 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_GENERATE_SECRET, |
| 214 | ERR_R_INTERNAL_ERROR); |
| 215 | EVP_MD_CTX_free(mctx); |
| 216 | EVP_PKEY_CTX_free(pctx); |
| 217 | return 0; |
| 218 | } |
| 219 | EVP_MD_CTX_free(mctx); |
| 220 | |
| 221 | /* Generate the pre-extract secret */ |
| 222 | if (!tls13_hkdf_expand(s, md, prevsecret, |
| 223 | (unsigned char *)derived_secret_label, |
| 224 | sizeof(derived_secret_label) - 1, hash, mdlen, |
| 225 | preextractsec, mdlen, 1)) { |
| 226 | /* SSLfatal() already called */ |
| 227 | EVP_PKEY_CTX_free(pctx); |
| 228 | return 0; |
| 229 | } |
| 230 | |
| 231 | prevsecret = preextractsec; |
| 232 | prevsecretlen = mdlen; |
| 233 | } |
| 234 | |
| 235 | ret = EVP_PKEY_derive_init(pctx) <= 0 |
| 236 | || EVP_PKEY_CTX_hkdf_mode(pctx, EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY) |
| 237 | <= 0 |
| 238 | || EVP_PKEY_CTX_set_hkdf_md(pctx, md) <= 0 |
| 239 | || EVP_PKEY_CTX_set1_hkdf_key(pctx, insecret, insecretlen) <= 0 |
| 240 | || EVP_PKEY_CTX_set1_hkdf_salt(pctx, prevsecret, prevsecretlen) |
| 241 | <= 0 |
| 242 | || EVP_PKEY_derive(pctx, outsecret, &mdlen) |
| 243 | <= 0; |
| 244 | |
| 245 | if (ret != 0) |
| 246 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_GENERATE_SECRET, |
| 247 | ERR_R_INTERNAL_ERROR); |
| 248 | |
| 249 | EVP_PKEY_CTX_free(pctx); |
| 250 | if (prevsecret == preextractsec) |
| 251 | OPENSSL_cleanse(preextractsec, mdlen); |
| 252 | return ret == 0; |
| 253 | } |
| 254 | |
| 255 | /* |
| 256 | * Given an input secret |insecret| of length |insecretlen| generate the |
| 257 | * handshake secret. This requires the early secret to already have been |
| 258 | * generated. Returns 1 on success 0 on failure. |
| 259 | */ |
| 260 | int tls13_generate_handshake_secret(SSL *s, const unsigned char *insecret, |
| 261 | size_t insecretlen) |
| 262 | { |
| 263 | /* Calls SSLfatal() if required */ |
| 264 | return tls13_generate_secret(s, ssl_handshake_md(s), s->early_secret, |
| 265 | insecret, insecretlen, |
| 266 | (unsigned char *)&s->handshake_secret); |
| 267 | } |
| 268 | |
| 269 | /* |
| 270 | * Given the handshake secret |prev| of length |prevlen| generate the master |
| 271 | * secret and store its length in |*secret_size|. Returns 1 on success 0 on |
| 272 | * failure. |
| 273 | */ |
| 274 | int tls13_generate_master_secret(SSL *s, unsigned char *out, |
| 275 | unsigned char *prev, size_t prevlen, |
| 276 | size_t *secret_size) |
| 277 | { |
| 278 | const EVP_MD *md = ssl_handshake_md(s); |
| 279 | |
| 280 | *secret_size = EVP_MD_size(md); |
| 281 | /* Calls SSLfatal() if required */ |
| 282 | return tls13_generate_secret(s, md, prev, NULL, 0, out); |
| 283 | } |
| 284 | |
| 285 | /* |
| 286 | * Generates the mac for the Finished message. Returns the length of the MAC or |
| 287 | * 0 on error. |
| 288 | */ |
| 289 | size_t tls13_final_finish_mac(SSL *s, const char *str, size_t slen, |
| 290 | unsigned char *out) |
| 291 | { |
| 292 | const EVP_MD *md = ssl_handshake_md(s); |
| 293 | unsigned char hash[EVP_MAX_MD_SIZE]; |
| 294 | size_t hashlen, ret = 0; |
| 295 | EVP_PKEY *key = NULL; |
| 296 | EVP_MD_CTX *ctx = EVP_MD_CTX_new(); |
| 297 | |
| 298 | if (!ssl_handshake_hash(s, hash, sizeof(hash), &hashlen)) { |
| 299 | /* SSLfatal() already called */ |
| 300 | goto err; |
| 301 | } |
| 302 | |
| 303 | if (str == s->method->ssl3_enc->server_finished_label) { |
| 304 | key = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL, |
| 305 | s->server_finished_secret, hashlen); |
| 306 | } else if (SSL_IS_FIRST_HANDSHAKE(s)) { |
| 307 | key = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL, |
| 308 | s->client_finished_secret, hashlen); |
| 309 | } else { |
| 310 | unsigned char finsecret[EVP_MAX_MD_SIZE]; |
| 311 | |
| 312 | if (!tls13_derive_finishedkey(s, ssl_handshake_md(s), |
| 313 | s->client_app_traffic_secret, |
| 314 | finsecret, hashlen)) |
| 315 | goto err; |
| 316 | |
| 317 | key = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL, finsecret, |
| 318 | hashlen); |
| 319 | OPENSSL_cleanse(finsecret, sizeof(finsecret)); |
| 320 | } |
| 321 | |
| 322 | if (key == NULL |
| 323 | || ctx == NULL |
| 324 | || EVP_DigestSignInit(ctx, NULL, md, NULL, key) <= 0 |
| 325 | || EVP_DigestSignUpdate(ctx, hash, hashlen) <= 0 |
| 326 | || EVP_DigestSignFinal(ctx, out, &hashlen) <= 0) { |
| 327 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_FINAL_FINISH_MAC, |
| 328 | ERR_R_INTERNAL_ERROR); |
| 329 | goto err; |
| 330 | } |
| 331 | |
| 332 | ret = hashlen; |
| 333 | err: |
| 334 | EVP_PKEY_free(key); |
| 335 | EVP_MD_CTX_free(ctx); |
| 336 | return ret; |
| 337 | } |
| 338 | |
| 339 | /* |
| 340 | * There isn't really a key block in TLSv1.3, but we still need this function |
| 341 | * for initialising the cipher and hash. Returns 1 on success or 0 on failure. |
| 342 | */ |
| 343 | int tls13_setup_key_block(SSL *s) |
| 344 | { |
| 345 | const EVP_CIPHER *c; |
| 346 | const EVP_MD *hash; |
| 347 | |
| 348 | s->session->cipher = s->s3->tmp.new_cipher; |
| 349 | if (!ssl_cipher_get_evp(s->session, &c, &hash, NULL, NULL, NULL, 0)) { |
| 350 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_SETUP_KEY_BLOCK, |
| 351 | SSL_R_CIPHER_OR_HASH_UNAVAILABLE); |
| 352 | return 0; |
| 353 | } |
| 354 | |
| 355 | s->s3->tmp.new_sym_enc = c; |
| 356 | s->s3->tmp.new_hash = hash; |
| 357 | |
| 358 | return 1; |
| 359 | } |
| 360 | |
| 361 | static int derive_secret_key_and_iv(SSL *s, int sending, const EVP_MD *md, |
| 362 | const EVP_CIPHER *ciph, |
| 363 | const unsigned char *insecret, |
| 364 | const unsigned char *hash, |
| 365 | const unsigned char *label, |
| 366 | size_t labellen, unsigned char *secret, |
| 367 | unsigned char *iv, EVP_CIPHER_CTX *ciph_ctx) |
| 368 | { |
| 369 | unsigned char key[EVP_MAX_KEY_LENGTH]; |
| 370 | size_t ivlen, keylen, taglen; |
| 371 | int hashleni = EVP_MD_size(md); |
| 372 | size_t hashlen; |
| 373 | |
| 374 | /* Ensure cast to size_t is safe */ |
| 375 | if (!ossl_assert(hashleni >= 0)) { |
| 376 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_DERIVE_SECRET_KEY_AND_IV, |
| 377 | ERR_R_EVP_LIB); |
| 378 | goto err; |
| 379 | } |
| 380 | hashlen = (size_t)hashleni; |
| 381 | |
| 382 | if (!tls13_hkdf_expand(s, md, insecret, label, labellen, hash, hashlen, |
| 383 | secret, hashlen, 1)) { |
| 384 | /* SSLfatal() already called */ |
| 385 | goto err; |
| 386 | } |
| 387 | |
| 388 | /* TODO(size_t): convert me */ |
| 389 | keylen = EVP_CIPHER_key_length(ciph); |
| 390 | if (EVP_CIPHER_mode(ciph) == EVP_CIPH_CCM_MODE) { |
| 391 | uint32_t algenc; |
| 392 | |
| 393 | ivlen = EVP_CCM_TLS_IV_LEN; |
| 394 | if (s->s3->tmp.new_cipher != NULL) { |
| 395 | algenc = s->s3->tmp.new_cipher->algorithm_enc; |
| 396 | } else if (s->session->cipher != NULL) { |
| 397 | /* We've not selected a cipher yet - we must be doing early data */ |
| 398 | algenc = s->session->cipher->algorithm_enc; |
| 399 | } else if (s->psksession != NULL && s->psksession->cipher != NULL) { |
| 400 | /* We must be doing early data with out-of-band PSK */ |
| 401 | algenc = s->psksession->cipher->algorithm_enc; |
| 402 | } else { |
| 403 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_DERIVE_SECRET_KEY_AND_IV, |
| 404 | ERR_R_EVP_LIB); |
| 405 | goto err; |
| 406 | } |
| 407 | if (algenc & (SSL_AES128CCM8 | SSL_AES256CCM8)) |
| 408 | taglen = EVP_CCM8_TLS_TAG_LEN; |
| 409 | else |
| 410 | taglen = EVP_CCM_TLS_TAG_LEN; |
| 411 | } else { |
| 412 | ivlen = EVP_CIPHER_iv_length(ciph); |
| 413 | taglen = 0; |
| 414 | } |
| 415 | |
| 416 | if (!tls13_derive_key(s, md, secret, key, keylen) |
| 417 | || !tls13_derive_iv(s, md, secret, iv, ivlen)) { |
| 418 | /* SSLfatal() already called */ |
| 419 | goto err; |
| 420 | } |
| 421 | |
| 422 | if (EVP_CipherInit_ex(ciph_ctx, ciph, NULL, NULL, NULL, sending) <= 0 |
| 423 | || !EVP_CIPHER_CTX_ctrl(ciph_ctx, EVP_CTRL_AEAD_SET_IVLEN, ivlen, NULL) |
| 424 | || (taglen != 0 && !EVP_CIPHER_CTX_ctrl(ciph_ctx, EVP_CTRL_AEAD_SET_TAG, |
| 425 | taglen, NULL)) |
| 426 | || EVP_CipherInit_ex(ciph_ctx, NULL, NULL, key, NULL, -1) <= 0) { |
| 427 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_DERIVE_SECRET_KEY_AND_IV, |
| 428 | ERR_R_EVP_LIB); |
| 429 | goto err; |
| 430 | } |
| 431 | |
| 432 | return 1; |
| 433 | err: |
| 434 | OPENSSL_cleanse(key, sizeof(key)); |
| 435 | return 0; |
| 436 | } |
| 437 | |
| 438 | int tls13_change_cipher_state(SSL *s, int which) |
| 439 | { |
| 440 | #ifdef CHARSET_EBCDIC |
| 441 | static const unsigned char client_early_traffic[] = {0x63, 0x20, 0x65, 0x20, /*traffic*/0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x00}; |
| 442 | static const unsigned char client_handshake_traffic[] = {0x63, 0x20, 0x68, 0x73, 0x20, /*traffic*/0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x00}; |
| 443 | static const unsigned char client_application_traffic[] = {0x63, 0x20, 0x61, 0x70, 0x20, /*traffic*/0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x00}; |
| 444 | static const unsigned char server_handshake_traffic[] = {0x73, 0x20, 0x68, 0x73, 0x20, /*traffic*/0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x00}; |
| 445 | static const unsigned char server_application_traffic[] = {0x73, 0x20, 0x61, 0x70, 0x20, /*traffic*/0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x00}; |
| 446 | static const unsigned char exporter_master_secret[] = {0x65, 0x78, 0x70, 0x20, /* master*/ 0x6D, 0x61, 0x73, 0x74, 0x65, 0x72, 0x00}; |
| 447 | static const unsigned char resumption_master_secret[] = {0x72, 0x65, 0x73, 0x20, /* master*/ 0x6D, 0x61, 0x73, 0x74, 0x65, 0x72, 0x00}; |
| 448 | static const unsigned char early_exporter_master_secret[] = {0x65, 0x20, 0x65, 0x78, 0x70, 0x20, /* master*/ 0x6D, 0x61, 0x73, 0x74, 0x65, 0x72, 0x00}; |
| 449 | #else |
| 450 | static const unsigned char client_early_traffic[] = "c e traffic"; |
| 451 | static const unsigned char client_handshake_traffic[] = "c hs traffic"; |
| 452 | static const unsigned char client_application_traffic[] = "c ap traffic"; |
| 453 | static const unsigned char server_handshake_traffic[] = "s hs traffic"; |
| 454 | static const unsigned char server_application_traffic[] = "s ap traffic"; |
| 455 | static const unsigned char exporter_master_secret[] = "exp master"; |
| 456 | static const unsigned char resumption_master_secret[] = "res master"; |
| 457 | static const unsigned char early_exporter_master_secret[] = "e exp master"; |
| 458 | #endif |
| 459 | unsigned char *iv; |
| 460 | unsigned char secret[EVP_MAX_MD_SIZE]; |
| 461 | unsigned char hashval[EVP_MAX_MD_SIZE]; |
| 462 | unsigned char *hash = hashval; |
| 463 | unsigned char *insecret; |
| 464 | unsigned char *finsecret = NULL; |
| 465 | const char *log_label = NULL; |
| 466 | EVP_CIPHER_CTX *ciph_ctx; |
| 467 | size_t finsecretlen = 0; |
| 468 | const unsigned char *label; |
| 469 | size_t labellen, hashlen = 0; |
| 470 | int ret = 0; |
| 471 | const EVP_MD *md = NULL; |
| 472 | const EVP_CIPHER *cipher = NULL; |
| 473 | |
| 474 | if (which & SSL3_CC_READ) { |
| 475 | if (s->enc_read_ctx != NULL) { |
| 476 | EVP_CIPHER_CTX_reset(s->enc_read_ctx); |
| 477 | } else { |
| 478 | s->enc_read_ctx = EVP_CIPHER_CTX_new(); |
| 479 | if (s->enc_read_ctx == NULL) { |
| 480 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, |
| 481 | SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_MALLOC_FAILURE); |
| 482 | goto err; |
| 483 | } |
| 484 | } |
| 485 | ciph_ctx = s->enc_read_ctx; |
| 486 | iv = s->read_iv; |
| 487 | |
| 488 | RECORD_LAYER_reset_read_sequence(&s->rlayer); |
| 489 | } else { |
| 490 | s->statem.enc_write_state = ENC_WRITE_STATE_INVALID; |
| 491 | if (s->enc_write_ctx != NULL) { |
| 492 | EVP_CIPHER_CTX_reset(s->enc_write_ctx); |
| 493 | } else { |
| 494 | s->enc_write_ctx = EVP_CIPHER_CTX_new(); |
| 495 | if (s->enc_write_ctx == NULL) { |
| 496 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, |
| 497 | SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_MALLOC_FAILURE); |
| 498 | goto err; |
| 499 | } |
| 500 | } |
| 501 | ciph_ctx = s->enc_write_ctx; |
| 502 | iv = s->write_iv; |
| 503 | |
| 504 | RECORD_LAYER_reset_write_sequence(&s->rlayer); |
| 505 | } |
| 506 | |
| 507 | if (((which & SSL3_CC_CLIENT) && (which & SSL3_CC_WRITE)) |
| 508 | || ((which & SSL3_CC_SERVER) && (which & SSL3_CC_READ))) { |
| 509 | if (which & SSL3_CC_EARLY) { |
| 510 | EVP_MD_CTX *mdctx = NULL; |
| 511 | long handlen; |
| 512 | void *hdata; |
| 513 | unsigned int hashlenui; |
| 514 | const SSL_CIPHER *sslcipher = SSL_SESSION_get0_cipher(s->session); |
| 515 | |
| 516 | insecret = s->early_secret; |
| 517 | label = client_early_traffic; |
| 518 | labellen = sizeof(client_early_traffic) - 1; |
| 519 | log_label = CLIENT_EARLY_LABEL; |
| 520 | |
| 521 | handlen = BIO_get_mem_data(s->s3->handshake_buffer, &hdata); |
| 522 | if (handlen <= 0) { |
| 523 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, |
| 524 | SSL_F_TLS13_CHANGE_CIPHER_STATE, |
| 525 | SSL_R_BAD_HANDSHAKE_LENGTH); |
| 526 | goto err; |
| 527 | } |
| 528 | |
| 529 | if (s->early_data_state == SSL_EARLY_DATA_CONNECTING |
| 530 | && s->max_early_data > 0 |
| 531 | && s->session->ext.max_early_data == 0) { |
| 532 | /* |
| 533 | * If we are attempting to send early data, and we've decided to |
| 534 | * actually do it but max_early_data in s->session is 0 then we |
| 535 | * must be using an external PSK. |
| 536 | */ |
| 537 | if (!ossl_assert(s->psksession != NULL |
| 538 | && s->max_early_data == |
| 539 | s->psksession->ext.max_early_data)) { |
| 540 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, |
| 541 | SSL_F_TLS13_CHANGE_CIPHER_STATE, |
| 542 | ERR_R_INTERNAL_ERROR); |
| 543 | goto err; |
| 544 | } |
| 545 | sslcipher = SSL_SESSION_get0_cipher(s->psksession); |
| 546 | } |
| 547 | if (sslcipher == NULL) { |
| 548 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, |
| 549 | SSL_F_TLS13_CHANGE_CIPHER_STATE, SSL_R_BAD_PSK); |
| 550 | goto err; |
| 551 | } |
| 552 | |
| 553 | /* |
| 554 | * We need to calculate the handshake digest using the digest from |
| 555 | * the session. We haven't yet selected our ciphersuite so we can't |
| 556 | * use ssl_handshake_md(). |
| 557 | */ |
| 558 | mdctx = EVP_MD_CTX_new(); |
| 559 | if (mdctx == NULL) { |
| 560 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, |
| 561 | SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_MALLOC_FAILURE); |
| 562 | goto err; |
| 563 | } |
| 564 | cipher = EVP_get_cipherbynid(SSL_CIPHER_get_cipher_nid(sslcipher)); |
| 565 | md = ssl_md(sslcipher->algorithm2); |
| 566 | if (md == NULL || !EVP_DigestInit_ex(mdctx, md, NULL) |
| 567 | || !EVP_DigestUpdate(mdctx, hdata, handlen) |
| 568 | || !EVP_DigestFinal_ex(mdctx, hashval, &hashlenui)) { |
| 569 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, |
| 570 | SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR); |
| 571 | EVP_MD_CTX_free(mdctx); |
| 572 | goto err; |
| 573 | } |
| 574 | hashlen = hashlenui; |
| 575 | EVP_MD_CTX_free(mdctx); |
| 576 | |
| 577 | if (!tls13_hkdf_expand(s, md, insecret, |
| 578 | early_exporter_master_secret, |
| 579 | sizeof(early_exporter_master_secret) - 1, |
| 580 | hashval, hashlen, |
| 581 | s->early_exporter_master_secret, hashlen, |
| 582 | 1)) { |
| 583 | SSLfatal(s, SSL_AD_INTERNAL_ERROR, |
| 584 | SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR); |
| 585 | goto err; |
| 586 | } |
| 587 | |
| 588 | if (!ssl_log_secret(s, EARLY_EXPORTER_SECRET_LABEL, |
| 589 | s->early_exporter_master_secret, hashlen)) { |
| 590 | /* SSLfatal() already called */ |
| 591 | goto err; |
| 592 | } |
| 593 | } else if (which & SSL3_CC_HANDSHAKE) { |
| 594 | insecret = s->handshake_secret; |
| 595 | finsecret = s->client_finished_secret; |
| 596 | finsecretlen = EVP_MD_size(ssl_handshake_md(s)); |
| 597 | label = client_handshake_traffic; |
| 598 | labellen = sizeof(client_handshake_traffic) - 1; |
| 599 | log_label = CLIENT_HANDSHAKE_LABEL; |
| 600 | /* |
| 601 | * The handshake hash used for the server read/client write handshake |
| 602 | * traffic secret is the same as the hash for the server |
| 603 | * write/client read handshake traffic secret. However, if we |
| 604 | * processed early data then we delay changing the server |
| 605 | * read/client write cipher state until later, and the handshake |
| 606 | * hashes have moved on. Therefore we use the value saved earlier |
| 607 | * when we did the server write/client read change cipher state. |
| 608 | */ |
| 609 | hash = s->handshake_traffic_hash; |
| 610 | } else { |
| 611 | insecret = s->master_secret; |
| 612 | label = client_application_traffic; |
| 613 | labellen = sizeof(client_application_traffic) - 1; |
| 614 | log_label = CLIENT_APPLICATION_LABEL; |
| 615 | /* |
| 616 | * For this we only use the handshake hashes up until the server |
| 617 | * Finished hash. We do not include the client's Finished, which is |
| 618 | * what ssl_handshake_hash() would give us. Instead we use the |
| 619 | * previously saved value. |
| 620 | */ |
| 621 | hash = s->server_finished_hash; |
| 622 | } |
| 623 | } else { |
| 624 | /* Early data never applies to client-read/server-write */ |
| 625 | if (which & SSL3_CC_HANDSHAKE) { |
| 626 | insecret = s->handshake_secret; |
| 627 | finsecret = s->server_finished_secret; |
| 628 | finsecretlen = EVP_MD_size(ssl_handshake_md(s)); |
| 629 | label = server_handshake_traffic; |
| 630 | labellen = sizeof(server_handshake_traffic) - 1; |
| 631 | log_label = SERVER_HANDSHAKE_LABEL; |
| 632 | } else { |
| 633 | insecret = s->master_secret; |
| 634 | label = server_application_traffic; |
| 635 | labellen = sizeof(server_application_traffic) - 1; |
| 636 | log_label = SERVER_APPLICATION_LABEL; |
| 637 | } |
| 638 | } |
| 639 | |
| 640 | if (!(which & SSL3_CC_EARLY)) { |
| 641 | md = ssl_handshake_md(s); |
| 642 | cipher = s->s3->tmp.new_sym_enc; |
| 643 | if (!ssl3_digest_cached_records(s, 1) |
| 644 | || !ssl_handshake_hash(s, hashval, sizeof(hashval), &hashlen)) { |
| 645 | /* SSLfatal() already called */; |
| 646 | goto err; |
| 647 | } |
| 648 | } |
| 649 | |
| 650 | /* |
| 651 | * Save the hash of handshakes up to now for use when we calculate the |
| 652 | * client application traffic secret |
| 653 | */ |
| 654 | if (label == server_application_traffic) |
| 655 | memcpy(s->server_finished_hash, hashval, hashlen); |
| 656 | |
| 657 | if (label == server_handshake_traffic) |
| 658 | memcpy(s->handshake_traffic_hash, hashval, hashlen); |
| 659 | |
| 660 | if (label == client_application_traffic) { |
| 661 | /* |
| 662 | * We also create the resumption master secret, but this time use the |
| 663 | * hash for the whole handshake including the Client Finished |
| 664 | */ |
| 665 | if (!tls13_hkdf_expand(s, ssl_handshake_md(s), insecret, |
| 666 | resumption_master_secret, |
| 667 | sizeof(resumption_master_secret) - 1, |
| 668 | hashval, hashlen, s->resumption_master_secret, |
| 669 | hashlen, 1)) { |
| 670 | /* SSLfatal() already called */ |
| 671 | goto err; |
| 672 | } |
| 673 | } |
| 674 | |
| 675 | if (!derive_secret_key_and_iv(s, which & SSL3_CC_WRITE, md, cipher, |
| 676 | insecret, hash, label, labellen, secret, iv, |
| 677 | ciph_ctx)) { |
| 678 | /* SSLfatal() already called */ |
| 679 | goto err; |
| 680 | } |
| 681 | |
| 682 | if (label == server_application_traffic) { |
| 683 | memcpy(s->server_app_traffic_secret, secret, hashlen); |
| 684 | /* Now we create the exporter master secret */ |
| 685 | if (!tls13_hkdf_expand(s, ssl_handshake_md(s), insecret, |
| 686 | exporter_master_secret, |
| 687 | sizeof(exporter_master_secret) - 1, |
| 688 | hash, hashlen, s->exporter_master_secret, |
| 689 | hashlen, 1)) { |
| 690 | /* SSLfatal() already called */ |
| 691 | goto err; |
| 692 | } |
| 693 | |
| 694 | if (!ssl_log_secret(s, EXPORTER_SECRET_LABEL, s->exporter_master_secret, |
| 695 | hashlen)) { |
| 696 | /* SSLfatal() already called */ |
| 697 | goto err; |
| 698 | } |
| 699 | } else if (label == client_application_traffic) |
| 700 | memcpy(s->client_app_traffic_secret, secret, hashlen); |
| 701 | |
| 702 | if (!ssl_log_secret(s, log_label, secret, hashlen)) { |
| 703 | /* SSLfatal() already called */ |
| 704 | goto err; |
| 705 | } |
| 706 | |
| 707 | if (finsecret != NULL |
| 708 | && !tls13_derive_finishedkey(s, ssl_handshake_md(s), secret, |
| 709 | finsecret, finsecretlen)) { |
| 710 | /* SSLfatal() already called */ |
| 711 | goto err; |
| 712 | } |
| 713 | |
| 714 | if (!s->server && label == client_early_traffic) |
| 715 | s->statem.enc_write_state = ENC_WRITE_STATE_WRITE_PLAIN_ALERTS; |
| 716 | else |
| 717 | s->statem.enc_write_state = ENC_WRITE_STATE_VALID; |
| 718 | ret = 1; |
| 719 | err: |
| 720 | OPENSSL_cleanse(secret, sizeof(secret)); |
| 721 | return ret; |
| 722 | } |
| 723 | |
| 724 | int tls13_update_key(SSL *s, int sending) |
| 725 | { |
| 726 | #ifdef CHARSET_EBCDIC |
| 727 | static const unsigned char application_traffic[] = { 0x74, 0x72 ,0x61 ,0x66 ,0x66 ,0x69 ,0x63 ,0x20 ,0x75 ,0x70 ,0x64, 0x00}; |
| 728 | #else |
| 729 | static const unsigned char application_traffic[] = "traffic upd"; |
| 730 | #endif |
| 731 | const EVP_MD *md = ssl_handshake_md(s); |
| 732 | size_t hashlen = EVP_MD_size(md); |
| 733 | unsigned char *insecret, *iv; |
| 734 | unsigned char secret[EVP_MAX_MD_SIZE]; |
| 735 | EVP_CIPHER_CTX *ciph_ctx; |
| 736 | int ret = 0; |
| 737 | |
| 738 | if (s->server == sending) |
| 739 | insecret = s->server_app_traffic_secret; |
| 740 | else |
| 741 | insecret = s->client_app_traffic_secret; |
| 742 | |
| 743 | if (sending) { |
| 744 | s->statem.enc_write_state = ENC_WRITE_STATE_INVALID; |
| 745 | iv = s->write_iv; |
| 746 | ciph_ctx = s->enc_write_ctx; |
| 747 | RECORD_LAYER_reset_write_sequence(&s->rlayer); |
| 748 | } else { |
| 749 | iv = s->read_iv; |
| 750 | ciph_ctx = s->enc_read_ctx; |
| 751 | RECORD_LAYER_reset_read_sequence(&s->rlayer); |
| 752 | } |
| 753 | |
| 754 | if (!derive_secret_key_and_iv(s, sending, ssl_handshake_md(s), |
| 755 | s->s3->tmp.new_sym_enc, insecret, NULL, |
| 756 | application_traffic, |
| 757 | sizeof(application_traffic) - 1, secret, iv, |
| 758 | ciph_ctx)) { |
| 759 | /* SSLfatal() already called */ |
| 760 | goto err; |
| 761 | } |
| 762 | |
| 763 | memcpy(insecret, secret, hashlen); |
| 764 | |
| 765 | s->statem.enc_write_state = ENC_WRITE_STATE_VALID; |
| 766 | ret = 1; |
| 767 | err: |
| 768 | OPENSSL_cleanse(secret, sizeof(secret)); |
| 769 | return ret; |
| 770 | } |
| 771 | |
| 772 | int tls13_alert_code(int code) |
| 773 | { |
| 774 | /* There are 2 additional alerts in TLSv1.3 compared to TLSv1.2 */ |
| 775 | if (code == SSL_AD_MISSING_EXTENSION || code == SSL_AD_CERTIFICATE_REQUIRED) |
| 776 | return code; |
| 777 | |
| 778 | return tls1_alert_code(code); |
| 779 | } |
| 780 | |
| 781 | int tls13_export_keying_material(SSL *s, unsigned char *out, size_t olen, |
| 782 | const char *label, size_t llen, |
| 783 | const unsigned char *context, |
| 784 | size_t contextlen, int use_context) |
| 785 | { |
| 786 | unsigned char exportsecret[EVP_MAX_MD_SIZE]; |
| 787 | #ifdef CHARSET_EBCDIC |
| 788 | static const unsigned char exporterlabel[] = {0x65, 0x78, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x72, 0x00}; |
| 789 | #else |
| 790 | static const unsigned char exporterlabel[] = "exporter"; |
| 791 | #endif |
| 792 | unsigned char hash[EVP_MAX_MD_SIZE], data[EVP_MAX_MD_SIZE]; |
| 793 | const EVP_MD *md = ssl_handshake_md(s); |
| 794 | EVP_MD_CTX *ctx = EVP_MD_CTX_new(); |
| 795 | unsigned int hashsize, datalen; |
| 796 | int ret = 0; |
| 797 | |
| 798 | if (ctx == NULL || !ossl_statem_export_allowed(s)) |
| 799 | goto err; |
| 800 | |
| 801 | if (!use_context) |
| 802 | contextlen = 0; |
| 803 | |
| 804 | if (EVP_DigestInit_ex(ctx, md, NULL) <= 0 |
| 805 | || EVP_DigestUpdate(ctx, context, contextlen) <= 0 |
| 806 | || EVP_DigestFinal_ex(ctx, hash, &hashsize) <= 0 |
| 807 | || EVP_DigestInit_ex(ctx, md, NULL) <= 0 |
| 808 | || EVP_DigestFinal_ex(ctx, data, &datalen) <= 0 |
| 809 | || !tls13_hkdf_expand(s, md, s->exporter_master_secret, |
| 810 | (const unsigned char *)label, llen, |
| 811 | data, datalen, exportsecret, hashsize, 0) |
| 812 | || !tls13_hkdf_expand(s, md, exportsecret, exporterlabel, |
| 813 | sizeof(exporterlabel) - 1, hash, hashsize, |
| 814 | out, olen, 0)) |
| 815 | goto err; |
| 816 | |
| 817 | ret = 1; |
| 818 | err: |
| 819 | EVP_MD_CTX_free(ctx); |
| 820 | return ret; |
| 821 | } |
| 822 | |
| 823 | int tls13_export_keying_material_early(SSL *s, unsigned char *out, size_t olen, |
| 824 | const char *label, size_t llen, |
| 825 | const unsigned char *context, |
| 826 | size_t contextlen) |
| 827 | { |
| 828 | #ifdef CHARSET_EBCDIC |
| 829 | static const unsigned char exporterlabel[] = {0x65, 0x78, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x72, 0x00}; |
| 830 | #else |
| 831 | static const unsigned char exporterlabel[] = "exporter"; |
| 832 | #endif |
| 833 | unsigned char exportsecret[EVP_MAX_MD_SIZE]; |
| 834 | unsigned char hash[EVP_MAX_MD_SIZE], data[EVP_MAX_MD_SIZE]; |
| 835 | const EVP_MD *md; |
| 836 | EVP_MD_CTX *ctx = EVP_MD_CTX_new(); |
| 837 | unsigned int hashsize, datalen; |
| 838 | int ret = 0; |
| 839 | const SSL_CIPHER *sslcipher; |
| 840 | |
| 841 | if (ctx == NULL || !ossl_statem_export_early_allowed(s)) |
| 842 | goto err; |
| 843 | |
| 844 | if (!s->server && s->max_early_data > 0 |
| 845 | && s->session->ext.max_early_data == 0) |
| 846 | sslcipher = SSL_SESSION_get0_cipher(s->psksession); |
| 847 | else |
| 848 | sslcipher = SSL_SESSION_get0_cipher(s->session); |
| 849 | |
| 850 | md = ssl_md(sslcipher->algorithm2); |
| 851 | |
| 852 | /* |
| 853 | * Calculate the hash value and store it in |data|. The reason why |
| 854 | * the empty string is used is that the definition of TLS-Exporter |
| 855 | * is like so: |
| 856 | * |
| 857 | * TLS-Exporter(label, context_value, key_length) = |
| 858 | * HKDF-Expand-Label(Derive-Secret(Secret, label, ""), |
| 859 | * "exporter", Hash(context_value), key_length) |
| 860 | * |
| 861 | * Derive-Secret(Secret, Label, Messages) = |
| 862 | * HKDF-Expand-Label(Secret, Label, |
| 863 | * Transcript-Hash(Messages), Hash.length) |
| 864 | * |
| 865 | * Here Transcript-Hash is the cipher suite hash algorithm. |
| 866 | */ |
| 867 | if (EVP_DigestInit_ex(ctx, md, NULL) <= 0 |
| 868 | || EVP_DigestUpdate(ctx, context, contextlen) <= 0 |
| 869 | || EVP_DigestFinal_ex(ctx, hash, &hashsize) <= 0 |
| 870 | || EVP_DigestInit_ex(ctx, md, NULL) <= 0 |
| 871 | || EVP_DigestFinal_ex(ctx, data, &datalen) <= 0 |
| 872 | || !tls13_hkdf_expand(s, md, s->early_exporter_master_secret, |
| 873 | (const unsigned char *)label, llen, |
| 874 | data, datalen, exportsecret, hashsize, 0) |
| 875 | || !tls13_hkdf_expand(s, md, exportsecret, exporterlabel, |
| 876 | sizeof(exporterlabel) - 1, hash, hashsize, |
| 877 | out, olen, 0)) |
| 878 | goto err; |
| 879 | |
| 880 | ret = 1; |
| 881 | err: |
| 882 | EVP_MD_CTX_free(ctx); |
| 883 | return ret; |
| 884 | } |