Slightly simplify ssl_x509.cc
We've got a few too many of these set1/set0 wrappers.
Change-Id: I4bde492b1a2a90a151b26800076d085f7122f623
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/66607
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-by: Bob Beck <bbe@google.com>
diff --git a/ssl/ssl_x509.cc b/ssl/ssl_x509.cc
index 43672ce..06baf88 100644
--- a/ssl/ssl_x509.cc
+++ b/ssl/ssl_x509.cc
@@ -194,11 +194,21 @@
return chain;
}
-// ssl_cert_set_chain sets elements 1.. of |cert->chain| to the serialised
+static void ssl_crypto_x509_cert_flush_cached_leaf(CERT *cert) {
+ X509_free(cert->x509_leaf);
+ cert->x509_leaf = nullptr;
+}
+
+static void ssl_crypto_x509_cert_flush_cached_chain(CERT *cert) {
+ sk_X509_pop_free(cert->x509_chain, X509_free);
+ cert->x509_chain = nullptr;
+}
+
+// ssl_cert_set1_chain sets elements 1.. of |cert->chain| to the serialised
// forms of elements of |chain|. It returns one on success or zero on error, in
// which case no change to |cert->chain| is made. It preverses the existing
// leaf from |cert->chain|, if any.
-static bool ssl_cert_set_chain(CERT *cert, STACK_OF(X509) *chain) {
+static bool ssl_cert_set1_chain(CERT *cert, STACK_OF(X509) *chain) {
UniquePtr<STACK_OF(CRYPTO_BUFFER)> new_chain;
if (cert->chain != nullptr) {
@@ -230,19 +240,10 @@
}
cert->chain = std::move(new_chain);
+ ssl_crypto_x509_cert_flush_cached_chain(cert);
return true;
}
-static void ssl_crypto_x509_cert_flush_cached_leaf(CERT *cert) {
- X509_free(cert->x509_leaf);
- cert->x509_leaf = nullptr;
-}
-
-static void ssl_crypto_x509_cert_flush_cached_chain(CERT *cert) {
- sk_X509_pop_free(cert->x509_chain, X509_free);
- cert->x509_chain = nullptr;
-}
-
static bool ssl_crypto_x509_check_client_CA_list(
STACK_OF(CRYPTO_BUFFER) *names) {
for (const CRYPTO_BUFFER *buffer : names) {
@@ -446,8 +447,9 @@
static bool ssl_crypto_x509_ssl_auto_chain_if_needed(SSL_HANDSHAKE *hs) {
// Only build a chain if there are no intermediates configured and the feature
// isn't disabled.
- if ((hs->ssl->mode & SSL_MODE_NO_AUTO_CHAIN) ||
- !ssl_has_certificate(hs) || hs->config->cert->chain == NULL ||
+ SSL *const ssl = hs->ssl;
+ if ((ssl->mode & SSL_MODE_NO_AUTO_CHAIN) || !ssl_has_certificate(hs) ||
+ hs->config->cert->chain == NULL ||
sk_CRYPTO_BUFFER_num(hs->config->cert->chain.get()) > 1) {
return true;
}
@@ -460,8 +462,8 @@
}
UniquePtr<X509_STORE_CTX> ctx(X509_STORE_CTX_new());
- if (!ctx || !X509_STORE_CTX_init(ctx.get(), hs->ssl->ctx->cert_store,
- leaf.get(), nullptr)) {
+ if (!ctx || !X509_STORE_CTX_init(ctx.get(), ssl->ctx->cert_store, leaf.get(),
+ nullptr)) {
OPENSSL_PUT_ERROR(SSL, ERR_R_X509_LIB);
return false;
}
@@ -477,13 +479,7 @@
}
X509_free(sk_X509_shift(chain.get()));
- if (!ssl_cert_set_chain(hs->config->cert.get(), chain.get())) {
- return false;
- }
-
- ssl_crypto_x509_cert_flush_cached_chain(hs->config->cert.get());
-
- return true;
+ return SSL_set1_chain(ssl, chain.get());
}
static void ssl_crypto_x509_ssl_ctx_flush_cached_client_CA(SSL_CTX *ctx) {
@@ -795,26 +791,7 @@
return ssl_cert_get0_leaf(ctx->cert.get());
}
-static int ssl_cert_set0_chain(CERT *cert, STACK_OF(X509) *chain) {
- if (!ssl_cert_set_chain(cert, chain)) {
- return 0;
- }
-
- sk_X509_pop_free(chain, X509_free);
- ssl_crypto_x509_cert_flush_cached_chain(cert);
- return 1;
-}
-
-static int ssl_cert_set1_chain(CERT *cert, STACK_OF(X509) *chain) {
- if (!ssl_cert_set_chain(cert, chain)) {
- return 0;
- }
-
- ssl_crypto_x509_cert_flush_cached_chain(cert);
- return 1;
-}
-
-static int ssl_cert_append_cert(CERT *cert, X509 *x509) {
+static int ssl_cert_add1_chain_cert(CERT *cert, X509 *x509) {
assert(cert->x509_method);
UniquePtr<CRYPTO_BUFFER> buffer = x509_to_buffer(x509);
@@ -822,43 +799,38 @@
return 0;
}
- if (cert->chain != NULL) {
- return PushToStack(cert->chain.get(), std::move(buffer));
+ if (cert->chain == nullptr) {
+ cert->chain = new_leafless_chain();
+ if (cert->chain == nullptr) {
+ return 0;
+ }
}
- cert->chain = new_leafless_chain();
- if (!cert->chain ||
- !PushToStack(cert->chain.get(), std::move(buffer))) {
- cert->chain.reset();
+ if (!PushToStack(cert->chain.get(), std::move(buffer))) {
return 0;
}
+ ssl_crypto_x509_cert_flush_cached_chain(cert);
return 1;
}
static int ssl_cert_add0_chain_cert(CERT *cert, X509 *x509) {
- if (!ssl_cert_append_cert(cert, x509)) {
+ if (!ssl_cert_add1_chain_cert(cert, x509)) {
return 0;
}
X509_free(cert->x509_stash);
cert->x509_stash = x509;
- ssl_crypto_x509_cert_flush_cached_chain(cert);
- return 1;
-}
-
-static int ssl_cert_add1_chain_cert(CERT *cert, X509 *x509) {
- if (!ssl_cert_append_cert(cert, x509)) {
- return 0;
- }
-
- ssl_crypto_x509_cert_flush_cached_chain(cert);
return 1;
}
int SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
check_ssl_ctx_x509_method(ctx);
- return ssl_cert_set0_chain(ctx->cert.get(), chain);
+ if (!ssl_cert_set1_chain(ctx->cert.get(), chain)) {
+ return 0;
+ }
+ sk_X509_pop_free(chain, X509_free);
+ return 1;
}
int SSL_CTX_set1_chain(SSL_CTX *ctx, STACK_OF(X509) *chain) {
@@ -871,7 +843,11 @@
if (!ssl->config) {
return 0;
}
- return ssl_cert_set0_chain(ssl->config->cert.get(), chain);
+ if (!ssl_cert_set1_chain(ssl->config->cert.get(), chain)) {
+ return 0;
+ }
+ sk_X509_pop_free(chain, X509_free);
+ return 1;
}
int SSL_set1_chain(SSL *ssl, STACK_OF(X509) *chain) {