|
|
|
|
@@ -108,8 +108,10 @@
|
|
|
|
|
# if LIBRESSL_VERSION_NUMBER < 0x2090100fL /* 2019-04-13 */
|
|
|
|
|
# error "LibreSSL 2.9.1 or later required"
|
|
|
|
|
# endif
|
|
|
|
|
#elif OPENSSL_VERSION_NUMBER < 0x1000201fL /* 2015-03-19 */
|
|
|
|
|
# error "OpenSSL 1.0.2a or later required"
|
|
|
|
|
#elif !defined(HAVE_BORINGSSL_LIKE)
|
|
|
|
|
# ifndef HAVE_OPENSSL3 /* 2021-09-07 */
|
|
|
|
|
# error "OpenSSL 3.0.0 or later required"
|
|
|
|
|
# endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if defined(HAVE_OPENSSL3) && !defined(OPENSSL_NO_UI_CONSOLE)
|
|
|
|
|
@@ -123,8 +125,7 @@ static void ossl_provider_cleanup(struct Curl_easy *data);
|
|
|
|
|
|
|
|
|
|
/* AWS-LC fixed a bug with large buffers in v1.61.0 which also introduced
|
|
|
|
|
* X509_V_ERR_EC_KEY_EXPLICIT_PARAMS. */
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \
|
|
|
|
|
!defined(LIBRESSL_VERSION_NUMBER) && !defined(OPENSSL_IS_BORINGSSL) && \
|
|
|
|
|
#if !defined(LIBRESSL_VERSION_NUMBER) && !defined(OPENSSL_IS_BORINGSSL) && \
|
|
|
|
|
(!defined(OPENSSL_IS_AWSLC) || defined(X509_V_ERR_EC_KEY_EXPLICIT_PARAMS))
|
|
|
|
|
#define HAVE_SSL_CTX_SET_DEFAULT_READ_BUFFER_LEN 1
|
|
|
|
|
#endif
|
|
|
|
|
@@ -137,31 +138,6 @@ static void ossl_provider_cleanup(struct Curl_easy *data);
|
|
|
|
|
|
|
|
|
|
#if defined(USE_OPENSSL_ENGINE) || defined(OPENSSL_HAS_PROVIDERS)
|
|
|
|
|
#include <openssl/ui.h>
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
|
|
|
|
#define OSSL_UI_METHOD_CAST(x) (x)
|
|
|
|
|
#else
|
|
|
|
|
#define OSSL_UI_METHOD_CAST(x) CURL_UNCONST(x)
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* OpenSSL 1.1.0+ and LibreSSL */
|
|
|
|
|
#define HAVE_X509_GET0_EXTENSIONS 1 /* added in 1.1.0 -pre1 */
|
|
|
|
|
#define HAVE_OPAQUE_EVP_PKEY 1 /* since 1.1.0 -pre3 */
|
|
|
|
|
#define HAVE_OPAQUE_RSA_DSA_DH 1 /* since 1.1.0 -pre5 */
|
|
|
|
|
#define HAVE_ERR_REMOVE_THREAD_STATE_DEPRECATED 1
|
|
|
|
|
#else
|
|
|
|
|
/* For OpenSSL before 1.1.0 */
|
|
|
|
|
#define ASN1_STRING_get0_data(x) ASN1_STRING_data(x)
|
|
|
|
|
#define X509_get0_notBefore(x) X509_get_notBefore(x)
|
|
|
|
|
#define X509_get0_notAfter(x) X509_get_notAfter(x)
|
|
|
|
|
#define OpenSSL_version_num() SSLeay()
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10002003L && \
|
|
|
|
|
OPENSSL_VERSION_NUMBER <= 0x10002FFFL && \
|
|
|
|
|
!defined(OPENSSL_NO_COMP)
|
|
|
|
|
#define HAVE_SSL_COMP_FREE_COMPRESSION_METHODS 1
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_OPENSSL3
|
|
|
|
|
@@ -182,8 +158,7 @@ static void ossl_provider_cleanup(struct Curl_easy *data);
|
|
|
|
|
* BoringSSL: no
|
|
|
|
|
* LibreSSL: supported since 3.4.1 (released 2021-10-14)
|
|
|
|
|
*/
|
|
|
|
|
#if ((OPENSSL_VERSION_NUMBER >= 0x10101000L && \
|
|
|
|
|
!defined(LIBRESSL_VERSION_NUMBER)) || \
|
|
|
|
|
#if (!defined(LIBRESSL_VERSION_NUMBER) || \
|
|
|
|
|
(defined(LIBRESSL_VERSION_NUMBER) && \
|
|
|
|
|
LIBRESSL_VERSION_NUMBER >= 0x3040100fL)) && \
|
|
|
|
|
!defined(OPENSSL_IS_BORINGSSL)
|
|
|
|
|
@@ -198,7 +173,7 @@ static void ossl_provider_cleanup(struct Curl_easy *data);
|
|
|
|
|
* BoringSSL: supported since 0.20240913.0 (commit 826ce15)
|
|
|
|
|
* LibreSSL: no
|
|
|
|
|
*/
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(LIBRESSL_VERSION_NUMBER)
|
|
|
|
|
#ifndef LIBRESSL_VERSION_NUMBER
|
|
|
|
|
#define HAVE_SSL_CTX_SET1_SIGALGS
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
@@ -224,30 +199,6 @@ typedef unsigned long sslerr_t;
|
|
|
|
|
#endif
|
|
|
|
|
#define ossl_valsize_t numcert_t
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
|
|
|
|
/* up2date versions of OpenSSL maintain reasonably secure defaults without
|
|
|
|
|
* breaking compatibility, so it is better not to override the defaults in curl
|
|
|
|
|
*/
|
|
|
|
|
#define DEFAULT_CIPHER_SELECTION NULL
|
|
|
|
|
#else
|
|
|
|
|
/* not the case with old versions of OpenSSL */
|
|
|
|
|
#define DEFAULT_CIPHER_SELECTION \
|
|
|
|
|
"ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
|
|
|
|
#define HAVE_RANDOM_INIT_BY_DEFAULT 1
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Whether the OpenSSL version has the API needed to support sharing an
|
|
|
|
|
* X509_STORE between connections. The API is:
|
|
|
|
|
* * `X509_STORE_up_ref` -- Introduced: OpenSSL 1.1.0.
|
|
|
|
|
*/
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* OpenSSL >= 1.1.0 */
|
|
|
|
|
#define HAVE_SSL_X509_STORE_SHARE
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static CURLcode ossl_certchain(struct Curl_easy *data, SSL *ssl);
|
|
|
|
|
|
|
|
|
|
static CURLcode push_certinfo(struct Curl_easy *data,
|
|
|
|
|
@@ -280,27 +231,12 @@ static CURLcode pubkey_show(struct Curl_easy *data,
|
|
|
|
|
return push_certinfo(data, mem, namebuf, num);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_OPAQUE_RSA_DSA_DH
|
|
|
|
|
#define print_pubkey_BN(_type, _name, _num) \
|
|
|
|
|
pubkey_show(data, mem, _num, #_type, #_name, _name)
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
#define print_pubkey_BN(_type, _name, _num) \
|
|
|
|
|
do { \
|
|
|
|
|
if(_type->_name) { \
|
|
|
|
|
pubkey_show(data, mem, _num, #_type, #_name, _type->_name); \
|
|
|
|
|
} \
|
|
|
|
|
} while(0)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static int asn1_object_dump(const ASN1_OBJECT *a, char *buf, size_t len)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
|
|
|
|
i = i2t_ASN1_OBJECT(buf, (int)len, a);
|
|
|
|
|
#else
|
|
|
|
|
i = i2t_ASN1_OBJECT(buf, (int)len, CURL_UNCONST(a));
|
|
|
|
|
#endif
|
|
|
|
|
int i = i2t_ASN1_OBJECT(buf, (int)len, a);
|
|
|
|
|
return (i >= (int)len); /* buffer too small */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -310,10 +246,10 @@ static CURLcode X509V3_ext(struct Curl_easy *data,
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
CURLcode result = CURLE_OK;
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
|
|
|
|
|
const STACK_OF(X509_EXTENSION) *exts = extsarg;
|
|
|
|
|
#else
|
|
|
|
|
#ifdef LIBRESSL_VERSION_NUMBER
|
|
|
|
|
STACK_OF(X509_EXTENSION) *exts = CURL_UNCONST(extsarg);
|
|
|
|
|
#else
|
|
|
|
|
const STACK_OF(X509_EXTENSION) *exts = extsarg;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if((int)sk_X509_EXTENSION_num(exts) <= 0)
|
|
|
|
|
@@ -409,7 +345,6 @@ static CURLcode ossl_certchain(struct Curl_easy *data, SSL *ssl)
|
|
|
|
|
if(result)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_X509_GET0_EXTENSIONS
|
|
|
|
|
{
|
|
|
|
|
const X509_ALGOR *sigalg = NULL;
|
|
|
|
|
X509_PUBKEY *xpubkey = NULL;
|
|
|
|
|
@@ -440,28 +375,6 @@ static CURLcode ossl_certchain(struct Curl_easy *data, SSL *ssl)
|
|
|
|
|
if(result)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
{
|
|
|
|
|
/* before OpenSSL 1.0.2 */
|
|
|
|
|
X509_CINF *cinf = x->cert_info;
|
|
|
|
|
|
|
|
|
|
i2a_ASN1_OBJECT(mem, cinf->signature->algorithm);
|
|
|
|
|
result = push_certinfo(data, mem, "Signature Algorithm", i);
|
|
|
|
|
|
|
|
|
|
if(!result) {
|
|
|
|
|
i2a_ASN1_OBJECT(mem, cinf->key->algor->algorithm);
|
|
|
|
|
result = push_certinfo(data, mem, "Public Key Algorithm", i);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!result)
|
|
|
|
|
result = X509V3_ext(data, i, cinf->extensions);
|
|
|
|
|
|
|
|
|
|
if(result)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
psig = x->signature;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ASN1_TIME_print(mem, X509_get0_notBefore(x));
|
|
|
|
|
result = push_certinfo(data, mem, "Start date", i);
|
|
|
|
|
@@ -477,25 +390,14 @@ static CURLcode ossl_certchain(struct Curl_easy *data, SSL *ssl)
|
|
|
|
|
if(!pubkey)
|
|
|
|
|
infof(data, " Unable to load public key");
|
|
|
|
|
else {
|
|
|
|
|
int pktype;
|
|
|
|
|
#ifdef HAVE_OPAQUE_EVP_PKEY
|
|
|
|
|
pktype = EVP_PKEY_id(pubkey);
|
|
|
|
|
#else
|
|
|
|
|
pktype = pubkey->type;
|
|
|
|
|
#endif
|
|
|
|
|
switch(pktype) {
|
|
|
|
|
switch(EVP_PKEY_id(pubkey)) {
|
|
|
|
|
case EVP_PKEY_RSA: {
|
|
|
|
|
#ifndef HAVE_EVP_PKEY_GET_PARAMS
|
|
|
|
|
RSA *rsa;
|
|
|
|
|
#ifdef HAVE_OPAQUE_EVP_PKEY
|
|
|
|
|
rsa = EVP_PKEY_get0_RSA(pubkey);
|
|
|
|
|
#else
|
|
|
|
|
rsa = pubkey->pkey.rsa;
|
|
|
|
|
#endif /* HAVE_OPAQUE_EVP_PKEY */
|
|
|
|
|
#endif /* !HAVE_EVP_PKEY_GET_PARAMS */
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
#ifdef HAVE_OPAQUE_RSA_DSA_DH
|
|
|
|
|
DECLARE_PKEY_PARAM_BIGNUM(n);
|
|
|
|
|
DECLARE_PKEY_PARAM_BIGNUM(e);
|
|
|
|
|
#ifdef HAVE_EVP_PKEY_GET_PARAMS
|
|
|
|
|
@@ -505,9 +407,6 @@ static CURLcode ossl_certchain(struct Curl_easy *data, SSL *ssl)
|
|
|
|
|
RSA_get0_key(rsa, &n, &e, NULL);
|
|
|
|
|
#endif /* HAVE_EVP_PKEY_GET_PARAMS */
|
|
|
|
|
BIO_printf(mem, "%d", n ? BN_num_bits(n) : 0);
|
|
|
|
|
#else
|
|
|
|
|
BIO_printf(mem, "%d", rsa->n ? BN_num_bits(rsa->n) : 0);
|
|
|
|
|
#endif /* HAVE_OPAQUE_RSA_DSA_DH */
|
|
|
|
|
result = push_certinfo(data, mem, "RSA Public Key", i);
|
|
|
|
|
if(result)
|
|
|
|
|
break;
|
|
|
|
|
@@ -523,15 +422,9 @@ static CURLcode ossl_certchain(struct Curl_easy *data, SSL *ssl)
|
|
|
|
|
{
|
|
|
|
|
#ifndef OPENSSL_NO_DSA
|
|
|
|
|
#ifndef HAVE_EVP_PKEY_GET_PARAMS
|
|
|
|
|
DSA *dsa;
|
|
|
|
|
#ifdef HAVE_OPAQUE_EVP_PKEY
|
|
|
|
|
dsa = EVP_PKEY_get0_DSA(pubkey);
|
|
|
|
|
#else
|
|
|
|
|
dsa = pubkey->pkey.dsa;
|
|
|
|
|
#endif /* HAVE_OPAQUE_EVP_PKEY */
|
|
|
|
|
DSA *dsa = EVP_PKEY_get0_DSA(pubkey);
|
|
|
|
|
#endif /* !HAVE_EVP_PKEY_GET_PARAMS */
|
|
|
|
|
{
|
|
|
|
|
#ifdef HAVE_OPAQUE_RSA_DSA_DH
|
|
|
|
|
DECLARE_PKEY_PARAM_BIGNUM(p);
|
|
|
|
|
DECLARE_PKEY_PARAM_BIGNUM(q);
|
|
|
|
|
DECLARE_PKEY_PARAM_BIGNUM(g);
|
|
|
|
|
@@ -545,7 +438,6 @@ static CURLcode ossl_certchain(struct Curl_easy *data, SSL *ssl)
|
|
|
|
|
DSA_get0_pqg(dsa, &p, &q, &g);
|
|
|
|
|
DSA_get0_key(dsa, &pub_key, NULL);
|
|
|
|
|
#endif /* HAVE_EVP_PKEY_GET_PARAMS */
|
|
|
|
|
#endif /* HAVE_OPAQUE_RSA_DSA_DH */
|
|
|
|
|
print_pubkey_BN(dsa, p, i);
|
|
|
|
|
print_pubkey_BN(dsa, q, i);
|
|
|
|
|
print_pubkey_BN(dsa, g, i);
|
|
|
|
|
@@ -560,15 +452,9 @@ static CURLcode ossl_certchain(struct Curl_easy *data, SSL *ssl)
|
|
|
|
|
}
|
|
|
|
|
case EVP_PKEY_DH: {
|
|
|
|
|
#ifndef HAVE_EVP_PKEY_GET_PARAMS
|
|
|
|
|
DH *dh;
|
|
|
|
|
#ifdef HAVE_OPAQUE_EVP_PKEY
|
|
|
|
|
dh = EVP_PKEY_get0_DH(pubkey);
|
|
|
|
|
#else
|
|
|
|
|
dh = pubkey->pkey.dh;
|
|
|
|
|
#endif /* HAVE_OPAQUE_EVP_PKEY */
|
|
|
|
|
DH *dh = EVP_PKEY_get0_DH(pubkey);
|
|
|
|
|
#endif /* !HAVE_EVP_PKEY_GET_PARAMS */
|
|
|
|
|
{
|
|
|
|
|
#ifdef HAVE_OPAQUE_RSA_DSA_DH
|
|
|
|
|
DECLARE_PKEY_PARAM_BIGNUM(p);
|
|
|
|
|
DECLARE_PKEY_PARAM_BIGNUM(q);
|
|
|
|
|
DECLARE_PKEY_PARAM_BIGNUM(g);
|
|
|
|
|
@@ -585,10 +471,6 @@ static CURLcode ossl_certchain(struct Curl_easy *data, SSL *ssl)
|
|
|
|
|
print_pubkey_BN(dh, p, i);
|
|
|
|
|
print_pubkey_BN(dh, q, i);
|
|
|
|
|
print_pubkey_BN(dh, g, i);
|
|
|
|
|
#else
|
|
|
|
|
print_pubkey_BN(dh, p, i);
|
|
|
|
|
print_pubkey_BN(dh, g, i);
|
|
|
|
|
#endif /* HAVE_OPAQUE_RSA_DSA_DH */
|
|
|
|
|
print_pubkey_BN(dh, pub_key, i);
|
|
|
|
|
FREE_PKEY_PARAM_BIGNUM(p);
|
|
|
|
|
FREE_PKEY_PARAM_BIGNUM(q);
|
|
|
|
|
@@ -626,21 +508,10 @@ static CURLcode ossl_certchain(struct Curl_easy *data, SSL *ssl)
|
|
|
|
|
|
|
|
|
|
#ifdef USE_OPENSSL
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
|
|
|
|
#define BIO_set_init(x,v) ((x)->init=(v))
|
|
|
|
|
#define BIO_get_data(x) ((x)->ptr)
|
|
|
|
|
#define BIO_set_data(x,v) ((x)->ptr=(v))
|
|
|
|
|
#define BIO_get_shutdown(x) ((x)->shutdown)
|
|
|
|
|
#define BIO_set_shutdown(x,v) ((x)->shutdown=(v))
|
|
|
|
|
#endif /* HAVE_PRE_1_1_API */
|
|
|
|
|
|
|
|
|
|
static int ossl_bio_cf_create(BIO *bio)
|
|
|
|
|
{
|
|
|
|
|
BIO_set_shutdown(bio, 1);
|
|
|
|
|
BIO_set_init(bio, 1);
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
|
|
|
|
bio->num = -1;
|
|
|
|
|
#endif
|
|
|
|
|
BIO_set_data(bio, NULL);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
@@ -759,30 +630,6 @@ static int ossl_bio_cf_in_read(BIO *bio, char *buf, int blen)
|
|
|
|
|
return result ? -1 : (int)nread;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
|
|
|
|
|
|
|
|
|
static BIO_METHOD ossl_bio_cf_meth_1_0 = {
|
|
|
|
|
BIO_TYPE_MEM,
|
|
|
|
|
"OpenSSL CF BIO",
|
|
|
|
|
ossl_bio_cf_out_write,
|
|
|
|
|
ossl_bio_cf_in_read,
|
|
|
|
|
NULL, /* puts is never called */
|
|
|
|
|
NULL, /* gets is never called */
|
|
|
|
|
ossl_bio_cf_ctrl,
|
|
|
|
|
ossl_bio_cf_create,
|
|
|
|
|
ossl_bio_cf_destroy,
|
|
|
|
|
NULL
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static BIO_METHOD *ossl_bio_cf_method_create(void)
|
|
|
|
|
{
|
|
|
|
|
return &ossl_bio_cf_meth_1_0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define ossl_bio_cf_method_free(m) Curl_nop_stmt
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
static BIO_METHOD *ossl_bio_cf_method_create(void)
|
|
|
|
|
{
|
|
|
|
|
BIO_METHOD *m = BIO_meth_new(BIO_TYPE_MEM, "OpenSSL CF BIO");
|
|
|
|
|
@@ -802,9 +649,6 @@ static void ossl_bio_cf_method_free(BIO_METHOD *m)
|
|
|
|
|
BIO_meth_free(m);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_KEYLOG_CALLBACK
|
|
|
|
|
static void ossl_keylog_callback(const SSL *ssl, const char *line)
|
|
|
|
|
{
|
|
|
|
|
@@ -834,19 +678,9 @@ ossl_log_tls12_secret(const SSL *ssl, bool *keylog_done)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
|
|
|
|
/* ssl->s3 is not checked in OpenSSL 1.1.0-pre6, but let's assume that
|
|
|
|
|
* we have a valid SSL context if we have a non-NULL session. */
|
|
|
|
|
SSL_get_client_random(ssl, client_random, SSL3_RANDOM_SIZE);
|
|
|
|
|
master_key_length = (int)
|
|
|
|
|
SSL_SESSION_get_master_key(session, master_key, SSL_MAX_MASTER_KEY_LENGTH);
|
|
|
|
|
#else
|
|
|
|
|
if(ssl->s3 && session->master_key_length > 0) {
|
|
|
|
|
master_key_length = session->master_key_length;
|
|
|
|
|
memcpy(master_key, session->master_key, session->master_key_length);
|
|
|
|
|
memcpy(client_random, ssl->s3->client_random, SSL3_RANDOM_SIZE);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ERR_pop_to_mark();
|
|
|
|
|
|
|
|
|
|
@@ -968,58 +802,8 @@ static CURLcode ossl_seed(struct Curl_easy *data)
|
|
|
|
|
data->multi->ssl_seeded = TRUE;
|
|
|
|
|
return CURLE_OK;
|
|
|
|
|
}
|
|
|
|
|
#ifdef HAVE_RANDOM_INIT_BY_DEFAULT
|
|
|
|
|
/* with OpenSSL 1.1.0+, a failed RAND_status is a showstopper */
|
|
|
|
|
failf(data, "Insufficient randomness");
|
|
|
|
|
return CURLE_SSL_CONNECT_ERROR;
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
/* fallback to a custom seeding of the PRNG using a hash based on a current
|
|
|
|
|
time */
|
|
|
|
|
do {
|
|
|
|
|
unsigned char randb[64];
|
|
|
|
|
size_t len = sizeof(randb);
|
|
|
|
|
size_t i, i_max;
|
|
|
|
|
for(i = 0, i_max = len / sizeof(struct curltime); i < i_max; ++i) {
|
|
|
|
|
struct curltime tv = curlx_now();
|
|
|
|
|
curlx_wait_ms(1);
|
|
|
|
|
tv.tv_sec *= (time_t)i + 1;
|
|
|
|
|
tv.tv_usec *= (int)i + 2;
|
|
|
|
|
tv.tv_sec ^= ((curlx_now().tv_sec + (time_t)curlx_now().tv_usec) *
|
|
|
|
|
(time_t)(i + 3)) << 8;
|
|
|
|
|
tv.tv_usec ^= (int) ((curlx_now().tv_sec + (time_t)curlx_now().tv_usec) *
|
|
|
|
|
(time_t)(i + 4)) << 16;
|
|
|
|
|
memcpy(&randb[i * sizeof(struct curltime)], &tv,
|
|
|
|
|
sizeof(struct curltime));
|
|
|
|
|
}
|
|
|
|
|
RAND_add(randb, (int)len, (double)len/2);
|
|
|
|
|
} while(!rand_enough());
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Number of bytes to read from the random number seed file. This must be
|
|
|
|
|
* a finite value (because some entropy "files" like /dev/urandom have
|
|
|
|
|
* an infinite length), but must be large enough to provide enough
|
|
|
|
|
* entropy to properly seed OpenSSL's PRNG.
|
|
|
|
|
*/
|
|
|
|
|
# define RAND_LOAD_LENGTH 1024
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
/* generates a default path for the random seed file */
|
|
|
|
|
char fname[256];
|
|
|
|
|
fname[0] = 0; /* blank it first */
|
|
|
|
|
RAND_file_name(fname, sizeof(fname));
|
|
|
|
|
if(fname[0]) {
|
|
|
|
|
/* we got a filename to try */
|
|
|
|
|
RAND_load_file(fname, RAND_LOAD_LENGTH);
|
|
|
|
|
if(rand_enough())
|
|
|
|
|
return CURLE_OK;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
infof(data, "libcurl is now using a weak random seed");
|
|
|
|
|
return rand_enough() ? CURLE_OK :
|
|
|
|
|
CURLE_SSL_CONNECT_ERROR; /* confusing error code */
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef SSL_FILETYPE_ENGINE
|
|
|
|
|
@@ -1247,7 +1031,7 @@ static int enginecheck(struct Curl_easy *data,
|
|
|
|
|
|
|
|
|
|
if(data->state.engine) {
|
|
|
|
|
UI_METHOD *ui_method =
|
|
|
|
|
UI_create_method(OSSL_UI_METHOD_CAST("curl user interface"));
|
|
|
|
|
UI_create_method("curl user interface");
|
|
|
|
|
if(!ui_method) {
|
|
|
|
|
failf(data, "unable to create " OSSL_PACKAGE " user-interface method");
|
|
|
|
|
return 0;
|
|
|
|
|
@@ -1309,7 +1093,7 @@ static int providercheck(struct Curl_easy *data,
|
|
|
|
|
OSSL_STORE_CTX *store = NULL;
|
|
|
|
|
OSSL_STORE_INFO *info = NULL;
|
|
|
|
|
UI_METHOD *ui_method =
|
|
|
|
|
UI_create_method(OSSL_UI_METHOD_CAST("curl user interface"));
|
|
|
|
|
UI_create_method("curl user interface");
|
|
|
|
|
if(!ui_method) {
|
|
|
|
|
failf(data, "unable to create " OSSL_PACKAGE " user-interface method");
|
|
|
|
|
return 0;
|
|
|
|
|
@@ -1797,13 +1581,7 @@ static CURLcode client_cert(struct Curl_easy *data,
|
|
|
|
|
/* If RSA is used, do not check the private key if its flags indicate
|
|
|
|
|
* it does not support it. */
|
|
|
|
|
EVP_PKEY *priv_key = SSL_get_privatekey(ssl);
|
|
|
|
|
int pktype;
|
|
|
|
|
#ifdef HAVE_OPAQUE_EVP_PKEY
|
|
|
|
|
pktype = EVP_PKEY_id(priv_key);
|
|
|
|
|
#else
|
|
|
|
|
pktype = priv_key->type;
|
|
|
|
|
#endif
|
|
|
|
|
if(pktype == EVP_PKEY_RSA) {
|
|
|
|
|
if(EVP_PKEY_id(priv_key) == EVP_PKEY_RSA) {
|
|
|
|
|
RSA *rsa = EVP_PKEY_get1_RSA(priv_key);
|
|
|
|
|
if(RSA_flags(rsa) & RSA_METHOD_FLAG_NO_CHECK)
|
|
|
|
|
check_privkey = FALSE;
|
|
|
|
|
@@ -1861,7 +1639,6 @@ static CURLcode x509_name_oneline(X509_NAME *a, struct dynbuf *d)
|
|
|
|
|
*/
|
|
|
|
|
static int ossl_init(void)
|
|
|
|
|
{
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
|
|
|
|
const uint64_t flags =
|
|
|
|
|
#ifdef OPENSSL_INIT_ENGINE_ALL_BUILTIN
|
|
|
|
|
/* not present in BoringSSL */
|
|
|
|
|
@@ -1874,28 +1651,6 @@ static int ossl_init(void)
|
|
|
|
|
#endif
|
|
|
|
|
0;
|
|
|
|
|
OPENSSL_init_ssl(flags, NULL);
|
|
|
|
|
#else
|
|
|
|
|
OPENSSL_load_builtin_modules();
|
|
|
|
|
|
|
|
|
|
#ifdef USE_OPENSSL_ENGINE
|
|
|
|
|
ENGINE_load_builtin_engines();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG
|
|
|
|
|
CONF_modules_load_file(NULL, NULL,
|
|
|
|
|
CONF_MFLAGS_DEFAULT_SECTION|
|
|
|
|
|
CONF_MFLAGS_IGNORE_MISSING_FILE);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Let's get nice error messages */
|
|
|
|
|
SSL_load_error_strings();
|
|
|
|
|
|
|
|
|
|
/* Init the global ciphers and digests */
|
|
|
|
|
if(!SSLeay_add_ssl_algorithms())
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
OpenSSL_add_all_algorithms();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
Curl_tls_keylog_open();
|
|
|
|
|
|
|
|
|
|
@@ -1905,32 +1660,6 @@ static int ossl_init(void)
|
|
|
|
|
/* Global cleanup */
|
|
|
|
|
static void ossl_cleanup(void)
|
|
|
|
|
{
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
|
|
|
|
/* OpenSSL 1.1 deprecates all these cleanup functions and
|
|
|
|
|
turns them into no-ops in OpenSSL 1.0 compatibility mode */
|
|
|
|
|
#else
|
|
|
|
|
/* Free ciphers and digests lists */
|
|
|
|
|
EVP_cleanup();
|
|
|
|
|
|
|
|
|
|
#ifdef USE_OPENSSL_ENGINE
|
|
|
|
|
/* Free engine list */
|
|
|
|
|
ENGINE_cleanup();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Free OpenSSL error strings */
|
|
|
|
|
ERR_free_strings();
|
|
|
|
|
|
|
|
|
|
/* Free thread local error state, destroying hash upon zero refcount */
|
|
|
|
|
ERR_remove_thread_state(NULL);
|
|
|
|
|
|
|
|
|
|
/* Free all memory allocated by all configuration modules */
|
|
|
|
|
CONF_modules_free();
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_SSL_COMP_FREE_COMPRESSION_METHODS
|
|
|
|
|
SSL_COMP_free_compression_methods();
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
Curl_tls_keylog_close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2284,13 +2013,6 @@ static void ossl_close_all(struct Curl_easy *data)
|
|
|
|
|
#ifdef OPENSSL_HAS_PROVIDERS
|
|
|
|
|
ossl_provider_cleanup(data);
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef HAVE_ERR_REMOVE_THREAD_STATE_DEPRECATED
|
|
|
|
|
/* OpenSSL 1.0.1 and 1.0.2 build an error queue that is stored per-thread
|
|
|
|
|
so we need to clean it here in case the thread will be killed. All OpenSSL
|
|
|
|
|
code should extract the error in association with the error so clearing
|
|
|
|
|
this queue here should be harmless at worst. */
|
|
|
|
|
ERR_remove_thread_state(NULL);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ====================================================== */
|
|
|
|
|
@@ -2777,7 +2499,7 @@ static void ossl_trace(int direction, int ssl_ver, int content_type,
|
|
|
|
|
const void *buf, size_t len, SSL *ssl,
|
|
|
|
|
void *userp)
|
|
|
|
|
{
|
|
|
|
|
const char *verstr = "???";
|
|
|
|
|
const char *verstr;
|
|
|
|
|
struct Curl_cfilter *cf = userp;
|
|
|
|
|
struct Curl_easy *data = NULL;
|
|
|
|
|
char unknown[32];
|
|
|
|
|
@@ -2812,13 +2534,9 @@ static void ossl_trace(int direction, int ssl_ver, int content_type,
|
|
|
|
|
verstr = "TLSv1.2";
|
|
|
|
|
break;
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef TLS1_3_VERSION /* OpenSSL 1.1.1+, all forks */
|
|
|
|
|
case TLS1_3_VERSION:
|
|
|
|
|
verstr = "TLSv1.3";
|
|
|
|
|
break;
|
|
|
|
|
#endif
|
|
|
|
|
case 0:
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
curl_msnprintf(unknown, sizeof(unknown), "(%x)", ssl_ver);
|
|
|
|
|
verstr = unknown;
|
|
|
|
|
@@ -2884,7 +2602,6 @@ static void ossl_trace(int direction, int ssl_ver, int content_type,
|
|
|
|
|
# define HAS_ALPN_OPENSSL
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0 */
|
|
|
|
|
static CURLcode
|
|
|
|
|
ossl_set_ssl_version_min_max(struct Curl_cfilter *cf, SSL_CTX *ctx,
|
|
|
|
|
unsigned int ssl_version_min)
|
|
|
|
|
@@ -2916,12 +2633,8 @@ ossl_set_ssl_version_min_max(struct Curl_cfilter *cf, SSL_CTX *ctx,
|
|
|
|
|
ossl_ssl_version_min = TLS1_2_VERSION;
|
|
|
|
|
break;
|
|
|
|
|
case CURL_SSLVERSION_TLSv1_3:
|
|
|
|
|
#ifdef TLS1_3_VERSION
|
|
|
|
|
ossl_ssl_version_min = TLS1_3_VERSION;
|
|
|
|
|
break;
|
|
|
|
|
#else
|
|
|
|
|
return CURLE_NOT_BUILT_IN;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ... then, TLS max version */
|
|
|
|
|
@@ -2938,11 +2651,9 @@ ossl_set_ssl_version_min_max(struct Curl_cfilter *cf, SSL_CTX *ctx,
|
|
|
|
|
case CURL_SSLVERSION_MAX_TLSv1_2:
|
|
|
|
|
ossl_ssl_version_max = TLS1_2_VERSION;
|
|
|
|
|
break;
|
|
|
|
|
#ifdef TLS1_3_VERSION
|
|
|
|
|
case CURL_SSLVERSION_MAX_TLSv1_3:
|
|
|
|
|
ossl_ssl_version_max = TLS1_3_VERSION;
|
|
|
|
|
break;
|
|
|
|
|
#endif
|
|
|
|
|
case CURL_SSLVERSION_MAX_NONE: /* none selected */
|
|
|
|
|
case CURL_SSLVERSION_MAX_DEFAULT: /* max selected */
|
|
|
|
|
default:
|
|
|
|
|
@@ -2959,80 +2670,15 @@ ossl_set_ssl_version_min_max(struct Curl_cfilter *cf, SSL_CTX *ctx,
|
|
|
|
|
|
|
|
|
|
return CURLE_OK;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_BORINGSSL_LIKE
|
|
|
|
|
typedef uint32_t ctx_option_t;
|
|
|
|
|
#elif defined(HAVE_OPENSSL3)
|
|
|
|
|
typedef uint64_t ctx_option_t;
|
|
|
|
|
#elif OPENSSL_VERSION_NUMBER >= 0x10100000L && \
|
|
|
|
|
!defined(LIBRESSL_VERSION_NUMBER)
|
|
|
|
|
typedef unsigned long ctx_option_t;
|
|
|
|
|
#else
|
|
|
|
|
#elif defined(LIBRESSL_VERSION_NUMBER)
|
|
|
|
|
typedef long ctx_option_t;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L /* 1.1.0 */
|
|
|
|
|
static CURLcode
|
|
|
|
|
ossl_set_ssl_version_min_max_legacy(ctx_option_t *ctx_options,
|
|
|
|
|
struct Curl_cfilter *cf,
|
|
|
|
|
struct Curl_easy *data)
|
|
|
|
|
{
|
|
|
|
|
struct ssl_primary_config *conn_config = Curl_ssl_cf_get_primary_config(cf);
|
|
|
|
|
long ssl_version = conn_config->version;
|
|
|
|
|
long ssl_version_max = conn_config->version_max;
|
|
|
|
|
|
|
|
|
|
(void)data; /* In case it is unused. */
|
|
|
|
|
|
|
|
|
|
switch(ssl_version) {
|
|
|
|
|
case CURL_SSLVERSION_TLSv1_3:
|
|
|
|
|
#ifdef TLS1_3_VERSION
|
|
|
|
|
{
|
|
|
|
|
struct ssl_connect_data *connssl = cf->ctx;
|
|
|
|
|
struct ossl_ctx *octx = (struct ossl_ctx *)connssl->backend;
|
|
|
|
|
DEBUGASSERT(octx);
|
|
|
|
|
SSL_CTX_set_max_proto_version(octx->ssl_ctx, TLS1_3_VERSION);
|
|
|
|
|
*ctx_options |= SSL_OP_NO_TLSv1_2;
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
(void)ctx_options;
|
|
|
|
|
failf(data, OSSL_PACKAGE " was built without TLS 1.3 support");
|
|
|
|
|
return CURLE_NOT_BUILT_IN;
|
|
|
|
|
#endif
|
|
|
|
|
FALLTHROUGH();
|
|
|
|
|
case CURL_SSLVERSION_TLSv1_2:
|
|
|
|
|
*ctx_options |= SSL_OP_NO_TLSv1_1;
|
|
|
|
|
FALLTHROUGH();
|
|
|
|
|
case CURL_SSLVERSION_TLSv1_1:
|
|
|
|
|
*ctx_options |= SSL_OP_NO_TLSv1;
|
|
|
|
|
FALLTHROUGH();
|
|
|
|
|
case CURL_SSLVERSION_TLSv1_0:
|
|
|
|
|
case CURL_SSLVERSION_TLSv1:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch(ssl_version_max) {
|
|
|
|
|
case CURL_SSLVERSION_MAX_TLSv1_0:
|
|
|
|
|
*ctx_options |= SSL_OP_NO_TLSv1_1;
|
|
|
|
|
FALLTHROUGH();
|
|
|
|
|
case CURL_SSLVERSION_MAX_TLSv1_1:
|
|
|
|
|
*ctx_options |= SSL_OP_NO_TLSv1_2;
|
|
|
|
|
FALLTHROUGH();
|
|
|
|
|
case CURL_SSLVERSION_MAX_TLSv1_2:
|
|
|
|
|
#ifdef TLS1_3_VERSION
|
|
|
|
|
*ctx_options |= SSL_OP_NO_TLSv1_3;
|
|
|
|
|
#endif
|
|
|
|
|
break;
|
|
|
|
|
case CURL_SSLVERSION_MAX_TLSv1_3:
|
|
|
|
|
#ifdef TLS1_3_VERSION
|
|
|
|
|
break;
|
|
|
|
|
#else
|
|
|
|
|
failf(data, OSSL_PACKAGE " was built without TLS 1.3 support");
|
|
|
|
|
return CURLE_NOT_BUILT_IN;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
return CURLE_OK;
|
|
|
|
|
}
|
|
|
|
|
typedef unsigned long ctx_option_t;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
CURLcode Curl_ossl_add_session(struct Curl_cfilter *cf,
|
|
|
|
|
@@ -3538,8 +3184,6 @@ static CURLcode ossl_populate_x509_store(struct Curl_cfilter *cf,
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_SSL_X509_STORE_SHARE
|
|
|
|
|
|
|
|
|
|
/* key to use at `multi->proto_hash` */
|
|
|
|
|
#define MPROTO_OSSL_X509_KEY "tls:ossl:x509:share"
|
|
|
|
|
|
|
|
|
|
@@ -3706,25 +3350,6 @@ CURLcode Curl_ssl_setup_x509_store(struct Curl_cfilter *cf,
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
#else /* HAVE_SSL_X509_STORE_SHARE */
|
|
|
|
|
CURLcode Curl_ssl_setup_x509_store(struct Curl_cfilter *cf,
|
|
|
|
|
struct Curl_easy *data,
|
|
|
|
|
struct ossl_ctx *octx)
|
|
|
|
|
{
|
|
|
|
|
CURLcode result;
|
|
|
|
|
X509_STORE *store;
|
|
|
|
|
|
|
|
|
|
ERR_set_mark();
|
|
|
|
|
|
|
|
|
|
store = SSL_CTX_get_cert_store(octx->ssl_ctx);
|
|
|
|
|
result = ossl_populate_x509_store(cf, data, octx, store);
|
|
|
|
|
|
|
|
|
|
ERR_pop_to_mark();
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
#endif /* HAVE_SSL_X509_STORE_SHARE */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static CURLcode
|
|
|
|
|
ossl_init_session_and_alpns(struct ossl_ctx *octx,
|
|
|
|
|
@@ -4020,11 +3645,7 @@ static CURLcode ossl_init_method(struct Curl_cfilter *cf,
|
|
|
|
|
case CURL_SSLVERSION_TLSv1_2:
|
|
|
|
|
case CURL_SSLVERSION_TLSv1_3:
|
|
|
|
|
/* it will be handled later with the context options */
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
|
|
|
|
*pmethod = TLS_client_method();
|
|
|
|
|
#else
|
|
|
|
|
*pmethod = SSLv23_client_method();
|
|
|
|
|
#endif
|
|
|
|
|
break;
|
|
|
|
|
case CURL_SSLVERSION_SSLv2:
|
|
|
|
|
failf(data, "No SSLv2 support");
|
|
|
|
|
@@ -4048,10 +3669,8 @@ static CURLcode ossl_init_method(struct Curl_cfilter *cf,
|
|
|
|
|
|
|
|
|
|
#ifdef USE_OPENSSL_QUIC
|
|
|
|
|
*pmethod = OSSL_QUIC_client_method();
|
|
|
|
|
#elif (OPENSSL_VERSION_NUMBER >= 0x10100000L)
|
|
|
|
|
*pmethod = TLS_method();
|
|
|
|
|
#else
|
|
|
|
|
*pmethod = SSLv23_client_method();
|
|
|
|
|
*pmethod = TLS_method();
|
|
|
|
|
#endif
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
@@ -4187,11 +3806,7 @@ CURLcode Curl_ossl_ctx_init(struct ossl_ctx *octx,
|
|
|
|
|
ctx_options |= SSL_OP_NO_SSLv2;
|
|
|
|
|
ctx_options |= SSL_OP_NO_SSLv3;
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0 */
|
|
|
|
|
result = ossl_set_ssl_version_min_max(cf, octx->ssl_ctx, ssl_version_min);
|
|
|
|
|
#else
|
|
|
|
|
result = ossl_set_ssl_version_min_max_legacy(&ctx_options, cf, data);
|
|
|
|
|
#endif
|
|
|
|
|
if(result)
|
|
|
|
|
return result;
|
|
|
|
|
break;
|
|
|
|
|
@@ -4222,7 +3837,7 @@ CURLcode Curl_ossl_ctx_init(struct ossl_ctx *octx,
|
|
|
|
|
|
|
|
|
|
ciphers = conn_config->cipher_list;
|
|
|
|
|
if(!ciphers && (peer->transport != TRNSPRT_QUIC))
|
|
|
|
|
ciphers = DEFAULT_CIPHER_SELECTION;
|
|
|
|
|
ciphers = NULL;
|
|
|
|
|
if(ciphers && (ssl_version_min < CURL_SSLVERSION_TLSv1_3)) {
|
|
|
|
|
if(!SSL_CTX_set_cipher_list(octx->ssl_ctx, ciphers)) {
|
|
|
|
|
failf(data, "failed setting cipher list: %s", ciphers);
|
|
|
|
|
@@ -4829,9 +4444,8 @@ static CURLcode ossl_pkp_pin_peer_pubkey(struct Curl_easy *data, X509* cert,
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L && \
|
|
|
|
|
!(defined(LIBRESSL_VERSION_NUMBER) && \
|
|
|
|
|
LIBRESSL_VERSION_NUMBER < 0x3060000fL) && \
|
|
|
|
|
#if !(defined(LIBRESSL_VERSION_NUMBER) && \
|
|
|
|
|
LIBRESSL_VERSION_NUMBER < 0x3060000fL) && \
|
|
|
|
|
!defined(HAVE_BORINGSSL_LIKE) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
|
|
|
|
|
static void infof_certstack(struct Curl_easy *data, const SSL *ssl)
|
|
|
|
|
{
|
|
|
|
|
@@ -5650,8 +5264,6 @@ out:
|
|
|
|
|
static CURLcode ossl_get_channel_binding(struct Curl_easy *data, int sockindex,
|
|
|
|
|
struct dynbuf *binding)
|
|
|
|
|
{
|
|
|
|
|
/* required for X509_get_signature_nid support */
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER > 0x10100000L
|
|
|
|
|
X509 *cert;
|
|
|
|
|
int algo_nid;
|
|
|
|
|
const EVP_MD *algo_type;
|
|
|
|
|
@@ -5726,13 +5338,6 @@ static CURLcode ossl_get_channel_binding(struct Curl_easy *data, int sockindex,
|
|
|
|
|
error:
|
|
|
|
|
X509_free(cert);
|
|
|
|
|
return result;
|
|
|
|
|
#else
|
|
|
|
|
/* No X509_get_signature_nid support */
|
|
|
|
|
(void)data;
|
|
|
|
|
(void)sockindex;
|
|
|
|
|
(void)binding;
|
|
|
|
|
return CURLE_OK;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t Curl_ossl_version(char *buffer, size_t size)
|
|
|
|
|
@@ -5761,41 +5366,9 @@ size_t Curl_ossl_version(char *buffer, size_t size)
|
|
|
|
|
#elif defined(OPENSSL_IS_AWSLC)
|
|
|
|
|
return curl_msnprintf(buffer, size, "%s/%s",
|
|
|
|
|
OSSL_PACKAGE, AWSLC_VERSION_NUMBER_STRING);
|
|
|
|
|
#elif defined(OPENSSL_VERSION_STRING) /* OpenSSL 3+ */
|
|
|
|
|
#else /* OpenSSL 3+ */
|
|
|
|
|
return curl_msnprintf(buffer, size, "%s/%s",
|
|
|
|
|
OSSL_PACKAGE, OpenSSL_version(OPENSSL_VERSION_STRING));
|
|
|
|
|
#else
|
|
|
|
|
/* not LibreSSL, BoringSSL and not using OpenSSL_version */
|
|
|
|
|
|
|
|
|
|
char sub[3];
|
|
|
|
|
unsigned long ssleay_value;
|
|
|
|
|
sub[2]='\0';
|
|
|
|
|
sub[1]='\0';
|
|
|
|
|
ssleay_value = OpenSSL_version_num();
|
|
|
|
|
if(ssleay_value&0xff0) {
|
|
|
|
|
int minor_ver = (ssleay_value >> 4) & 0xff;
|
|
|
|
|
if(minor_ver > 26) {
|
|
|
|
|
/* handle extended version introduced for 0.9.8za */
|
|
|
|
|
sub[1] = (char) ((minor_ver - 1) % 26 + 'a' + 1);
|
|
|
|
|
sub[0] = 'z';
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
sub[0] = (char) (minor_ver + 'a' - 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
sub[0]='\0';
|
|
|
|
|
|
|
|
|
|
return curl_msnprintf(buffer, size, "%s/%lx.%lx.%lx%s"
|
|
|
|
|
#ifdef OPENSSL_FIPS
|
|
|
|
|
"-fips"
|
|
|
|
|
#endif
|
|
|
|
|
,
|
|
|
|
|
OSSL_PACKAGE,
|
|
|
|
|
(ssleay_value >> 28) & 0xf,
|
|
|
|
|
(ssleay_value >> 20) & 0xff,
|
|
|
|
|
(ssleay_value >> 12) & 0xff,
|
|
|
|
|
sub);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|