Move key_block into SSL_HANDSHAKE.
This is already manually released at the end of the handshake. With this
change, it can happen implicitly, and SSL3_STATE shrinks further by
another pointer.
Change-Id: I94b9f2e4df55e8f2aa0b3a8799baa3b9a34d7ac1
Reviewed-on: https://boringssl-review.googlesource.com/12121
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/handshake_client.c b/ssl/handshake_client.c
index 1a0cbbf..311e9fd 100644
--- a/ssl/handshake_client.c
+++ b/ssl/handshake_client.c
@@ -507,8 +507,6 @@
break;
case SSL_ST_OK:
- /* Clean a few things up. */
- ssl3_cleanup_key_block(ssl);
ssl->method->release_current_message(ssl, 1 /* free_buffer */);
SSL_SESSION_free(ssl->s3->established_session);
diff --git a/ssl/handshake_server.c b/ssl/handshake_server.c
index 285bd84..117be78 100644
--- a/ssl/handshake_server.c
+++ b/ssl/handshake_server.c
@@ -476,8 +476,6 @@
break;
case SSL_ST_OK:
- /* Clean a few things up. */
- ssl3_cleanup_key_block(ssl);
ssl->method->release_current_message(ssl, 1 /* free_buffer */);
/* If we aren't retaining peer certificates then we can discard it
diff --git a/ssl/internal.h b/ssl/internal.h
index a054bbf..7badc5b 100644
--- a/ssl/internal.h
+++ b/ssl/internal.h
@@ -1003,6 +1003,10 @@
* received in a CertificateRequest message. */
uint8_t *certificate_types;
size_t num_certificate_types;
+
+ /* key_block is the record-layer key block for TLS 1.2 and earlier. */
+ uint8_t *key_block;
+ uint8_t key_block_len;
} SSL_HANDSHAKE;
SSL_HANDSHAKE *ssl_handshake_new(enum ssl_hs_wait_t (*do_handshake)(SSL *ssl));
@@ -1435,9 +1439,6 @@
int reuse_message;
- uint8_t *key_block;
- uint8_t key_block_length;
-
uint8_t new_mac_secret_len;
uint8_t new_key_len;
uint8_t new_fixed_iv_len;
@@ -1681,7 +1682,6 @@
int ssl3_get_finished(SSL *ssl);
int ssl3_send_change_cipher_spec(SSL *ssl);
-void ssl3_cleanup_key_block(SSL *ssl);
int ssl3_send_alert(SSL *ssl, int level, int desc);
int ssl3_get_message(SSL *ssl, int msg_type,
enum ssl_hash_message_t hash_message);
diff --git a/ssl/s3_both.c b/ssl/s3_both.c
index 1e7e4e1..11aeed0 100644
--- a/ssl/s3_both.c
+++ b/ssl/s3_both.c
@@ -163,6 +163,12 @@
OPENSSL_free(hs->peer_psk_identity_hint);
sk_X509_NAME_pop_free(hs->ca_names, X509_NAME_free);
OPENSSL_free(hs->certificate_types);
+
+ if (hs->key_block != NULL) {
+ OPENSSL_cleanse(hs->key_block, hs->key_block_len);
+ OPENSSL_free(hs->key_block);
+ }
+
OPENSSL_free(hs);
}
diff --git a/ssl/s3_enc.c b/ssl/s3_enc.c
index 2209e80..7cdc294 100644
--- a/ssl/s3_enc.c
+++ b/ssl/s3_enc.c
@@ -209,15 +209,6 @@
return 1;
}
-void ssl3_cleanup_key_block(SSL *ssl) {
- if (ssl->s3->tmp.key_block != NULL) {
- OPENSSL_cleanse(ssl->s3->tmp.key_block, ssl->s3->tmp.key_block_length);
- OPENSSL_free(ssl->s3->tmp.key_block);
- ssl->s3->tmp.key_block = NULL;
- }
- ssl->s3->tmp.key_block_length = 0;
-}
-
int ssl3_init_handshake_buffer(SSL *ssl) {
ssl3_free_handshake_buffer(ssl);
ssl3_free_handshake_hash(ssl);
diff --git a/ssl/s3_lib.c b/ssl/s3_lib.c
index f119523..9cc0d9d 100644
--- a/ssl/s3_lib.c
+++ b/ssl/s3_lib.c
@@ -200,7 +200,6 @@
return;
}
- ssl3_cleanup_key_block(ssl);
ssl_read_buffer_clear(ssl);
ssl_write_buffer_clear(ssl);
diff --git a/ssl/t1_enc.c b/ssl/t1_enc.c
index 4bd31b9..bf5c069 100644
--- a/ssl/t1_enc.c
+++ b/ssl/t1_enc.c
@@ -276,10 +276,9 @@
size_t mac_secret_len = ssl->s3->tmp.new_mac_secret_len;
size_t key_len = ssl->s3->tmp.new_key_len;
size_t iv_len = ssl->s3->tmp.new_fixed_iv_len;
- assert((mac_secret_len + key_len + iv_len) * 2 ==
- ssl->s3->tmp.key_block_length);
+ assert((mac_secret_len + key_len + iv_len) * 2 == ssl->s3->hs->key_block_len);
- const uint8_t *key_data = ssl->s3->tmp.key_block;
+ const uint8_t *key_data = ssl->s3->hs->key_block;
const uint8_t *client_write_mac_secret = key_data;
key_data += mac_secret_len;
const uint8_t *server_write_mac_secret = key_data;
@@ -334,7 +333,7 @@
}
int tls1_setup_key_block(SSL *ssl) {
- if (ssl->s3->tmp.key_block_length != 0) {
+ if (ssl->s3->hs->key_block_len != 0) {
return 1;
}
@@ -373,8 +372,6 @@
size_t key_block_len = SSL_get_key_block_len(ssl);
- ssl3_cleanup_key_block(ssl);
-
uint8_t *keyblock = OPENSSL_malloc(key_block_len);
if (keyblock == NULL) {
OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
@@ -387,8 +384,8 @@
}
assert(key_block_len < 256);
- ssl->s3->tmp.key_block_length = (uint8_t)key_block_len;
- ssl->s3->tmp.key_block = keyblock;
+ ssl->s3->hs->key_block_len = (uint8_t)key_block_len;
+ ssl->s3->hs->key_block = keyblock;
return 1;
}