summaryrefslogtreecommitdiff
path: root/src/lib/libssl/t1_enc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/t1_enc.c')
-rw-r--r--src/lib/libssl/t1_enc.c97
1 files changed, 23 insertions, 74 deletions
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c
index e3cdcc134b..5a626fb880 100644
--- a/src/lib/libssl/t1_enc.c
+++ b/src/lib/libssl/t1_enc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: t1_enc.c,v 1.142 2021/05/02 17:46:58 jsing Exp $ */ 1/* $OpenBSD: t1_enc.c,v 1.143 2021/05/05 10:05:27 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -147,9 +147,8 @@
147void 147void
148tls1_cleanup_key_block(SSL *s) 148tls1_cleanup_key_block(SSL *s)
149{ 149{
150 freezero(S3I(s)->hs.tls12.key_block, S3I(s)->hs.tls12.key_block_len); 150 tls12_key_block_free(S3I(s)->hs.tls12.key_block);
151 S3I(s)->hs.tls12.key_block = NULL; 151 S3I(s)->hs.tls12.key_block = NULL;
152 S3I(s)->hs.tls12.key_block_len = 0;
153} 152}
154 153
155/* 154/*
@@ -283,7 +282,7 @@ tls1_PRF(SSL *s, const unsigned char *secret, size_t secret_len,
283 return (1); 282 return (1);
284} 283}
285 284
286static int 285int
287tls1_generate_key_block(SSL *s, uint8_t *key_block, size_t key_block_len) 286tls1_generate_key_block(SSL *s, uint8_t *key_block, size_t key_block_len)
288{ 287{
289 return tls1_PRF(s, 288 return tls1_PRF(s,
@@ -297,62 +296,20 @@ tls1_generate_key_block(SSL *s, uint8_t *key_block, size_t key_block_len)
297static int 296static int
298tls1_change_cipher_state(SSL *s, int is_write) 297tls1_change_cipher_state(SSL *s, int is_write)
299{ 298{
300 const unsigned char *client_write_mac_secret, *server_write_mac_secret; 299 CBS mac_key, key, iv;
301 const unsigned char *client_write_key, *server_write_key;
302 const unsigned char *client_write_iv, *server_write_iv;
303 const unsigned char *mac_secret, *key, *iv;
304 int mac_secret_size, key_len, iv_len;
305 unsigned char *key_block;
306 const EVP_CIPHER *cipher;
307 const EVP_AEAD *aead;
308
309 aead = tls12_record_layer_aead(s->internal->rl);
310 cipher = tls12_record_layer_cipher(s->internal->rl);
311
312 if (aead != NULL) {
313 key_len = EVP_AEAD_key_length(aead);
314 iv_len = SSL_CIPHER_AEAD_FIXED_NONCE_LEN(S3I(s)->hs.cipher);
315 } else {
316 key_len = EVP_CIPHER_key_length(cipher);
317 iv_len = EVP_CIPHER_iv_length(cipher);
318 }
319
320 mac_secret_size = S3I(s)->hs.tls12.mac_secret_size;
321
322 key_block = S3I(s)->hs.tls12.key_block;
323 client_write_mac_secret = key_block;
324 key_block += mac_secret_size;
325 server_write_mac_secret = key_block;
326 key_block += mac_secret_size;
327 client_write_key = key_block;
328 key_block += key_len;
329 server_write_key = key_block;
330 key_block += key_len;
331 client_write_iv = key_block;
332 key_block += iv_len;
333 server_write_iv = key_block;
334 key_block += iv_len;
335 300
336 /* Use client write keys on client write and server read. */ 301 /* Use client write keys on client write and server read. */
337 if ((!s->server && is_write) || (s->server && !is_write)) { 302 if ((!s->server && is_write) || (s->server && !is_write)) {
338 mac_secret = client_write_mac_secret; 303 tls12_key_block_client_write(S3I(s)->hs.tls12.key_block,
339 key = client_write_key; 304 &mac_key, &key, &iv);
340 iv = client_write_iv;
341 } else { 305 } else {
342 mac_secret = server_write_mac_secret; 306 tls12_key_block_server_write(S3I(s)->hs.tls12.key_block,
343 key = server_write_key; 307 &mac_key, &key, &iv);
344 iv = server_write_iv;
345 }
346
347 if (key_block - S3I(s)->hs.tls12.key_block !=
348 S3I(s)->hs.tls12.key_block_len) {
349 SSLerror(s, ERR_R_INTERNAL_ERROR);
350 goto err;
351 } 308 }
352 309
353 if (!is_write) { 310 if (!is_write) {
354 if (!tls12_record_layer_change_read_cipher_state(s->internal->rl, 311 if (!tls12_record_layer_change_read_cipher_state(s->internal->rl,
355 mac_secret, mac_secret_size, key, key_len, iv, iv_len)) 312 &mac_key, &key, &iv))
356 goto err; 313 goto err;
357 if (SSL_is_dtls(s)) 314 if (SSL_is_dtls(s))
358 dtls1_reset_read_seq_numbers(s); 315 dtls1_reset_read_seq_numbers(s);
@@ -360,7 +317,7 @@ tls1_change_cipher_state(SSL *s, int is_write)
360 &s->enc_read_ctx, &s->read_hash); 317 &s->enc_read_ctx, &s->read_hash);
361 } else { 318 } else {
362 if (!tls12_record_layer_change_write_cipher_state(s->internal->rl, 319 if (!tls12_record_layer_change_write_cipher_state(s->internal->rl,
363 mac_secret, mac_secret_size, key, key_len, iv, iv_len)) 320 &mac_key, &key, &iv))
364 goto err; 321 goto err;
365 if (SSL_is_dtls(s)) 322 if (SSL_is_dtls(s))
366 dtls1_reset_write_seq_numbers(s); 323 dtls1_reset_write_seq_numbers(s);
@@ -386,17 +343,19 @@ tls1_change_write_cipher_state(SSL *s)
386int 343int
387tls1_setup_key_block(SSL *s) 344tls1_setup_key_block(SSL *s)
388{ 345{
389 unsigned char *key_block; 346 struct tls12_key_block *key_block;
390 int mac_type = NID_undef, mac_secret_size = 0; 347 int mac_type = NID_undef, mac_secret_size = 0;
391 size_t key_block_len;
392 int key_len, iv_len;
393 const EVP_CIPHER *cipher = NULL; 348 const EVP_CIPHER *cipher = NULL;
394 const EVP_AEAD *aead = NULL; 349 const EVP_AEAD *aead = NULL;
395 const EVP_MD *handshake_hash = NULL; 350 const EVP_MD *handshake_hash = NULL;
396 const EVP_MD *mac_hash = NULL; 351 const EVP_MD *mac_hash = NULL;
397 int ret = 0; 352 int ret = 0;
398 353
399 if (S3I(s)->hs.tls12.key_block_len != 0) 354 /*
355 * XXX - callers should be changed so that they only call this
356 * function once.
357 */
358 if (S3I(s)->hs.tls12.key_block != NULL)
400 return (1); 359 return (1);
401 360
402 if (s->session->cipher && 361 if (s->session->cipher &&
@@ -405,41 +364,29 @@ tls1_setup_key_block(SSL *s)
405 SSLerror(s, SSL_R_CIPHER_OR_HASH_UNAVAILABLE); 364 SSLerror(s, SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
406 return (0); 365 return (0);
407 } 366 }
408 key_len = EVP_AEAD_key_length(aead);
409 iv_len = SSL_CIPHER_AEAD_FIXED_NONCE_LEN(s->session->cipher);
410 } else { 367 } else {
368 /* XXX - mac_type and mac_secret_size are now unused. */
411 if (!ssl_cipher_get_evp(s->session, &cipher, &mac_hash, 369 if (!ssl_cipher_get_evp(s->session, &cipher, &mac_hash,
412 &mac_type, &mac_secret_size)) { 370 &mac_type, &mac_secret_size)) {
413 SSLerror(s, SSL_R_CIPHER_OR_HASH_UNAVAILABLE); 371 SSLerror(s, SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
414 return (0); 372 return (0);
415 } 373 }
416 key_len = EVP_CIPHER_key_length(cipher);
417 iv_len = EVP_CIPHER_iv_length(cipher);
418 } 374 }
419 375
420 if (!ssl_get_handshake_evp_md(s, &handshake_hash)) 376 if (!ssl_get_handshake_evp_md(s, &handshake_hash))
421 return (0); 377 return (0);
422 378
423 S3I(s)->hs.tls12.mac_secret_size = mac_secret_size;
424
425 tls12_record_layer_set_aead(s->internal->rl, aead); 379 tls12_record_layer_set_aead(s->internal->rl, aead);
426 tls12_record_layer_set_cipher_hash(s->internal->rl, cipher, 380 tls12_record_layer_set_cipher_hash(s->internal->rl, cipher,
427 handshake_hash, mac_hash); 381 handshake_hash, mac_hash);
428 382
429 tls1_cleanup_key_block(s); 383 if ((key_block = tls12_key_block_new()) == NULL)
430 384 goto err;
431 if ((key_block = reallocarray(NULL, mac_secret_size + key_len + iv_len, 385 if (!tls12_key_block_generate(key_block, s, aead, cipher, mac_hash))
432 2)) == NULL) {
433 SSLerror(s, ERR_R_MALLOC_FAILURE);
434 goto err; 386 goto err;
435 }
436 key_block_len = (mac_secret_size + key_len + iv_len) * 2;
437 387
438 S3I(s)->hs.tls12.key_block_len = key_block_len;
439 S3I(s)->hs.tls12.key_block = key_block; 388 S3I(s)->hs.tls12.key_block = key_block;
440 389 key_block = NULL;
441 if (!tls1_generate_key_block(s, key_block, key_block_len))
442 goto err;
443 390
444 if (!(s->internal->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) && 391 if (!(s->internal->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) &&
445 s->method->internal->version <= TLS1_VERSION) { 392 s->method->internal->version <= TLS1_VERSION) {
@@ -463,6 +410,8 @@ tls1_setup_key_block(SSL *s)
463 ret = 1; 410 ret = 1;
464 411
465 err: 412 err:
413 tls12_key_block_free(key_block);
414
466 return (ret); 415 return (ret);
467} 416}
468 417