OpenSSL: Include SIG and KEM algorithms in verbose

Currently the verbose output does not include which algorithms are used
for the signature and key exchange when using OpenSSL. Including the
algorithms used will enable better debugging when working on using new
algorithm implementations. Know what algorithms are used has become more
important with the fast growing research into new quantum-safe
algorithms.

This implementation includes a build time check for the OpenSSL version
to use a new function that will be included in OpenSSL 3.2 that was
introduced in openssl/openssl@6866824

Based-on-patch-by: Martin Schmatz <mrt@zurich.ibm.com>
Closes #12030
This commit is contained in:
Alex Bozarth 2023-10-03 17:30:13 -05:00 коммит произвёл Daniel Stenberg
Родитель 19a82c12c0
Коммит b6e6d4ff8f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 5CC908FDB71E12C2
1 изменённых файлов: 75 добавлений и 2 удалений

Просмотреть файл

@ -79,6 +79,8 @@
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/pkcs12.h>
#include <openssl/tls1.h>
#include <openssl/evp.h>
#if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_OCSP)
#include <openssl/ocsp.h>
@ -3986,13 +3988,28 @@ static CURLcode ossl_connect_step2(struct Curl_cfilter *cf,
}
}
else {
int psigtype_nid = NID_undef;
const char *negotiated_group_name = NULL;
/* we connected fine, we're not waiting for anything else. */
connssl->connecting_state = ssl_connect_3;
#if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
SSL_get_peer_signature_type_nid(backend->handle, &psigtype_nid);
#if (OPENSSL_VERSION_NUMBER >= 0x30200000L)
negotiated_group_name = SSL_get0_group_name(backend->handle);
#else
negotiated_group_name =
OBJ_nid2sn(SSL_get_negotiated_group(backend->handle) & 0x0000FFFF);
#endif
#endif
/* Informational message */
infof(data, "SSL connection using %s / %s",
infof(data, "SSL connection using %s / %s / %s / %s",
SSL_get_version(backend->handle),
SSL_get_cipher(backend->handle));
SSL_get_cipher(backend->handle),
negotiated_group_name == NULL ? NULL : negotiated_group_name,
OBJ_nid2sn(psigtype_nid));
#ifdef HAS_ALPN
/* Sets data and len to negotiated protocol, len is 0 if no protocol was
@ -4068,6 +4085,60 @@ static CURLcode ossl_pkp_pin_peer_pubkey(struct Curl_easy *data, X509* cert,
return result;
}
#if (OPENSSL_VERSION_NUMBER >= 0x30000000L) && \
!defined(CURL_DISABLE_VERBOSE_STRINGS)
static void infof_certstack(struct Curl_easy *data, const SSL *ssl)
{
STACK_OF(X509) *certstack;
long verify_result;
int num_cert_levels;
int cert_level;
verify_result = SSL_get_verify_result(ssl);
if(verify_result != X509_V_OK)
certstack = SSL_get_peer_cert_chain(ssl);
else
certstack = SSL_get0_verified_chain(ssl);
num_cert_levels = sk_X509_num(certstack);
OpenSSL_add_all_algorithms();
OpenSSL_add_all_digests();
for(cert_level = 0; cert_level < num_cert_levels; cert_level++) {
char cert_algorithm[80] = "";
char group_name[80] = "";
char group_name_final[80] = "";
const X509_ALGOR *palg_cert = NULL;
const ASN1_OBJECT *paobj_cert = NULL;
X509 *current_cert;
EVP_PKEY *current_pkey;
int key_bits;
int key_sec_bits;
int get_group_name;
current_cert = sk_X509_value(certstack, cert_level);
X509_get0_signature(NULL, &palg_cert, current_cert);
X509_ALGOR_get0(&paobj_cert, NULL, NULL, palg_cert);
OBJ_obj2txt(cert_algorithm, sizeof(cert_algorithm), paobj_cert, 0);
current_pkey = X509_get0_pubkey(current_cert);
key_bits = EVP_PKEY_bits(current_pkey);
key_sec_bits = EVP_PKEY_get_security_bits(current_pkey);
get_group_name = EVP_PKEY_get_group_name(current_pkey, group_name,
sizeof(group_name), NULL);
msnprintf(group_name_final, sizeof(group_name_final), "/%s", group_name);
infof(data,
" Certificate level %d: "
"Public key type %s%s (%d/%d Bits/secBits), signed using %s",
cert_level, EVP_PKEY_get0_type_name(current_pkey),
get_group_name == 0 ? "" : group_name_final,
key_bits, key_sec_bits, cert_algorithm);
}
}
#else
#define infof_certstack(data, ssl)
#endif
/*
* Get the server cert, verify it and show it, etc., only call failf() if the
@ -4258,6 +4329,8 @@ static CURLcode servercert(struct Curl_cfilter *cf,
infof(data, " SSL certificate verify ok.");
}
infof_certstack(data, backend->handle);
#if (OPENSSL_VERSION_NUMBER >= 0x0090808fL) && !defined(OPENSSL_NO_TLSEXT) && \
!defined(OPENSSL_NO_OCSP)
if(conn_config->verifystatus) {