#*************************************************************************** # _ _ ____ _ # Project ___| | | | _ \| | # / __| | | | |_) | | # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # # Copyright (C) 1998 - 2021, Daniel Stenberg, , et al. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at https://curl.se/docs/copyright.html. # # You may opt to use, copy, modify, merge, publish, distribute and/or sell # copies of the Software, and permit persons to whom the Software is # furnished to do so, under the terms of the COPYING file. # # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY # KIND, either express or implied. # #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. # serial 5 dnl CURL_CHECK_OPENSSL_API_HEADERS dnl ------------------------------------------------- dnl Find out OpenSSL headers API version, as reported dnl by OPENSSL_VERSION_NUMBER. No runtime checks dnl allowed here for cross-compilation support. dnl HAVE_OPENSSL_API_HEADERS is defined as appropriate dnl only for systems which actually run the configure dnl script. Config files generated manually or in any dnl other way shall not define this. AC_DEFUN([CURL_CHECK_OPENSSL_API_HEADERS], [ # tst_api="unknown" # AC_MSG_CHECKING([for OpenSSL headers version]) CURL_CHECK_DEF([OPENSSL_VERSION_NUMBER], [ # ifdef USE_OPENSSL # include # else # include # endif ], [silent]) CURL_CHECK_DEF([OPENSSL_VERSION_STR], [ # include ], [silent]) if test "$curl_cv_have_def_OPENSSL_VERSION_NUMBER" = "yes"; then tst_verlen=`expr "$curl_cv_def_OPENSSL_VERSION_NUMBER" : '.*'` case "x$tst_verlen" in x6) tst_vermaj=`echo $curl_cv_def_OPENSSL_VERSION_NUMBER | cut -c 3` tst_vermin=`echo $curl_cv_def_OPENSSL_VERSION_NUMBER | cut -c 4` tst_verfix=`echo $curl_cv_def_OPENSSL_VERSION_NUMBER | cut -c 5` tst_api=0x$tst_vermaj$tst_vermin$tst_verfix ;; x11|x10) tst_vermaj=`echo $curl_cv_def_OPENSSL_VERSION_NUMBER | cut -c 3` tst_vermin=`echo $curl_cv_def_OPENSSL_VERSION_NUMBER | cut -c 5` tst_verfix=`echo $curl_cv_def_OPENSSL_VERSION_NUMBER | cut -c 7` tst_api=0x$tst_vermaj$tst_vermin$tst_verfix ;; *) if test "$curl_cv_have_def_OPENSSL_VERSION_STR" = "yes"; then ver=`echo $curl_cv_def_OPENSSL_VERSION_STR | sed 's/"//g'`; tst_vermaj=`echo $ver | cut -d. -f1` tst_vermin=`echo $ver | cut -d. -f2` tst_verfix=`echo $ver | cut -d. -f3` tst_show="$ver" tst_api=0x$tst_vermaj$tst_vermin$tst_verfix else tst_api="unknown" fi ;; esac case $tst_api in 0x111) tst_show="1.1.1" ;; 0x110) tst_show="1.1.0" ;; 0x102) tst_show="1.0.2" ;; 0x101) tst_show="1.0.1" ;; 0x100) tst_show="1.0.0" ;; 0x099) tst_show="0.9.9" ;; 0x098) tst_show="0.9.8" ;; 0x097) tst_show="0.9.7" ;; 0x096) tst_show="0.9.6" ;; 0x095) tst_show="0.9.5" ;; 0x094) tst_show="0.9.4" ;; 0x093) tst_show="0.9.3" ;; 0x092) tst_show="0.9.2" ;; 0x091) tst_show="0.9.1" ;; *) if test -z "$tst_show"; then tst_show="unknown" fi ;; esac tst_show="$tst_show - $tst_api" else tst_show="unknown" fi AC_MSG_RESULT([$tst_show]) # dnl if test "$tst_api" != "unknown"; then dnl AC_DEFINE_UNQUOTED(HAVE_OPENSSL_API_HEADERS, $tst_api, dnl [OpenSSL headers configure time API. Defined only by configure script. dnl No matter what, do not ever define this manually or by any other means.]) dnl fi curl_openssl_api_headers=$tst_api ]) dnl CURL_CHECK_OPENSSL_API_LIBRARY dnl ------------------------------------------------- dnl Find out OpenSSL library API version, performing dnl only link tests in order to avoid getting fooled dnl by mismatched OpenSSL headers. No runtime checks dnl allowed here for cross-compilation support. dnl HAVE_OPENSSL_API_LIBRARY is defined as appropriate dnl only for systems which actually run the configure dnl script. Config files generated manually or in any dnl other way shall not define this. dnl dnl Most probably we should not bother attempting to dnl detect OpenSSL library development API versions dnl 0.9.9 and 1.1.0. For our intended use, detecting dnl released versions should be good enough. dnl dnl Given that currently we are not using the result dnl of this check, except for informative purposes, dnl lets try to figure out everything. AC_DEFUN([CURL_CHECK_OPENSSL_API_LIBRARY], [ # tst_api="unknown" # AC_MSG_CHECKING([for OpenSSL library version]) if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([SSL_CTX_load_verify_dir]) ],[ tst_api="0x300" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([ERR_clear_last_mark]) ],[ tst_api="0x111" ]) fi if test "$tst_api" = "unknown"; then case $host in *-*-vms*) AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([SSL_CTX_set_not_resumbl_sess_cb]) ],[ tst_api="0x110" ]) ;; *) AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([SSL_CTX_set_not_resumable_session_callback]) ],[ tst_api="0x110" ]) ;; esac fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([SSL_CONF_CTX_new]) ],[ tst_api="0x102" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([SSL_renegotiate_abbreviated]) ],[ tst_api="0x101" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([OBJ_add_sigid]) ],[ tst_api="0x100" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([ERR_set_mark]) ],[ tst_api="0x098" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([ERR_peek_last_error]) ],[ tst_api="0x097" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([c2i_ASN1_OBJECT]) ],[ tst_api="0x096" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([SSL_CTX_set_purpose]) ],[ tst_api="0x095" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([OBJ_obj2txt]) ],[ tst_api="0x094" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([SSL_get_verify_depth]) ],[ tst_api="0x093" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([SSL_library_init]) ],[ tst_api="0x092" ]) fi if test "$tst_api" = "unknown"; then AC_LINK_IFELSE([ AC_LANG_FUNC_LINK_TRY([SSL_CTX_set_cipher_list]) ],[ tst_api="0x091" ]) fi case $tst_api in 0x300) tst_show="3.0.0" ;; 0x111) tst_show="1.1.1" ;; 0x110) tst_show="1.1.0" ;; 0x102) tst_show="1.0.2" ;; 0x101) tst_show="1.0.1" ;; 0x100) tst_show="1.0.0" ;; 0x099) tst_show="0.9.9" ;; 0x098) tst_show="0.9.8" ;; 0x097) tst_show="0.9.7" ;; 0x096) tst_show="0.9.6" ;; 0x095) tst_show="0.9.5" ;; 0x094) tst_show="0.9.4" ;; 0x093) tst_show="0.9.3" ;; 0x092) tst_show="0.9.2" ;; 0x091) tst_show="0.9.1" ;; *) tst_show="unknown" ;; esac AC_MSG_RESULT([$tst_show]) # dnl if test "$tst_api" != "unknown"; then dnl AC_DEFINE_UNQUOTED(HAVE_OPENSSL_API_LIBRARY, $tst_api, dnl [OpenSSL library link time API. Defined only by configure script. dnl No matter what, do not ever define this manually or by any other means.]) dnl fi curl_openssl_api_library=$tst_api ]) dnl CURL_CHECK_OPENSSL_API dnl ------------------------------------------------- AC_DEFUN([CURL_CHECK_OPENSSL_API], [ # CURL_CHECK_OPENSSL_API_HEADERS CURL_CHECK_OPENSSL_API_LIBRARY # tst_match="yes" # AC_MSG_CHECKING([for OpenSSL headers and library versions matching]) if test "$curl_openssl_api_headers" = "unknown" || test "$curl_openssl_api_library" = "unknown"; then tst_match="fail" tst_warns="Can not compare OpenSSL headers and library versions." elif test "$curl_openssl_api_headers" != "$curl_openssl_api_library"; then tst_match="no" tst_warns="OpenSSL headers and library versions do not match." fi AC_MSG_RESULT([$tst_match]) if test "$tst_match" != "yes"; then AC_MSG_WARN([$tst_warns]) fi ]) dnl ********************************************************************** dnl Check for OpenSSL libraries and headers dnl ********************************************************************** AC_DEFUN([CURL_WITH_OPENSSL], [ if test "x$OPT_OPENSSL" != xno; then ssl_msg= dnl backup the pre-ssl variables CLEANLDFLAGS="$LDFLAGS" CLEANCPPFLAGS="$CPPFLAGS" CLEANLIBS="$LIBS" dnl This is for Msys/Mingw case $host in *-*-msys* | *-*-mingw*) AC_MSG_CHECKING([for gdi32]) my_ac_save_LIBS=$LIBS LIBS="-lgdi32 $LIBS" AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include #include ]], [[ GdiFlush(); ]])], [ dnl worked! AC_MSG_RESULT([yes])], [ dnl failed, restore LIBS LIBS=$my_ac_save_LIBS AC_MSG_RESULT(no)] ) ;; esac case "$OPT_OPENSSL" in yes) dnl --with-openssl (without path) used PKGTEST="yes" PREFIX_OPENSSL= ;; *) dnl check the given --with-openssl spot PKGTEST="no" PREFIX_OPENSSL=$OPT_OPENSSL dnl Try pkg-config even when cross-compiling. Since we dnl specify PKG_CONFIG_LIBDIR we're only looking where dnl the user told us to look OPENSSL_PCDIR="$OPT_OPENSSL/lib/pkgconfig" if test -f "$OPENSSL_PCDIR/openssl.pc"; then AC_MSG_NOTICE([PKG_CONFIG_LIBDIR will be set to "$OPENSSL_PCDIR"]) PKGTEST="yes" fi if test "$PKGTEST" != "yes"; then # try lib64 instead OPENSSL_PCDIR="$OPT_OPENSSL/lib64/pkgconfig" if test -f "$OPENSSL_PCDIR/openssl.pc"; then AC_MSG_NOTICE([PKG_CONFIG_LIBDIR will be set to "$OPENSSL_PCDIR"]) PKGTEST="yes" fi fi if test "$PKGTEST" != "yes"; then if test ! -f "$PREFIX_OPENSSL/include/openssl/ssl.h"; then AC_MSG_ERROR([$PREFIX_OPENSSL is a bad --with-openssl prefix!]) fi fi dnl in case pkg-config comes up empty, use what we got dnl via --with-openssl LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff" if test "$PREFIX_OPENSSL" != "/usr" ; then SSL_LDFLAGS="-L$LIB_OPENSSL" SSL_CPPFLAGS="-I$PREFIX_OPENSSL/include" fi SSL_CPPFLAGS="$SSL_CPPFLAGS -I$PREFIX_OPENSSL/include/openssl" ;; esac if test "$PKGTEST" = "yes"; then CURL_CHECK_PKGCONFIG(openssl, [$OPENSSL_PCDIR]) if test "$PKGCONFIG" != "no" ; then SSL_LIBS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl $PKGCONFIG --libs-only-l --libs-only-other openssl 2>/dev/null` SSL_LDFLAGS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl $PKGCONFIG --libs-only-L openssl 2>/dev/null` SSL_CPPFLAGS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl $PKGCONFIG --cflags-only-I openssl 2>/dev/null` AC_SUBST(SSL_LIBS) AC_MSG_NOTICE([pkg-config: SSL_LIBS: "$SSL_LIBS"]) AC_MSG_NOTICE([pkg-config: SSL_LDFLAGS: "$SSL_LDFLAGS"]) AC_MSG_NOTICE([pkg-config: SSL_CPPFLAGS: "$SSL_CPPFLAGS"]) LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/^-L//'` dnl use the values pkg-config reported. This is here dnl instead of below with CPPFLAGS and LDFLAGS because we only dnl learn about this via pkg-config. If we only have dnl the argument to --with-openssl we don't know what dnl additional libs may be necessary. Hope that we dnl don't need any. LIBS="$SSL_LIBS $LIBS" fi fi dnl finally, set flags to use SSL CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS" LDFLAGS="$LDFLAGS $SSL_LDFLAGS" AC_CHECK_LIB(crypto, HMAC_Update,[ HAVECRYPTO="yes" LIBS="-lcrypto $LIBS" ],[ if test -n "$LIB_OPENSSL" ; then LDFLAGS="$CLEANLDFLAGS -L$LIB_OPENSSL" fi if test "$PKGCONFIG" = "no" -a -n "$PREFIX_OPENSSL" ; then # only set this if pkg-config wasn't used CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include" fi # Linking previously failed, try extra paths from --with-openssl or # pkg-config. Use a different function name to avoid reusing the earlier # cached result. AC_CHECK_LIB(crypto, HMAC_Init_ex,[ HAVECRYPTO="yes" LIBS="-lcrypto $LIBS"], [ dnl still no, but what about with -ldl? AC_MSG_CHECKING([OpenSSL linking with -ldl]) LIBS="$CLEANLIBS -lcrypto -ldl" AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include ]], [[ ERR_clear_error(); ]]) ], [ AC_MSG_RESULT(yes) HAVECRYPTO="yes" ], [ AC_MSG_RESULT(no) dnl ok, so what about both -ldl and -lpthread? dnl This may be necessary for static libraries. AC_MSG_CHECKING([OpenSSL linking with -ldl and -lpthread]) LIBS="$CLEANLIBS -lcrypto -ldl -lpthread" AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include ]], [[ ERR_clear_error(); ]])], [ AC_MSG_RESULT(yes) HAVECRYPTO="yes" ], [ AC_MSG_RESULT(no) LDFLAGS="$CLEANLDFLAGS" CPPFLAGS="$CLEANCPPFLAGS" LIBS="$CLEANLIBS" ]) ]) ]) ]) if test X"$HAVECRYPTO" = X"yes"; then dnl This is only reasonable to do if crypto actually is there: check for dnl SSL libs NOTE: it is important to do this AFTER the crypto lib AC_CHECK_LIB(ssl, SSL_connect) if test "$ac_cv_lib_ssl_SSL_connect" != yes; then dnl we didn't find the SSL lib, try the RSAglue/rsaref stuff AC_MSG_CHECKING(for ssl with RSAglue/rsaref libs in use); OLIBS=$LIBS LIBS="-lRSAglue -lrsaref $LIBS" AC_CHECK_LIB(ssl, SSL_connect) if test "$ac_cv_lib_ssl_SSL_connect" != yes; then dnl still no SSL_connect AC_MSG_RESULT(no) LIBS=$OLIBS else AC_MSG_RESULT(yes) fi else dnl Have the libraries--check for OpenSSL headers AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \ openssl/pem.h openssl/ssl.h openssl/err.h, ssl_msg="OpenSSL" test openssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes OPENSSL_ENABLED=1 AC_DEFINE(USE_OPENSSL, 1, [if OpenSSL is in use])) if test $ac_cv_header_openssl_x509_h = no; then dnl we don't use the "action" part of the AC_CHECK_HEADERS macro dnl since 'err.h' might in fact find a krb4 header with the same dnl name AC_CHECK_HEADERS(x509.h rsa.h crypto.h pem.h ssl.h err.h) if test $ac_cv_header_x509_h = yes && test $ac_cv_header_crypto_h = yes && test $ac_cv_header_ssl_h = yes; then dnl three matches ssl_msg="OpenSSL" OPENSSL_ENABLED=1 fi fi fi if test X"$OPENSSL_ENABLED" != X"1"; then LIBS="$CLEANLIBS" fi if test X"$OPT_OPENSSL" != Xoff && test "$OPENSSL_ENABLED" != "1"; then AC_MSG_ERROR([OpenSSL libs and/or directories were not found where specified!]) fi fi if test X"$OPENSSL_ENABLED" = X"1"; then dnl These can only exist if OpenSSL exists dnl OpenSSL_version is introduced in 3.0.0 AC_CHECK_FUNCS( RAND_egd \ SSLv2_client_method \ OpenSSL_version ) AC_MSG_CHECKING([for BoringSSL]) AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #include ]],[[ #ifndef OPENSSL_IS_BORINGSSL #error not boringssl #endif ]]) ],[ AC_MSG_RESULT([yes]) AC_DEFINE_UNQUOTED(HAVE_BORINGSSL, 1, [Define to 1 if using BoringSSL.]) ssl_msg="BoringSSL" ],[ AC_MSG_RESULT([no]) ]) AC_MSG_CHECKING([for libressl]) AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #include ]],[[ int dummy = LIBRESSL_VERSION_NUMBER; ]]) ],[ AC_MSG_RESULT([yes]) AC_DEFINE_UNQUOTED(HAVE_LIBRESSL, 1, [Define to 1 if using libressl.]) ssl_msg="libressl" ],[ AC_MSG_RESULT([no]) ]) AC_MSG_CHECKING([for OpenSSL >= v3]) AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #include ]],[[ #if defined(OPENSSL_VERSION_MAJOR) && (OPENSSL_VERSION_MAJOR >= 3) return 0; #else #error older than 3 #endif ]]) ],[ AC_MSG_RESULT([yes]) AC_DEFINE_UNQUOTED(HAVE_OPENSSL3, 1, [Define to 1 if using OpenSSL 3 or later.]) dnl OpenSSLv3 marks the DES functions deprecated but we have no dnl replacements (yet) so tell the compiler to not warn for them dnl dnl Ask OpenSSL to suppress the warnings. CPPFLAGS="$CPPFLAGS -DOPENSSL_SUPPRESS_DEPRECATED" ssl_msg="OpenSSL v3+" ],[ AC_MSG_RESULT([no]) ]) fi if test "$OPENSSL_ENABLED" = "1"; then if test -n "$LIB_OPENSSL"; then dnl when the ssl shared libs were found in a path that the run-time dnl linker doesn't search through, we need to add it to CURL_LIBRARY_PATH dnl to prevent further configure tests to fail due to this if test "x$cross_compiling" != "xyes"; then CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$LIB_OPENSSL" export CURL_LIBRARY_PATH AC_MSG_NOTICE([Added $LIB_OPENSSL to CURL_LIBRARY_PATH]) fi fi CURL_CHECK_OPENSSL_API check_for_ca_bundle=1 fi test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg" fi if test X"$OPT_OPENSSL" != Xno && test "$OPENSSL_ENABLED" != "1"; then AC_MSG_NOTICE([OPT_OPENSSL: $OPT_OPENSSL]) AC_MSG_NOTICE([OPENSSL_ENABLED: $OPENSSL_ENABLED]) AC_MSG_ERROR([--with-openssl was given but OpenSSL could not be detected]) fi dnl ********************************************************************** dnl Check for the random seed preferences dnl ********************************************************************** if test X"$OPENSSL_ENABLED" = X"1"; then AC_ARG_WITH(egd-socket, AS_HELP_STRING([--with-egd-socket=FILE], [Entropy Gathering Daemon socket pathname]), [ EGD_SOCKET="$withval" ] ) if test -n "$EGD_SOCKET" ; then AC_DEFINE_UNQUOTED(EGD_SOCKET, "$EGD_SOCKET", [your Entropy Gathering Daemon socket pathname] ) fi dnl Check for user-specified random device AC_ARG_WITH(random, AS_HELP_STRING([--with-random=FILE], [read randomness from FILE (default=/dev/urandom)]), [ RANDOM_FILE="$withval" ], [ if test x$cross_compiling != xyes; then dnl Check for random device AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] ) else AC_MSG_WARN([skipped the /dev/urandom detection when cross-compiling]) fi ] ) if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then AC_SUBST(RANDOM_FILE) AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE", [a suitable file to read random data from]) fi fi dnl --- dnl We require OpenSSL with SRP support. dnl --- if test "$OPENSSL_ENABLED" = "1"; then AC_CHECK_LIB(crypto, SRP_Calc_client_key, [ AC_DEFINE(HAVE_OPENSSL_SRP, 1, [if you have the function SRP_Calc_client_key]) AC_SUBST(HAVE_OPENSSL_SRP, [1]) ]) fi dnl --- dnl Whether the OpenSSL configuration will be loaded automatically dnl --- if test X"$OPENSSL_ENABLED" = X"1"; then AC_ARG_ENABLE(openssl-auto-load-config, AS_HELP_STRING([--enable-openssl-auto-load-config],[Enable automatic loading of OpenSSL configuration]) AS_HELP_STRING([--disable-openssl-auto-load-config],[Disable automatic loading of OpenSSL configuration]), [ if test X"$enableval" = X"no"; then AC_MSG_NOTICE([automatic loading of OpenSSL configuration disabled]) AC_DEFINE(CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG, 1, [if the OpenSSL configuration won't be loaded automatically]) fi ]) fi ])