Go to the documentation of this file.
154 #include "../crypto/internal.h"
205 if (cert->
chain !=
nullptr) {
218 for (
X509 *x509 : chain) {
244 cert->x509_chain =
nullptr;
251 UniquePtr<X509_NAME>
name(
253 if (
name ==
nullptr ||
294 if (!chain_without_leaf) {
301 bssl::UniquePtr<X509> leaf;
308 if (leaf ==
nullptr) {
310 }
else if (chain_without_leaf &&
311 !
PushToStack(chain_without_leaf.get(), UpRef(x509))) {
322 sess->x509_chain = chain.release();
325 sess->x509_chain_without_leaf = chain_without_leaf.release();
335 if (session->x509_chain !=
nullptr) {
337 if (new_session->x509_chain ==
nullptr) {
341 if (session->x509_chain_without_leaf !=
nullptr) {
342 new_session->x509_chain_without_leaf =
344 if (new_session->x509_chain_without_leaf ==
nullptr) {
356 session->x509_chain =
nullptr;
358 session->x509_chain_without_leaf =
nullptr;
366 if (cert_chain ==
nullptr ||
sk_X509_num(cert_chain) == 0) {
373 if (hs->
config->
cert->verify_store !=
nullptr) {
374 verify_store = hs->
config->
cert->verify_store;
390 ssl->
server ?
"ssl_client" :
"ssl_server") ||
428 hs->cached_x509_ca_names =
nullptr;
442 cfg->cached_x509_client_CA =
nullptr;
447 cfg->cached_x509_client_CA =
nullptr;
469 leaf.get(),
nullptr)) {
496 ctx->cached_x509_client_CA =
nullptr;
502 return (
ctx->cert_store !=
nullptr &&
ctx->param !=
nullptr);
534 using namespace bssl;
542 if (session == NULL || session->
x509_peer == NULL) {
551 if (ssl ==
nullptr) {
555 if (session ==
nullptr) {
561 return ssl->
server ? session->x509_chain_without_leaf : session->x509_chain;
567 if (session == NULL) {
571 return session->x509_chain;
624 return ssl->
config->param;
642 return ssl->
config->verify_callback;
647 return ctx->verify_mode;
658 return ctx->default_verify_callback;
686 ctx->app_verify_callback =
cb;
687 ctx->app_verify_arg =
arg;
694 ctx->default_verify_callback =
cb;
708 const char *ca_dir) {
716 if (session == NULL) {
724 return ctx->cert_store;
730 ctx->cert_store = store;
766 cert->
chain == NULL) {
830 if (cert->
chain != NULL) {
941 if (cert->x509_chain !=
nullptr ||
942 cert->
chain ==
nullptr ||
961 cert->x509_chain = chain.release();
973 *out_chain =
ctx->cert->x509_chain;
993 *out_chain = ssl->
config->cert->x509_chain;
1040 return ret.release();
1078 ssl->
ctx->x509_method->ssl_flush_cached_client_CA(ssl->
config.get());
1085 ctx->x509_method->ssl_ctx_flush_cached_client_CA(
ctx);
1093 if (
names == NULL) {
1097 if (*cached != NULL) {
1109 UniquePtr<X509_NAME>
name(
1118 *cached = new_cache.release();
1134 if (ssl->
s3->hs != NULL) {
1135 return buffer_names_to_x509(ssl->
s3->hs->ca_names.get(),
1136 &ssl->
s3->hs->cached_x509_ca_names);
1142 if (ssl->
config->client_CA != NULL) {
1143 return buffer_names_to_x509(
1144 ssl->
config->client_CA.get(),
1155 return buffer_names_to_x509(
1156 ctx->client_CA.get(),
1179 if (*
names ==
nullptr) {
1183 if (*
names == NULL) {
1229 ssl->
ctx->client_cert_cb == NULL) {
1235 int ret = ssl->
ctx->client_cert_cb(ssl, &x509, &pkey);
1239 UniquePtr<X509> free_x509(x509);
1240 UniquePtr<EVP_PKEY> free_pkey(pkey);
1258 ctx->client_cert_cb =
cb;
1264 *store_ptr = new_store;
1266 if (new_store != NULL && take_ref) {
static int ssl_cert_cache_chain_certs(CERT *cert)
#define SSL_MODE_NO_AUTO_CHAIN
void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth)
static bool ssl_crypto_x509_ssl_ctx_new(SSL_CTX *ctx)
void SSL_set_client_CA_list(SSL *ssl, STACK_OF(X509_NAME) *name_list)
bool ssl_has_certificate(const SSL_HANDSHAKE *hs)
const uint8_t long length
static void ssl_crypto_x509_cert_dup(CERT *new_cert, const CERT *cert)
#define X509_VERIFY_PARAM_set_purpose
#define X509_get_subject_name
OPENSSL_EXPORT UniquePtr< SSL_SESSION > SSL_SESSION_parse(CBS *cbs, const SSL_X509_METHOD *x509_method, CRYPTO_BUFFER_POOL *pool)
static void ssl_crypto_x509_cert_free(CERT *cert)
void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, int(*cb)(SSL *ssl, X509 **out_x509, EVP_PKEY **out_pkey))
int(*)(int, X509_STORE_CTX *) SSL_get_verify_callback(const SSL *ssl)
int SSL_CTX_get_verify_mode(const SSL_CTX *ctx)
#define X509_VERIFY_PARAM_set_trust
#define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE
#define X509_VERIFY_PARAM_set1_host
#define X509_STORE_up_ref
#define X509_V_ERR_INVALID_CA
X509_VERIFY_PARAM * SSL_get0_param(SSL *ssl)
int SSL_use_certificate(SSL *ssl, X509 *x)
int SSL_add0_chain_cert(SSL *ssl, X509 *x509)
static bool ssl_crypto_x509_session_cache_objects(SSL_SESSION *sess)
static int do_client_cert_cb(SSL *ssl, void *arg)
void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list)
int SSL_set_trust(SSL *ssl, int trust)
int SSL_set1_param(SSL *ssl, const X509_VERIFY_PARAM *param)
#define X509_STORE_CTX_set_ex_data
int SSL_CTX_set_trust(SSL_CTX *ctx, int trust)
int SSL_get_verify_depth(const SSL *ssl)
#define X509_V_ERR_CRL_HAS_EXPIRED
int SSL_set0_chain(SSL *ssl, STACK_OF(X509) *chain)
#define OPENSSL_PUT_ERROR(library, reason)
static bool ssl_cert_set_chain(CERT *cert, STACK_OF(X509) *chain)
#define SSL_AD_CERTIFICATE_UNKNOWN
#define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD
bssl::UniquePtr< bssl::SSL_CONFIG > config
void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int(*cb)(X509_STORE_CTX *store_ctx, void *arg), void *arg)
#define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE
#define SSL_AD_INTERNAL_ERROR
#define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
#define X509_V_ERR_CRL_SIGNATURE_FAILURE
#define CRYPTO_BUFFER_len
bssl::ssl_hs_wait_t(* do_handshake)(bssl::SSL_HANDSHAKE *hs)
int SSL_clear_chain_certs(SSL *ssl)
X509 * SSL_get_certificate(const SSL *ssl)
#define sk_CRYPTO_BUFFER_push
OPENSSL_EXPORT X509 * X509_parse_from_buffer(CRYPTO_BUFFER *buf)
#define SSL_AD_UNKNOWN_CA
X509 * SSL_CTX_get0_certificate(const SSL_CTX *ctx)
static int ssl_use_certificate(CERT *cert, X509 *x)
#define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD
#define X509_V_ERR_PATH_LENGTH_EXCEEDED
static void set_client_CA_list(UniquePtr< STACK_OF(CRYPTO_BUFFER)> *ca_list, const STACK_OF(X509_NAME) *name_list, CRYPTO_BUFFER_POOL *pool)
#define X509_STORE_CTX_set_verify_cb
static struct test_ctx ctx
void SSL_set_verify(SSL *ssl, int mode, int(*callback)(int ok, X509_STORE_CTX *store_ctx))
static void ssl_crypto_x509_ssl_ctx_flush_cached_client_CA(SSL_CTX *ctx)
int SSL_set1_verify_cert_store(SSL *ssl, X509_STORE *store)
#define X509_chain_up_ref
#define X509_V_ERR_CERT_REVOKED
#define sk_X509_NAME_deep_copy
#define SSL_AD_CERTIFICATE_REVOKED
#define X509_VERIFY_PARAM_inherit
int SSL_CTX_set1_chain(SSL_CTX *ctx, STACK_OF(X509) *chain)
int SSL_CTX_set1_param(SSL_CTX *ctx, const X509_VERIFY_PARAM *param)
static void ssl_crypto_x509_cert_flush_cached_chain(CERT *cert)
#define X509_V_ERR_CERT_HAS_EXPIRED
int i2d_SSL_SESSION_bio(BIO *bio, const SSL_SESSION *session)
#define SSL_get_client_CA_list
#define SSL_AD_CERTIFICATE_EXPIRED
static X509 * ssl_cert_get0_leaf(CERT *cert)
#define X509_VERIFY_PARAM_new
static void ssl_crypto_x509_cert_flush_cached_leaf(CERT *cert)
bool ssl_set_cert(CERT *cert, UniquePtr< CRYPTO_BUFFER > buffer)
int(*)(int ok, X509_STORE_CTX *store_ctx) SSL_CTX_get_verify_callback(const SSL_CTX *ctx)
int SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain)
int SSL_CTX_add1_chain_cert(SSL_CTX *ctx, X509 *x509)
#define SSL_CTX_set_cert_cb
#define X509_V_ERR_UNSPECIFIED
int SSL_CTX_set0_verify_cert_store(SSL_CTX *ctx, X509_STORE *store)
int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x509)
#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
static void ssl_crypto_x509_ssl_flush_cached_client_CA(SSL_CONFIG *cfg)
#define sk_X509_NAME_pop_free
#define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER
UniquePtr< STACK_OF(CRYPTO_BUFFER)> chain
#define sk_CRYPTO_BUFFER_new_null
#define X509_STORE_load_locations
int SSL_set_purpose(SSL *ssl, int purpose)
X509_VERIFY_PARAM * param
int(* verify_callback)(int ok, X509_STORE_CTX *ctx)
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
#define X509_V_ERR_INVALID_PURPOSE
#define X509_V_ERR_CRL_NOT_YET_VALID
static void ssl_crypto_x509_hs_flush_cached_ca_names(SSL_HANDSHAKE *hs)
static int ssl_cert_add1_chain_cert(CERT *cert, X509 *x509)
#define ERR_R_PASSED_NULL_PARAMETER
#define X509_STORE_CTX_set_default
static bool ssl_crypto_x509_check_client_CA_list(STACK_OF(CRYPTO_BUFFER) *names)
#define SSL_get_peer_cert_chain
#define X509_V_ERR_APPLICATION_VERIFICATION
static void ssl_crypto_x509_ssl_config_free(SSL_CONFIG *cfg)
#define X509_V_ERR_CERT_SIGNATURE_FAILURE
int SSL_CTX_get_verify_depth(const SSL_CTX *ctx)
static void ssl_crypto_x509_session_clear(SSL_SESSION *session)
static bool ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session, SSL_HANDSHAKE *hs, uint8_t *out_alert)
int SSL_alert_from_verify_result(long result)
#define BSSL_NAMESPACE_END
X509_STORE * SSL_CTX_get_cert_store(const SSL_CTX *ctx)
#define X509_V_ERR_OUT_OF_MEM
OPENSSL_EXPORT int X509_up_ref(X509 *x509)
#define ERR_R_INTERNAL_ERROR
#define X509_V_ERR_IP_ADDRESS_MISMATCH
#define SSL_SESSION_to_bytes
static int ssl_cert_add0_chain_cert(CERT *cert, X509 *x509)
#define CRYPTO_BUFFER_new
static void callback(void *arg, int status, int timeouts, struct hostent *host)
int SSL_set0_verify_cert_store(SSL *ssl, X509_STORE *store)
#define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD
int SSL_CTX_set1_verify_cert_store(SSL_CTX *ctx, X509_STORE *store)
void SSL_CTX_set_cert_store(SSL_CTX *ctx, X509_STORE *store)
std::unique_ptr< T, DefaultDeleteChar > UniquePtr
#define X509_V_ERR_INVALID_CALL
static UniquePtr< STACK_OF(CRYPTO_BUFFER)> new_leafless_chain(void)
#define SSL_AD_UNSUPPORTED_CERTIFICATE
int SSL_CTX_get0_chain_certs(const SSL_CTX *ctx, STACK_OF(X509) **out_chain)
#define X509_VERIFY_PARAM_get_depth
static int ssl_cert_append_cert(CERT *cert, X509 *x509)
int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x)
#define X509_STORE_CTX_new
#define X509_STORE_CTX_get1_chain
static int set_cert_store(X509_STORE **store_ptr, X509_STORE *new_store, int take_ref)
static void ssl_crypto_x509_cert_clear(CERT *cert)
void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, int(*cb)(int, X509_STORE_CTX *))
#define sk_CRYPTO_BUFFER_value
int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
#define X509_STORE_CTX_init
#define SSL_CTX_get_client_CA_list
static void ssl_crypto_x509_ssl_ctx_free(SSL_CTX *ctx)
#define X509_V_ERR_CERT_CHAIN_TOO_LONG
IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION) SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a
#define X509_V_ERR_HOSTNAME_MISMATCH
int SSL_get_ex_data_X509_STORE_CTX_idx(void)
#define SSL_use_PrivateKey
int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *ca_file, const char *ca_dir)
static int ssl_cert_set0_chain(CERT *cert, STACK_OF(X509) *chain)
const SSL_X509_METHOD ssl_crypto_x509_method
#define X509_VERIFY_PARAM_set1
#define X509_VERIFY_PARAM_set_depth
#define X509_V_ERR_STORE_LOOKUP
UniquePtr< SSL_SESSION > ret
#define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD
X509_STORE * verify_store
#define X509_V_ERR_CERT_UNTRUSTED
std::enable_if<!internal::StackTraits< Stack >::kIsConst, bool >::type PushToStack(Stack *sk, UniquePtr< typename internal::StackTraits< Stack >::Type > elem)
static int ssl_cert_set1_chain(CERT *cert, STACK_OF(X509) *chain)
#define SSL_AD_HANDSHAKE_FAILURE
#define SSL_get0_ech_name_override
int SSL_get0_chain_certs(const SSL *ssl, STACK_OF(X509) **out_chain)
int SSL_CTX_clear_chain_certs(SSL_CTX *ctx)
#define X509_V_ERR_CERT_REJECTED
int SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *x509)
#define sk_X509_NAME_new_null
#define X509_V_ERR_CERT_NOT_YET_VALID
const SSL_X509_METHOD * x509_method
OPENSSL_EXPORT X509_NAME * X509_NAME_dup(X509_NAME *xn)
InternalDescriptorPool * pool
int SSL_add_client_CA(SSL *ssl, X509 *x509)
int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose)
STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *ssl)
static BSSL_NAMESPACE_BEGIN void check_ssl_x509_method(const SSL *ssl)
static void free_data(void *data, size_t len)
#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT
#define X509_STORE_CTX_get_error
X509 * SSL_get_peer_certificate(const SSL *ssl)
int SSL_CTX_get_extra_chain_certs(const SSL_CTX *ctx, STACK_OF(X509) **out_chain)
#define X509_STORE_set_default_paths
#define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE
static bool ssl_crypto_x509_session_dup(SSL_SESSION *new_session, const SSL_SESSION *session)
#define SSL_R_DECODE_ERROR
static bool ssl_crypto_x509_ssl_new(SSL_HANDSHAKE *hs)
#define X509_STORE_CTX_get0_param
#define SSL_get_peer_full_cert_chain
static int add_client_CA(UniquePtr< STACK_OF(CRYPTO_BUFFER)> *names, X509 *x509, CRYPTO_BUFFER_POOL *pool)
static void check_ssl_ctx_x509_method(const SSL_CTX *ctx)
#define X509_VERIFY_PARAM_free
#define X509_V_ERR_EMAIL_MISMATCH
int SSL_set1_chain(SSL *ssl, STACK_OF(X509) *chain)
bssl::UniquePtr< STACK_OF(CRYPTO_BUFFER)> certs
bssl::UniquePtr< SSL_CTX > ctx
#define SSL_AD_DECRYPT_ERROR
#define PEM_STRING_SSL_SESSION
static int ssl_cert_cache_leaf_cert(CERT *cert)
#define sk_CRYPTO_BUFFER_num
int SSL_add1_chain_cert(SSL *ssl, X509 *x509)
long SSL_get_verify_result(const SSL *ssl)
#define X509_V_ERR_UNABLE_TO_GET_CRL
#define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY
int(* app_verify_callback)(X509_STORE_CTX *store_ctx, void *arg)
OPENSSL_EXPORT pem_password_cb * cb
static bool ssl_crypto_x509_ssl_auto_chain_if_needed(SSL_HANDSHAKE *hs)
int SSL_CTX_clear_extra_chain_certs(SSL_CTX *ctx)
#define CRYPTO_BUFFER_data
#define ERR_R_MALLOC_FAILURE
#define SSL_AD_BAD_CERTIFICATE
static UniquePtr< CRYPTO_BUFFER > x509_to_buffer(X509 *x509)
SSL_SESSION * d2i_SSL_SESSION_bio(BIO *bio, SSL_SESSION **out)
OPENSSL_EXPORT SSL_SESSION * d2i_SSL_SESSION(SSL_SESSION **a, const uint8_t **pp, long length)
int SSL_CTX_add0_chain_cert(SSL_CTX *ctx, X509 *x509)
X509_VERIFY_PARAM * SSL_CTX_get0_param(SSL_CTX *ctx)
void SSL_set_verify_depth(SSL *ssl, int depth)
#define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:21