summaryrefslogtreecommitdiffstats
path: root/m4/ssl.m4
diff options
context:
space:
mode:
Diffstat (limited to 'm4/ssl.m4')
-rw-r--r--m4/ssl.m4284
1 files changed, 284 insertions, 0 deletions
diff --git a/m4/ssl.m4 b/m4/ssl.m4
new file mode 100644
index 0000000..199e1ee
--- /dev/null
+++ b/m4/ssl.m4
@@ -0,0 +1,284 @@
+AC_DEFUN([DOVECOT_SSL], [
+ have_ssl=no
+ build_dcrypt_openssl=no
+
+ if test $want_openssl != no && test $have_ssl = no; then
+ if test "$PKG_CONFIG" != "" && $PKG_CONFIG --exists openssl 2>/dev/null; then
+ PKG_CHECK_MODULES(SSL, openssl)
+ CFLAGS="$CFLAGS $SSL_CFLAGS"
+ have_openssl=yes
+ else
+ # openssl 0.9.8 wants -ldl and it's required if there's only .a lib
+ AC_CHECK_LIB(ssl, SSL_read, [
+ AC_CHECK_HEADERS(openssl/ssl.h openssl/err.h, [
+ SSL_LIBS="-lssl -lcrypto $DLLIB"
+ AC_SUBST(SSL_LIBS)
+ have_openssl=yes
+ ], [
+ if test $want_openssl = yes; then
+ AC_ERROR([Can't build with OpenSSL: openssl/ssl.h or openssl/err.h not found])
+ fi
+ ])
+ ], [
+ if test $want_openssl = yes; then
+ AC_ERROR([Can't build with OpenSSL: libssl not found])
+ fi
+ ], -lcrypto $DLLIB)
+ fi
+ if test "$have_openssl" = "yes"; then
+ AC_DEFINE(HAVE_OPENSSL,, [Build with OpenSSL support])
+ have_ssl="yes (OpenSSL)"
+
+ AC_MSG_CHECKING([if OpenSSL version is 1.0.1 or newer])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #include <openssl/opensslv.h>
+ #if OPENSSL_VERSION_NUMBER < 0x10001000L
+ #error "fail-compile"
+ #endif]], [[ return 0; ]])],
+ [ssl_version_ge_101=true], [ssl_version_ge_101=false])
+ AC_MSG_RESULT([$ssl_version_ge_101])
+ if test $ssl_version_ge_101 = false; then
+ AC_MSG_ERROR([Found deprecated OpenSSL version, use 1.0.1 or newer])
+ fi
+
+ AC_MSG_CHECKING([if OpenSSL version is 1.0.2 or better])
+
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #include <openssl/opensslv.h>
+ #if OPENSSL_VERSION_NUMBER < 0x10002000L
+ #error "fail-compile"
+ #endif]], [[ return 0; ]])], [ssl_version_ge_102=true], [ssl_version_ge_102=false])
+ AC_MSG_RESULT([$ssl_version_ge_102])
+
+ # SSL_clear_options introduced in openssl 0.9.8m but may be backported to
+ # older versions in "enterprise" OS releases; originally implemented as a
+ # macro but as a function in more recent openssl versions
+ AC_CACHE_CHECK([whether SSL_clear_options exists],i_cv_have_ssl_clear_options,[
+ old_LIBS=$LIBS
+ LIBS="$LIBS -lssl"
+ AC_TRY_LINK([
+ #include <openssl/ssl.h>
+ ], [
+ SSL *ssl;
+ long options;
+ SSL_clear_options(ssl, options);
+ ], [
+ i_cv_have_ssl_clear_options=yes
+ ], [
+ i_cv_have_ssl_clear_options=no
+ ])
+ LIBS=$old_LIBS
+ ])
+ if test $i_cv_have_ssl_clear_options = yes; then
+ AC_DEFINE(HAVE_SSL_CLEAR_OPTIONS,, [Define if you have SSL_clear_options])
+ fi
+
+ # New style mem functions? Should be in v1.1+
+ AC_CACHE_CHECK([whether CRYPTO_set_mem_functions has new style parameters],i_cv_have_ssl_new_mem_funcs,[
+ old_LIBS=$LIBS
+ LIBS="$LIBS -lssl"
+ AC_TRY_LINK([
+ #include <openssl/ssl.h>
+ int CRYPTO_set_mem_functions(
+ void *(*m) (size_t, const char *, int),
+ void *(*r) (void *, size_t, const char *, int),
+ void (*f) (void *, const char *, int));
+ ], [
+ ], [
+ i_cv_have_ssl_new_mem_funcs=yes
+ ], [
+ i_cv_have_ssl_new_mem_funcs=no
+ ])
+ LIBS=$old_LIBS
+ ])
+ if test $i_cv_have_ssl_new_mem_funcs = yes; then
+ AC_DEFINE(HAVE_SSL_NEW_MEM_FUNCS,, [Define if CRYPTO_set_mem_functions has new style parameters])
+ fi
+
+ # SSL_CTX_set1_curves_list is a macro so plain AC_CHECK_LIB fails here.
+ AC_CACHE_CHECK([whether SSL_CTX_set1_curves_list exists],i_cv_have_ssl_ctx_set1_curves_list,[
+ old_LIBS=$LIBS
+ LIBS="$LIBS -lssl"
+ AC_TRY_LINK([
+ #include <openssl/ssl.h>
+ ], [
+ SSL_CTX_set1_curves_list((void*)0, "");
+ ], [
+ i_cv_have_ssl_ctx_set1_curves_list=yes
+ ], [
+ i_cv_have_ssl_ctx_set1_curves_list=no
+ ])
+ LIBS=$old_LIBS
+ ])
+ if test $i_cv_have_ssl_ctx_set1_curves_list = yes; then
+ AC_DEFINE(HAVE_SSL_CTX_SET1_CURVES_LIST,, [Define if you have SSL_CTX_set1_curves_list])
+ fi
+
+ # SSL_CTX_set_min_proto_version is also a macro so AC_CHECK_LIB fails here.
+ AC_CACHE_CHECK([whether SSL_CTX_set_min_proto_version exists],i_cv_have_ssl_ctx_set_min_proto_version,[
+ old_LIBS=$LIBS
+ LIBS="$LIBS -lssl"
+ AC_TRY_LINK([
+ #include <openssl/ssl.h>
+ ], [
+ SSL_CTX_set_min_proto_version((void*)0, 0);
+ ], [
+ i_cv_have_ssl_ctx_set_min_proto_version=yes
+ ], [
+ i_cv_have_ssl_ctx_set_min_proto_version=no
+ ])
+ LIBS=$old_LIBS
+ ])
+ if test $i_cv_have_ssl_ctx_set_min_proto_version = yes; then
+ AC_DEFINE(HAVE_SSL_CTX_SET_MIN_PROTO_VERSION,, [Define if you have SSL_CTX_set_min_proto_version])
+ fi
+
+ # SSL_CTX_add0_chain_cert is also a macro so AC_CHECK_LIB fails here.
+ AC_CACHE_CHECK([whether SSL_CTX_add0_chain_cert exists],i_cv_have_ssl_ctx_add0_chain_cert,[
+ old_LIBS=$LIBS
+ LIBS="$LIBS -lssl"
+ AC_TRY_LINK([
+ #include <openssl/ssl.h>
+ ], [
+ SSL_CTX_add0_chain_cert((void*)0, 0);
+ ], [
+ i_cv_have_ssl_ctx_add0_chain_cert=yes
+ ], [
+ i_cv_have_ssl_ctx_add0_chain_cert=no
+ ])
+ LIBS=$old_LIBS
+ ])
+ if test $i_cv_have_ssl_ctx_add0_chain_cert = yes; then
+ AC_DEFINE(HAVE_SSL_CTX_ADD0_CHAIN_CERT,, [Define if you have SSL_CTX_add0_chain_cert])
+ fi
+
+ # SSL_CTX_set_current_cert is also a macro so AC_CHECK_LIB fails here.
+ AC_CACHE_CHECK([whether SSL_CTX_set_current_cert exists],i_cv_have_ssl_ctx_set_current_cert,[
+ old_LIBS=$LIBS
+ LIBS="$LIBS -lssl"
+ AC_TRY_LINK([
+ #include <openssl/ssl.h>
+ ], [
+ SSL_CTX_set_current_cert((void*)0, 0);
+ ], [
+ i_cv_have_ssl_ctx_set_current_cert=yes
+ ], [
+ i_cv_have_ssl_ctx_set_current_cert=no
+ ])
+ LIBS=$old_LIBS
+ ])
+ if test $i_cv_have_ssl_ctx_set_current_cert = yes; then
+ AC_DEFINE(HAVE_SSL_CTX_SET_CURRENT_CERT,, [Define if you have SSL_CTX_set_current_cert])
+ fi
+
+
+ AC_CHECK_LIB(ssl, SSL_CIPHER_get_kx_nid, [
+ AC_DEFINE(HAVE_SSL_CIPHER_get_kx_nid,, [Define if you have SSL_CIPHER_get_kx_nid])
+ ],, $SSL_LIBS)
+
+ AC_CHECK_LIB(ssl, ERR_remove_thread_state, [
+ AC_DEFINE(HAVE_OPENSSL_ERR_REMOVE_THREAD_STATE,, [Define if you have ERR_remove_thread_state])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, OPENSSL_thread_stop, [
+ AC_DEFINE(HAVE_OPENSSL_AUTO_THREAD_DEINIT,, [Define if OpenSSL performs thread cleanup automatically])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, OPENSSL_cleanup, [
+ AC_DEFINE(HAVE_OPENSSL_CLEANUP,, [OpenSSL supports OPENSSL_cleanup()])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, SSL_get_current_compression, [
+ AC_DEFINE(HAVE_SSL_COMPRESSION,, [Build with OpenSSL compression])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, SSL_get_servername, [
+ AC_DEFINE(HAVE_SSL_GET_SERVERNAME,, [Build with TLS hostname support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, SSL_COMP_free_compression_methods, [
+ AC_DEFINE(HAVE_SSL_COMP_FREE_COMPRESSION_METHODS,, [Build with SSL_COMP_free_compression_methods() support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, RSA_generate_key_ex, [
+ AC_DEFINE(HAVE_RSA_GENERATE_KEY_EX,, [Build with RSA_generate_key_ex() support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, ASN1_STRING_get0_data, [
+ AC_DEFINE(HAVE_ASN1_STRING_GET0_DATA,, [Build with ASN1_STRING_get0_data() support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, HMAC_CTX_new, [
+ AC_DEFINE(HAVE_HMAC_CTX_NEW,, [Build with HMAC_CTX_new() support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, EVP_MD_CTX_new, [
+ AC_DEFINE(HAVE_EVP_MD_CTX_NEW,, [Build with EVP_MD_CTX_new() support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, OBJ_length, [
+ AC_DEFINE(HAVE_OBJ_LENGTH,, [Build with OBJ_length() support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, EVP_PKEY_get0_RSA, [
+ AC_DEFINE(HAVE_EVP_PKEY_get0,, [Build with EVP_PKEY_get0_*() support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, SSL_CTX_set_ciphersuites, [
+ AC_DEFINE(HAVE_SSL_CTX_SET_CIPHERSUITES,, [Build with SSL_CTX_set_ciphersuites() support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, BN_secure_new, [
+ AC_DEFINE(HAVE_BN_SECURE_NEW,, [Build with BN_secure_new support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, RSA_set0_key, [
+ AC_DEFINE(HAVE_RSA_SET0_KEY,, [Build with RSA_set0_key support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, RSA_set0_factors, [
+ AC_DEFINE(HAVE_RSA_SET0_FACTORS,, [Build with RSA_set0_factors support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, RSA_set0_crt_params, [
+ AC_DEFINE(HAVE_RSA_SET0_CRT_PARAMS,, [Build with RSA_set0_crt_params support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, ECDSA_SIG_get0, [
+ AC_DEFINE(HAVE_ECDSA_SIG_GET0,, [Build with ECDSA_SIG_get0 support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, ECDSA_SIG_set0, [
+ AC_DEFINE(HAVE_ECDSA_SIG_SET0,, [Build with ECDSA_SIG_set0 support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, EC_GROUP_order_bits, [
+ AC_DEFINE(HAVE_EC_GROUP_order_bits,, [Build with EC_GROUP_order_bits support])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, X509_check_host, [
+ AC_DEFINE(HAVE_X509_CHECK_HOST,, [OpenSSL supports X509_check_host()])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, X509_check_ip, [
+ AC_DEFINE(HAVE_X509_CHECK_IP,, [OpenSSL supports X509_check_ip()])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, X509_check_ip_asc, [
+ AC_DEFINE(HAVE_X509_CHECK_IP_ASC,, [OpenSSL supports X509_check_ip_asc()])
+ ],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, [EVP_PKEY_CTX_new_id], [have_evp_pkey_ctx_new_id="yes"],, $SSL_LIBS)
+ AC_CHECK_LIB(ssl, [EC_KEY_new], [have_ec_key_new="yes"],, $SSL_LIBS)
+ if test "$have_evp_pkey_ctx_new_id" = "yes" && test "$have_ec_key_new" = "yes"; then
+ build_dcrypt_openssl="yes"
+ else
+ AC_MSG_WARN([No ECC support in OpenSSL - not enabling dcrypt])
+ fi
+ fi
+ fi
+ AM_CONDITIONAL(BUILD_OPENSSL, test "$have_openssl" = "yes")
+ AM_CONDITIONAL(BUILD_DCRYPT_OPENSSL, test "$build_dcrypt_openssl" = "yes")
+ AM_CONDITIONAL([SSL_VERSION_GE_102], [test x$ssl_version_ge_102 = xtrue])
+
+ if test $want_gnutls != no && test $have_ssl = no; then
+ AC_CHECK_LIB(gnutls, gnutls_global_init, [
+ AC_CHECK_HEADER(gnutls/gnutls.h, [
+ AC_DEFINE(HAVE_GNUTLS,, [Build with GNUTLS support])
+ SSL_LIBS="-lgnutls -lgcrypt"
+ AC_SUBST(SSL_LIBS)
+ have_ssl="yes (GNUTLS)"
+ have_gnutls=yes
+ ], [
+ if test $want_gnutls = yes; then
+ AC_ERROR([Can't build with GNUTLS: gnutls/gnutls.h not found])
+ fi
+ ])
+ ], [
+ if test $want_gnutls = yes; then
+ AC_ERROR([Can't build with GNUTLS: libgnutls not found])
+ fi
+ ], -lgcrypt)
+ fi
+
+ if test "$have_ssl" != "no"; then
+ AC_DEFINE(HAVE_SSL,, [Build with SSL/TLS support])
+ fi
+])