diff options
-rw-r--r-- | modules/ssl/mod_ssl.c | 8 | ||||
-rw-r--r-- | modules/ssl/ssl_ct_sct.c | 4 | ||||
-rw-r--r-- | modules/ssl/ssl_engine_init.c | 10 | ||||
-rw-r--r-- | modules/ssl/ssl_engine_io.c | 8 | ||||
-rw-r--r-- | modules/ssl/ssl_engine_kernel.c | 2 | ||||
-rw-r--r-- | modules/ssl/ssl_engine_vars.c | 4 | ||||
-rw-r--r-- | modules/ssl/ssl_private.h | 29 | ||||
-rw-r--r-- | modules/ssl/ssl_util.c | 7 | ||||
-rw-r--r-- | modules/ssl/ssl_util_ssl.h | 2 | ||||
-rw-r--r-- | support/ab.c | 8 |
10 files changed, 53 insertions, 29 deletions
diff --git a/modules/ssl/mod_ssl.c b/modules/ssl/mod_ssl.c index dd34848c5f..6df5d43055 100644 --- a/modules/ssl/mod_ssl.c +++ b/modules/ssl/mod_ssl.c @@ -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 diff --git a/modules/ssl/ssl_ct_sct.c b/modules/ssl/ssl_ct_sct.c index 079c8b672d..5eb32cc912 100644 --- a/modules/ssl/ssl_ct_sct.c +++ b/modules/ssl/ssl_ct_sct.c @@ -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); diff --git a/modules/ssl/ssl_engine_init.c b/modules/ssl/ssl_engine_init.c index 1cdc8981b1..be6b1d72b3 100644 --- a/modules/ssl/ssl_engine_init.c +++ b/modules/ssl/ssl_engine_init.c @@ -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(); diff --git a/modules/ssl/ssl_engine_io.c b/modules/ssl/ssl_engine_io.c index d75a1ccba8..1079d1598e 100644 --- a/modules/ssl/ssl_engine_io.c +++ b/modules/ssl/ssl_engine_io.c @@ -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); diff --git a/modules/ssl/ssl_engine_kernel.c b/modules/ssl/ssl_engine_kernel.c index af2ada7b67..1eaa1ee45f 100644 --- a/modules/ssl/ssl_engine_kernel.c +++ b/modules/ssl/ssl_engine_kernel.c @@ -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); \ diff --git a/modules/ssl/ssl_engine_vars.c b/modules/ssl/ssl_engine_vars.c index 6acca09e79..77cb028e63 100644 --- a/modules/ssl/ssl_engine_vars.c +++ b/modules/ssl/ssl_engine_vars.c @@ -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; diff --git a/modules/ssl/ssl_private.h b/modules/ssl/ssl_private.h index b41e737f75..9d10c76104 100644 --- a/modules/ssl/ssl_private.h +++ b/modules/ssl/ssl_private.h @@ -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); diff --git a/modules/ssl/ssl_util.c b/modules/ssl/ssl_util.c index 00ad08727e..e21ac35e99 100644 --- a/modules/ssl/ssl_util.c +++ b/modules/ssl/ssl_util.c @@ -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 */ diff --git a/modules/ssl/ssl_util_ssl.h b/modules/ssl/ssl_util_ssl.h index 4f18f916b4..04b138d2ae 100644 --- a/modules/ssl/ssl_util_ssl.h +++ b/modules/ssl/ssl_util_ssl.h @@ -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) diff --git a/support/ab.c b/support/ab.c index 58769a9c89..118e17b5c8 100644 --- a/support/ab.c +++ b/support/ab.c @@ -197,6 +197,14 @@ typedef STACK_OF(X509) X509_STACK_TYPE; #if !defined(OPENSSL_NO_TLSEXT) && defined(SSL_set_tlsext_host_name) #define HAVE_TLSEXT #endif +#if defined(LIBRESSL_VERSION_NUMBER) && 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 #endif #include <math.h> |