Tidy up some lengths in SSL_SESSION
Normally these would be size_t, but we try to reduce per-connection
memory in libssl, so use uint8_t, then add asserts, checks, and casts as
appropriate.
Bug: 516
Change-Id: Ibdd9d88f2b05173daee2db5f6fb77d619302bfdf
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58547
Reviewed-by: Bob Beck <bbe@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/ssl/handshake_client.cc b/ssl/handshake_client.cc
index e7dca1b..3e63019 100644
--- a/ssl/handshake_client.cc
+++ b/ssl/handshake_client.cc
@@ -833,11 +833,18 @@
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
return ssl_hs_error;
}
- // Note: session_id could be empty.
- hs->new_session->session_id_length = CBS_len(&server_hello.session_id);
+
+ // Save the session ID from the server. This may be empty if the session
+ // isn't resumable, or if we'll receive a session ticket later.
+ assert(CBS_len(&server_hello.session_id) <= SSL3_SESSION_ID_SIZE);
+ static_assert(SSL3_SESSION_ID_SIZE <= UINT8_MAX,
+ "max session ID is too large");
+ hs->new_session->session_id_length =
+ static_cast<uint8_t>(CBS_len(&server_hello.session_id));
OPENSSL_memcpy(hs->new_session->session_id,
CBS_data(&server_hello.session_id),
CBS_len(&server_hello.session_id));
+
hs->new_session->cipher = hs->new_cipher;
}
diff --git a/ssl/internal.h b/ssl/internal.h
index 1b53023..b4d853a 100644
--- a/ssl/internal.h
+++ b/ssl/internal.h
@@ -3838,11 +3838,11 @@
// session. In TLS 1.3 and up, it is the resumption PSK for sessions handed to
// the caller, but it stores the resumption secret when stored on |SSL|
// objects.
- int secret_length = 0;
+ uint8_t secret_length = 0;
uint8_t secret[SSL_MAX_MASTER_KEY_LENGTH] = {0};
// session_id - valid?
- unsigned session_id_length = 0;
+ uint8_t session_id_length = 0;
uint8_t session_id[SSL_MAX_SSL_SESSION_ID_LENGTH] = {0};
// this is used to determine whether the session is being reused in
// the appropriate context. It is up to the application to set this,
diff --git a/ssl/ssl_asn1.cc b/ssl/ssl_asn1.cc
index 96cb795..3311246 100644
--- a/ssl/ssl_asn1.cc
+++ b/ssl/ssl_asn1.cc
@@ -486,7 +486,7 @@
return 0;
}
OPENSSL_memcpy(out, CBS_data(&value), CBS_len(&value));
- *out_len = (uint8_t)CBS_len(&value);
+ *out_len = static_cast<uint8_t>(CBS_len(&value));
return 1;
}
@@ -578,9 +578,13 @@
return nullptr;
}
OPENSSL_memcpy(ret->session_id, CBS_data(&session_id), CBS_len(&session_id));
- ret->session_id_length = CBS_len(&session_id);
+ static_assert(SSL3_MAX_SSL_SESSION_ID_LENGTH <= UINT8_MAX,
+ "max session ID is too large");
+ ret->session_id_length = static_cast<uint8_t>(CBS_len(&session_id));
OPENSSL_memcpy(ret->secret, CBS_data(&secret), CBS_len(&secret));
- ret->secret_length = CBS_len(&secret);
+ static_assert(SSL_MAX_MASTER_KEY_LENGTH <= UINT8_MAX,
+ "max secret is too large");
+ ret->secret_length = static_cast<uint8_t>(CBS_len(&secret));
CBS child;
uint64_t timeout;
diff --git a/ssl/tls13_both.cc b/ssl/tls13_both.cc
index f67c592..5ab5a1c 100644
--- a/ssl/tls13_both.cc
+++ b/ssl/tls13_both.cc
@@ -513,7 +513,8 @@
if (!ssl->method->init_message(ssl, cbb.get(), body,
SSL3_MT_COMPRESSED_CERTIFICATE) ||
!CBB_add_u16(body, hs->cert_compression_alg_id) ||
- !CBB_add_u24(body, msg.size()) ||
+ msg.size() > (1u << 24) - 1 || //
+ !CBB_add_u24(body, static_cast<uint32_t>(msg.size())) ||
!CBB_add_u24_length_prefixed(body, &compressed)) {
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
return false;