Switch verify sigalg pref functions to SSL_HANDSHAKE.
Functions that take SSL* do not necessarily have an ssl->config
available because it is released post-handshake, whereas hs->config can
be accessed without a null check.
Change-Id: I3d9f3838c1f2d79f92beac363a90fb6046671053
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/39844
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/handshake_client.cc b/ssl/handshake_client.cc
index 4041fe9..25f96d0 100644
--- a/ssl/handshake_client.cc
+++ b/ssl/handshake_client.cc
@@ -1050,7 +1050,7 @@
return ssl_hs_error;
}
uint8_t alert = SSL_AD_DECODE_ERROR;
- if (!tls12_check_peer_sigalg(ssl, &alert, signature_algorithm)) {
+ if (!tls12_check_peer_sigalg(hs, &alert, signature_algorithm)) {
ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
return ssl_hs_error;
}
@@ -1273,7 +1273,7 @@
ssl_key_usage_t intended_use = (alg_k & SSL_kRSA)
? key_usage_encipherment
: key_usage_digital_signature;
- if (ssl->config->enforce_rsa_key_usage ||
+ if (hs->config->enforce_rsa_key_usage ||
EVP_PKEY_id(hs->peer_pubkey.get()) != EVP_PKEY_RSA) {
if (!ssl_cert_check_key_usage(&leaf_cbs, intended_use)) {
return ssl_hs_error;
diff --git a/ssl/handshake_server.cc b/ssl/handshake_server.cc
index dfe14bf..ec9e6ea 100644
--- a/ssl/handshake_server.cc
+++ b/ssl/handshake_server.cc
@@ -1094,7 +1094,7 @@
!CBB_add_u8(&cert_types, TLS_CT_ECDSA_SIGN) ||
(ssl_protocol_version(ssl) >= TLS1_2_VERSION &&
(!CBB_add_u16_length_prefixed(&body, &sigalgs_cbb) ||
- !tls12_add_verify_sigalgs(ssl, &sigalgs_cbb))) ||
+ !tls12_add_verify_sigalgs(hs, &sigalgs_cbb))) ||
!ssl_add_client_CA_list(hs, &body) ||
!ssl_add_message_cbb(ssl, cbb.get())) {
OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
@@ -1439,7 +1439,7 @@
return ssl_hs_error;
}
uint8_t alert = SSL_AD_DECODE_ERROR;
- if (!tls12_check_peer_sigalg(ssl, &alert, signature_algorithm)) {
+ if (!tls12_check_peer_sigalg(hs, &alert, signature_algorithm)) {
ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
return ssl_hs_error;
}
diff --git a/ssl/internal.h b/ssl/internal.h
index 41d6dc3..836153f 100644
--- a/ssl/internal.h
+++ b/ssl/internal.h
@@ -2001,12 +2001,12 @@
// tls12_add_verify_sigalgs adds the signature algorithms acceptable for the
// peer signature to |out|. It returns true on success and false on error.
-bool tls12_add_verify_sigalgs(const SSL *ssl, CBB *out);
+bool tls12_add_verify_sigalgs(const SSL_HANDSHAKE *hs, CBB *out);
// tls12_check_peer_sigalg checks if |sigalg| is acceptable for the peer
// signature. It returns true on success and false on error, setting
// |*out_alert| to an alert to send.
-bool tls12_check_peer_sigalg(const SSL *ssl, uint8_t *out_alert,
+bool tls12_check_peer_sigalg(const SSL_HANDSHAKE *hs, uint8_t *out_alert,
uint16_t sigalg);
diff --git a/ssl/t1_lib.cc b/ssl/t1_lib.cc
index 7958b5c..2b8e941 100644
--- a/ssl/t1_lib.cc
+++ b/ssl/t1_lib.cc
@@ -473,10 +473,12 @@
bool skip_ed25519 = false;
};
-static SSLSignatureAlgorithmList tls12_get_verify_sigalgs(const SSL *ssl) {
+static SSLSignatureAlgorithmList tls12_get_verify_sigalgs(
+ const SSL_HANDSHAKE *hs) {
+ SSL *const ssl = hs->ssl;
SSLSignatureAlgorithmList ret;
- if (!ssl->config->verify_sigalgs.empty()) {
- ret.list = ssl->config->verify_sigalgs;
+ if (!hs->config->verify_sigalgs.empty()) {
+ ret.list = hs->config->verify_sigalgs;
} else {
ret.list = kVerifySignatureAlgorithms;
ret.skip_ed25519 = !ssl->ctx->ed25519_enabled;
@@ -484,8 +486,8 @@
return ret;
}
-bool tls12_add_verify_sigalgs(const SSL *ssl, CBB *out) {
- SSLSignatureAlgorithmList list = tls12_get_verify_sigalgs(ssl);
+bool tls12_add_verify_sigalgs(const SSL_HANDSHAKE *hs, CBB *out) {
+ SSLSignatureAlgorithmList list = tls12_get_verify_sigalgs(hs);
uint16_t sigalg;
while (list.Next(&sigalg)) {
if (!CBB_add_u16(out, sigalg)) {
@@ -495,9 +497,9 @@
return true;
}
-bool tls12_check_peer_sigalg(const SSL *ssl, uint8_t *out_alert,
+bool tls12_check_peer_sigalg(const SSL_HANDSHAKE *hs, uint8_t *out_alert,
uint16_t sigalg) {
- SSLSignatureAlgorithmList list = tls12_get_verify_sigalgs(ssl);
+ SSLSignatureAlgorithmList list = tls12_get_verify_sigalgs(hs);
uint16_t verify_sigalg;
while (list.Next(&verify_sigalg)) {
if (verify_sigalg == sigalg) {
@@ -936,7 +938,6 @@
// https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
static bool ext_sigalgs_add_clienthello(SSL_HANDSHAKE *hs, CBB *out) {
- SSL *const ssl = hs->ssl;
if (hs->max_version < TLS1_2_VERSION) {
return true;
}
@@ -945,7 +946,7 @@
if (!CBB_add_u16(out, TLSEXT_TYPE_signature_algorithms) ||
!CBB_add_u16_length_prefixed(out, &contents) ||
!CBB_add_u16_length_prefixed(&contents, &sigalgs_cbb) ||
- !tls12_add_verify_sigalgs(ssl, &sigalgs_cbb) ||
+ !tls12_add_verify_sigalgs(hs, &sigalgs_cbb) ||
!CBB_flush(out)) {
return false;
}
diff --git a/ssl/tls13_both.cc b/ssl/tls13_both.cc
index 18bdef2..93e2f6a 100644
--- a/ssl/tls13_both.cc
+++ b/ssl/tls13_both.cc
@@ -356,7 +356,7 @@
}
uint8_t alert = SSL_AD_DECODE_ERROR;
- if (!tls12_check_peer_sigalg(ssl, &alert, signature_algorithm)) {
+ if (!tls12_check_peer_sigalg(hs, &alert, signature_algorithm)) {
ssl_send_alert(ssl, SSL3_AL_FATAL, alert);
return false;
}
diff --git a/ssl/tls13_server.cc b/ssl/tls13_server.cc
index 192328b..39d44bc 100644
--- a/ssl/tls13_server.cc
+++ b/ssl/tls13_server.cc
@@ -627,7 +627,7 @@
!CBB_add_u16_length_prefixed(&cert_request_extensions,
&sigalg_contents) ||
!CBB_add_u16_length_prefixed(&sigalg_contents, &sigalgs_cbb) ||
- !tls12_add_verify_sigalgs(ssl, &sigalgs_cbb)) {
+ !tls12_add_verify_sigalgs(hs, &sigalgs_cbb)) {
return ssl_hs_error;
}