mirror of
https://github.com/apache/httpd.git
synced 2025-08-15 23:27:39 +00:00
mod_ssl, ab: compatibility with LibreSSL. PR 61184.
LibreSSL defines OPENSSL_VERSION_NUMBER = 2.0, but is not compatible with all of the latest OpenSSL 1.1 API. Address this by defining MODSSL_USE_OPENSSL_PRE_1_1_API which is true for anything but OpenSSL >= 1.1 (for now). Proposed by: Bernard Spil <brnrd freebsd.org> Reviewed by: ylavic git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1803396 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@ -354,7 +354,7 @@ static apr_status_t ssl_cleanup_pre_config(void *data)
|
||||
#endif
|
||||
|
||||
/* Usually needed per thread, but this parent process is single-threaded */
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
#if OPENSSL_VERSION_NUMBER >= 0x1000000fL
|
||||
ERR_remove_thread_state(NULL);
|
||||
#else
|
||||
@ -398,15 +398,15 @@ static int ssl_hook_pre_config(apr_pool_t *pconf,
|
||||
/* Some OpenSSL internals are allocated per-thread, make sure they
|
||||
* are associated to the/our same thread-id until cleaned up.
|
||||
*/
|
||||
#if APR_HAS_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if APR_HAS_THREADS && MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
ssl_util_thread_id_setup(pconf);
|
||||
#endif
|
||||
|
||||
/* We must register the library in full, to ensure our configuration
|
||||
* code can successfully test the SSL environment.
|
||||
*/
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
CRYPTO_malloc_init();
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
(void)CRYPTO_malloc_init();
|
||||
#else
|
||||
OPENSSL_malloc_init();
|
||||
#endif
|
||||
|
@ -32,7 +32,7 @@ static apr_status_t verify_signature(sct_fields_t *sctf,
|
||||
return APR_EINVAL;
|
||||
}
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
|
||||
ctx = EVP_MD_CTX_create();
|
||||
#else
|
||||
ctx = EVP_MD_CTX_new();
|
||||
@ -41,7 +41,7 @@ static apr_status_t verify_signature(sct_fields_t *sctf,
|
||||
ap_assert(1 == EVP_VerifyUpdate(ctx, sctf->signed_data,
|
||||
sctf->signed_data_len));
|
||||
rc = EVP_VerifyFinal(ctx, sctf->sig, sctf->siglen, pkey);
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
|
||||
EVP_MD_CTX_destroy(ctx);
|
||||
#else
|
||||
EVP_MD_CTX_free(ctx);
|
||||
|
@ -50,7 +50,7 @@ APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ssl, SSL, int, init_server,
|
||||
#define KEYTYPES "RSA or DSA"
|
||||
#endif
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
/* OpenSSL Pre-1.1.0 compatibility */
|
||||
/* Taken from OpenSSL 1.1.0 snapshot 20160410 */
|
||||
static int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g)
|
||||
@ -253,7 +253,7 @@ apr_status_t ssl_init_Module(apr_pool_t *p, apr_pool_t *plog,
|
||||
#endif
|
||||
}
|
||||
|
||||
#if APR_HAS_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if APR_HAS_THREADS && MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
ssl_util_thread_setup(p);
|
||||
#endif
|
||||
|
||||
@ -380,7 +380,7 @@ apr_status_t ssl_init_Module(apr_pool_t *p, apr_pool_t *plog,
|
||||
modssl_init_app_data2_idx(); /* for modssl_get_app_data2() at request time */
|
||||
|
||||
init_dh_params();
|
||||
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
||||
#if !MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
init_bio_methods();
|
||||
#endif
|
||||
|
||||
@ -1324,7 +1324,7 @@ static apr_status_t ssl_init_server_certs(server_rec *s,
|
||||
* or configure NIST P-256 (required to enable ECDHE for earlier versions)
|
||||
* ECDH is always enabled in 1.1.0 unless excluded from SSLCipherList
|
||||
*/
|
||||
#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
else {
|
||||
#if defined(SSL_CTX_set_ecdh_auto)
|
||||
SSL_CTX_set_ecdh_auto(mctx->ssl_ctx, 1);
|
||||
@ -2079,7 +2079,7 @@ apr_status_t ssl_init_ModuleKill(void *data)
|
||||
|
||||
}
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
||||
#if !MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
free_bio_methods();
|
||||
#endif
|
||||
free_dh_params();
|
||||
|
@ -165,7 +165,7 @@ static int bio_filter_create(BIO *bio)
|
||||
{
|
||||
BIO_set_shutdown(bio, 1);
|
||||
BIO_set_init(bio, 1);
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
/* No setter method for OpenSSL 1.1.0 available,
|
||||
* but I can't find any functional use of the
|
||||
* "num" field there either.
|
||||
@ -578,7 +578,7 @@ static long bio_filter_in_ctrl(BIO *bio, int cmd, long num, void *ptr)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
|
||||
static BIO_METHOD bio_filter_out_method = {
|
||||
BIO_TYPE_MEM,
|
||||
@ -2080,7 +2080,7 @@ static void ssl_io_input_add_filter(ssl_filter_ctx_t *filter_ctx, conn_rec *c,
|
||||
|
||||
filter_ctx->pInputFilter = ap_add_input_filter(ssl_io_filter, inctx, r, c);
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
filter_ctx->pbioRead = BIO_new(&bio_filter_in_method);
|
||||
#else
|
||||
filter_ctx->pbioRead = BIO_new(bio_filter_in_method);
|
||||
@ -2115,7 +2115,7 @@ void ssl_io_filter_init(conn_rec *c, request_rec *r, SSL *ssl)
|
||||
filter_ctx->pOutputFilter = ap_add_output_filter(ssl_io_filter,
|
||||
filter_ctx, r, c);
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
filter_ctx->pbioWrite = BIO_new(&bio_filter_out_method);
|
||||
#else
|
||||
filter_ctx->pbioWrite = BIO_new(bio_filter_out_method);
|
||||
|
@ -1745,7 +1745,7 @@ static void modssl_proxy_info_log(conn_rec *c,
|
||||
* so we need to increment here to prevent them from
|
||||
* being freed.
|
||||
*/
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
#define modssl_set_cert_info(info, cert, pkey) \
|
||||
*cert = info->x509; \
|
||||
CRYPTO_add(&(*cert)->references, +1, CRYPTO_LOCK_X509); \
|
||||
|
@ -114,7 +114,7 @@ static apr_status_t ssl_get_tls_cb(apr_pool_t *p, conn_rec *c, const char *type,
|
||||
else if (x != NULL) {
|
||||
const EVP_MD *md;
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
md = EVP_get_digestbynid(OBJ_obj2nid(x->sig_alg->algorithm));
|
||||
#else
|
||||
md = EVP_get_digestbynid(X509_get_signature_nid(x));
|
||||
@ -603,7 +603,7 @@ static char *ssl_var_lookup_ssl_cert(apr_pool_t *p, request_rec *r, X509 *xs,
|
||||
resdup = FALSE;
|
||||
}
|
||||
else if (strcEQ(var, "A_SIG")) {
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
nid = OBJ_obj2nid((ASN1_OBJECT *)(xs->cert_info->signature->algorithm));
|
||||
#else
|
||||
const ASN1_OBJECT *paobj;
|
||||
|
@ -123,6 +123,25 @@
|
||||
#define MODSSL_SSL_METHOD_CONST
|
||||
#endif
|
||||
|
||||
#if defined(LIBRESSL_VERSION_NUMBER)
|
||||
/* Missing from LibreSSL */
|
||||
#if LIBRESSL_VERSION_NUMBER < 0x2060000f
|
||||
#define SSL_CTRL_SET_MIN_PROTO_VERSION 123
|
||||
#define SSL_CTRL_SET_MAX_PROTO_VERSION 124
|
||||
#define SSL_CTX_set_min_proto_version(ctx, version) \
|
||||
SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL)
|
||||
#define SSL_CTX_set_max_proto_version(ctx, version) \
|
||||
SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL)
|
||||
#endif
|
||||
/* LibreSSL declares OPENSSL_VERSION_NUMBER == 2.0 but does not include most
|
||||
* changes from OpenSSL >= 1.1 (new functions, macros, deprecations, ...), so
|
||||
* we have to work around this...
|
||||
*/
|
||||
#define MODSSL_USE_OPENSSL_PRE_1_1_API (1)
|
||||
#else
|
||||
#define MODSSL_USE_OPENSSL_PRE_1_1_API (OPENSSL_VERSION_NUMBER < 0x10100000L)
|
||||
#endif
|
||||
|
||||
#if defined(OPENSSL_FIPS)
|
||||
#define HAVE_FIPS
|
||||
#endif
|
||||
@ -136,7 +155,7 @@
|
||||
#endif
|
||||
|
||||
/* session id constness */
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
#define IDCONST
|
||||
#else
|
||||
#define IDCONST const
|
||||
@ -199,7 +218,7 @@
|
||||
|
||||
#endif /* !defined(OPENSSL_NO_TLSEXT) && defined(SSL_set_tlsext_host_name) */
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
#define BN_get_rfc2409_prime_768 get_rfc2409_prime_768
|
||||
#define BN_get_rfc2409_prime_1024 get_rfc2409_prime_1024
|
||||
#define BN_get_rfc3526_prime_1536 get_rfc3526_prime_1536
|
||||
@ -219,7 +238,7 @@ void init_bio_methods(void);
|
||||
void free_bio_methods(void);
|
||||
#endif
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10002000L
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10002000L || defined(LIBRESSL_VERSION_NUMBER)
|
||||
#define X509_STORE_CTX_get0_store(x) (x->ctx)
|
||||
#endif
|
||||
|
||||
@ -931,10 +950,8 @@ void ssl_util_ppclose(server_rec *, apr_pool_t *, apr_file_t *);
|
||||
char *ssl_util_readfilter(server_rec *, apr_pool_t *, const char *,
|
||||
const char * const *);
|
||||
BOOL ssl_util_path_check(ssl_pathcheck_t, const char *, apr_pool_t *);
|
||||
#if APR_HAS_THREADS
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if APR_HAS_THREADS && MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
void ssl_util_thread_setup(apr_pool_t *);
|
||||
#endif
|
||||
void ssl_util_thread_id_setup(apr_pool_t *);
|
||||
#endif
|
||||
int ssl_init_ssl_connection(conn_rec *c, request_rec *r);
|
||||
|
@ -246,8 +246,8 @@ void ssl_asn1_table_unset(apr_hash_t *table,
|
||||
apr_hash_set(table, key, klen, NULL);
|
||||
}
|
||||
|
||||
#if APR_HAS_THREADS
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if APR_HAS_THREADS && MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
|
||||
/*
|
||||
* To ensure thread-safetyness in OpenSSL - work in progress
|
||||
*/
|
||||
@ -510,5 +510,4 @@ void ssl_util_thread_setup(apr_pool_t *p)
|
||||
apr_pool_cleanup_null);
|
||||
}
|
||||
|
||||
#endif /* #if OPENSSL_VERSION_NUMBER < 0x10100000L */
|
||||
#endif /* #if APR_HAS_THREADS */
|
||||
#endif /* #if APR_HAS_THREADS && MODSSL_USE_OPENSSL_PRE_1_1_API */
|
||||
|
@ -41,7 +41,7 @@
|
||||
#define MODSSL_LIBRARY_VERSION OPENSSL_VERSION_NUMBER
|
||||
#define MODSSL_LIBRARY_NAME "OpenSSL"
|
||||
#define MODSSL_LIBRARY_TEXT OPENSSL_VERSION_TEXT
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||
#define MODSSL_LIBRARY_DYNTEXT SSLeay_version(SSLEAY_VERSION)
|
||||
#else
|
||||
#define MODSSL_LIBRARY_DYNTEXT OpenSSL_version(OPENSSL_VERSION)
|
||||
|
Reference in New Issue
Block a user