From a44b8f51b28515300b7d351485e371c07311a9f4 Mon Sep 17 00:00:00 2001 From: jsing <> Date: Thu, 7 Jan 2021 15:32:59 +0000 Subject: Move the read MAC key into the TLSv1.2 record layer. ok inoguchi@ tb@ --- src/lib/libssl/ssl_both.c | 9 +-------- src/lib/libssl/ssl_locl.h | 4 +--- src/lib/libssl/t1_enc.c | 9 ++------- src/lib/libssl/tls12_record_layer.c | 21 ++++++++++++++++----- 4 files changed, 20 insertions(+), 23 deletions(-) (limited to 'src/lib') diff --git a/src/lib/libssl/ssl_both.c b/src/lib/libssl/ssl_both.c index 6480b45bec..ee69f9a121 100644 --- a/src/lib/libssl/ssl_both.c +++ b/src/lib/libssl/ssl_both.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_both.c,v 1.22 2021/01/05 17:14:46 jsing Exp $ */ +/* $OpenBSD: ssl_both.c,v 1.23 2021/01/07 15:32:59 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -301,13 +301,6 @@ f_err: return (0); } -/* for these 2 messages, we need to - * ssl->enc_read_ctx re-init - * ssl->s3->internal->read_sequence zero - * ssl->s3->internal->read_mac_secret re-init - * ssl->session->read_sym_enc assign - * ssl->session->read_hash assign - */ int ssl3_send_change_cipher_spec(SSL *s, int a, int b) { diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 312c18f7ca..5c646d2208 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl_locl.h,v 1.310 2020/12/15 16:04:49 tb Exp $ */ +/* $OpenBSD: ssl_locl.h,v 1.311 2021/01/07 15:32:59 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -833,8 +833,6 @@ typedef struct ssl3_buffer_internal_st { typedef struct ssl3_state_internal_st { unsigned char read_sequence[SSL3_SEQUENCE_SIZE]; - int read_mac_secret_size; - unsigned char read_mac_secret[EVP_MAX_MD_SIZE]; unsigned char write_sequence[SSL3_SEQUENCE_SIZE]; SSL3_BUFFER_INTERNAL rbuf; /* read IO goes into here */ diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c index d451ad531c..6c376be2e0 100644 --- a/src/lib/libssl/t1_enc.c +++ b/src/lib/libssl/t1_enc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: t1_enc.c,v 1.127 2020/11/11 18:14:12 jsing Exp $ */ +/* $OpenBSD: t1_enc.c,v 1.128 2021/01/07 15:32:59 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -434,7 +434,7 @@ tls1_change_cipher_state_cipher(SSL *s, char is_read, goto err; if (!tls12_record_layer_set_read_mac_key(s->internal->rl, - S3I(s)->read_mac_secret, mac_secret_size)) + mac_secret, mac_secret_size)) goto err; } else { /* @@ -565,11 +565,6 @@ tls1_change_cipher_state(SSL *s, int which) goto err2; } - if (is_read) { - memcpy(S3I(s)->read_mac_secret, mac_secret, mac_secret_size); - S3I(s)->read_mac_secret_size = mac_secret_size; - } - if (aead != NULL) { return tls1_change_cipher_state_aead(s, is_read, key, key_len, iv, iv_len); diff --git a/src/lib/libssl/tls12_record_layer.c b/src/lib/libssl/tls12_record_layer.c index 56ff94d95c..32e3fcc813 100644 --- a/src/lib/libssl/tls12_record_layer.c +++ b/src/lib/libssl/tls12_record_layer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls12_record_layer.c,v 1.5 2020/10/03 17:35:17 jsing Exp $ */ +/* $OpenBSD: tls12_record_layer.c,v 1.6 2021/01/07 15:32:59 jsing Exp $ */ /* * Copyright (c) 2020 Joel Sing * @@ -33,6 +33,9 @@ struct tls12_record_layer { int read_stream_mac; int write_stream_mac; + uint8_t *read_mac_key; + size_t read_mac_key_len; + /* * XXX - for now these are just pointers to externally managed * structs/memory. These should eventually be owned by the record layer. @@ -45,9 +48,6 @@ struct tls12_record_layer { EVP_CIPHER_CTX *write_cipher_ctx; EVP_MD_CTX *write_hash_ctx; - const uint8_t *read_mac_key; - size_t read_mac_key_len; - uint8_t *read_seq_num; uint8_t *write_seq_num; }; @@ -66,6 +66,7 @@ tls12_record_layer_new(void) void tls12_record_layer_free(struct tls12_record_layer *rl) { + freezero(rl->read_mac_key, rl->read_mac_key_len); freezero(rl, sizeof(struct tls12_record_layer)); } @@ -189,7 +190,17 @@ int tls12_record_layer_set_read_mac_key(struct tls12_record_layer *rl, const uint8_t *mac_key, size_t mac_key_len) { - rl->read_mac_key = mac_key; + freezero(rl->read_mac_key, rl->read_mac_key_len); + rl->read_mac_key = NULL; + rl->read_mac_key_len = 0; + + if (mac_key == NULL || mac_key_len == 0) + return 1; + + if ((rl->read_mac_key = calloc(1, mac_key_len)) == NULL) + return 0; + + memcpy(rl->read_mac_key, mac_key, mac_key_len); rl->read_mac_key_len = mac_key_len; return 1; -- cgit v1.2.3-55-g6feb