Add ssl_has_CA_names and ssl_add_CA_names Change-Id: I22866c72e9cacbcceb48fc7c99dd22a5ff7edeae Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/71609 Reviewed-by: Adam Langley <agl@google.com> Commit-Queue: Bob Beck <bbe@google.com>
diff --git a/ssl/internal.h b/ssl/internal.h index ccb66e0..c34e9d9 100644 --- a/ssl/internal.h +++ b/ssl/internal.h
@@ -1629,13 +1629,21 @@ uint8_t *out_alert, CBS *cbs); -// ssl_has_client_CAs returns there are configured CAs. +// ssl_has_client_CAs returns whether there are configured CAs. bool ssl_has_client_CAs(const SSL_CONFIG *cfg); // ssl_add_client_CA_list adds the configured CA list to |cbb| in the format // used by a TLS CertificateRequest message. It returns true on success and // false on error. -bool ssl_add_client_CA_list(SSL_HANDSHAKE *hs, CBB *cbb); +bool ssl_add_client_CA_list(const SSL_HANDSHAKE *hs, CBB *cbb); + +// ssl_has_CA_names returns whether there are configured CA names. +bool ssl_has_CA_names(const SSL_CONFIG *cfg); + +// ssl_add_CA_names adds the configured CA_names list to |cbb| in the format +// used by a TLS Certificate Authorities extension. It returns true on success +// and false on error. +bool ssl_add_CA_names(const SSL_HANDSHAKE *hs, CBB *cbb); // ssl_check_leaf_certificate returns one if |pkey| and |leaf| are suitable as // a server's leaf certificate for |hs|. Otherwise, it returns zero and pushes
diff --git a/ssl/ssl_cert.cc b/ssl/ssl_cert.cc index 68e155c..541097c 100644 --- a/ssl/ssl_cert.cc +++ b/ssl/ssl_cert.cc
@@ -513,28 +513,29 @@ return ret; } -bool ssl_has_client_CAs(const SSL_CONFIG *cfg) { - const STACK_OF(CRYPTO_BUFFER) *names = cfg->client_CA.get(); - if (names == nullptr) { - names = cfg->ssl->ctx->client_CA.get(); +static bool CA_names_non_empty(const STACK_OF(CRYPTO_BUFFER) *config_names, + const STACK_OF(CRYPTO_BUFFER) *ctx_names) { + if (config_names != nullptr) { + return sk_CRYPTO_BUFFER_num(config_names) > 0; } - if (names == nullptr) { - return false; + if (ctx_names != nullptr) { + return sk_CRYPTO_BUFFER_num(ctx_names) > 0; } - return sk_CRYPTO_BUFFER_num(names) > 0; + return false; } -bool ssl_add_client_CA_list(SSL_HANDSHAKE *hs, CBB *cbb) { + +static bool marshal_CA_names(const STACK_OF(CRYPTO_BUFFER) *config_names, + const STACK_OF(CRYPTO_BUFFER) *ctx_names, + CBB *cbb) { + const STACK_OF(CRYPTO_BUFFER) *names = config_names == nullptr ? ctx_names : config_names; CBB child, name_cbb; + if (!CBB_add_u16_length_prefixed(cbb, &child)) { return false; } - const STACK_OF(CRYPTO_BUFFER) *names = hs->config->client_CA.get(); - if (names == NULL) { - names = hs->ssl->ctx->client_CA.get(); - } - if (names == NULL) { + if (names == nullptr) { return CBB_flush(cbb); } @@ -549,6 +550,22 @@ return CBB_flush(cbb); } +bool ssl_has_client_CAs(const SSL_CONFIG *cfg) { + return CA_names_non_empty(cfg->client_CA.get(), cfg->ssl->ctx->client_CA.get()); +} + +bool ssl_has_CA_names(const SSL_CONFIG *cfg) { + return CA_names_non_empty(cfg->CA_names.get(), cfg->ssl->ctx->CA_names.get()); +} + +bool ssl_add_client_CA_list(const SSL_HANDSHAKE *hs, CBB *cbb) { + return marshal_CA_names(hs->config->client_CA.get(), hs->ssl->ctx->client_CA.get(), cbb); +} + +bool ssl_add_CA_names(const SSL_HANDSHAKE *hs, CBB *cbb) { + return marshal_CA_names(hs->config->CA_names.get(), hs->ssl->ctx->CA_names.get(), cbb); +} + bool ssl_check_leaf_certificate(SSL_HANDSHAKE *hs, EVP_PKEY *pkey, const CRYPTO_BUFFER *leaf) { assert(ssl_protocol_version(hs->ssl) < TLS1_3_VERSION);