Always check the TLS 1.3 downgrade signal.
These APIs were used by Chromium to control the carve-out for the TLS
1.3 downgrade signal. As of
https://chromium-review.googlesource.com/c/chromium/src/+/2324170,
Chromium no longer uses them.
Update-Note: SSL_CTX_set_ignore_tls13_downgrade,
SSL_set_ignore_tls13_downgrade, and SSL_is_tls13_downgrade now do
nothing. Calls sites should be removed. (There are some copies of older
Chromium lying around, so I haven't removed the functions yet.) The
enforcement was already on by default, so this CL does not affect
callers that don't use those functions.
Change-Id: I016af8291cd92051472d239c4650602fe2a68f5b
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/44124
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/handshake_client.cc b/ssl/handshake_client.cc
index 5c800fb..c36b192 100644
--- a/ssl/handshake_client.cc
+++ b/ssl/handshake_client.cc
@@ -636,12 +636,9 @@
.subspan(SSL3_RANDOM_SIZE - sizeof(kTLS13DowngradeRandom));
if (suffix == kTLS12DowngradeRandom || suffix == kTLS13DowngradeRandom ||
suffix == kJDK11DowngradeRandom) {
- ssl->s3->tls13_downgrade = true;
- if (!hs->config->ignore_tls13_downgrade) {
- OPENSSL_PUT_ERROR(SSL, SSL_R_TLS13_DOWNGRADE);
- ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
- return ssl_hs_error;
- }
+ OPENSSL_PUT_ERROR(SSL, SSL_R_TLS13_DOWNGRADE);
+ ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
+ return ssl_hs_error;
}
}
@@ -1550,18 +1547,12 @@
//
// Now that TLS 1.3 exists, we would like to avoid similar attacks between
// TLS 1.2 and TLS 1.3, but there are too many TLS 1.2 deployments to
- // sacrifice False Start on them. TLS 1.3's downgrade signal fixes this, but
- // |SSL_CTX_set_ignore_tls13_downgrade| can disable it due to compatibility
- // issues.
- //
- // |SSL_CTX_set_ignore_tls13_downgrade| normally still retains Finished-based
- // downgrade protection, but False Start bypasses that. Thus, we disable False
- // Start based on the TLS 1.3 downgrade signal, even if otherwise unenforced.
+ // sacrifice False Start on them. Instead, we rely on the ServerHello.random
+ // downgrade signal, which we unconditionally enforce.
if (SSL_is_dtls(ssl) ||
SSL_version(ssl) != TLS1_2_VERSION ||
hs->new_cipher->algorithm_mkey != SSL_kECDHE ||
- hs->new_cipher->algorithm_mac != SSL_AEAD ||
- ssl->s3->tls13_downgrade) {
+ hs->new_cipher->algorithm_mac != SSL_AEAD) {
return false;
}