curl-openssl.m4 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. #***************************************************************************
  2. # _ _ ____ _
  3. # Project ___| | | | _ \| |
  4. # / __| | | | |_) | |
  5. # | (__| |_| | _ <| |___
  6. # \___|\___/|_| \_\_____|
  7. #
  8. # Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
  9. #
  10. # This software is licensed as described in the file COPYING, which
  11. # you should have received as part of this distribution. The terms
  12. # are also available at https://curl.se/docs/copyright.html.
  13. #
  14. # You may opt to use, copy, modify, merge, publish, distribute and/or sell
  15. # copies of the Software, and permit persons to whom the Software is
  16. # furnished to do so, under the terms of the COPYING file.
  17. #
  18. # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
  19. # KIND, either express or implied.
  20. #
  21. # SPDX-License-Identifier: curl
  22. #
  23. #***************************************************************************
  24. # File version for 'aclocal' use. Keep it a single number.
  25. # serial 5
  26. dnl **********************************************************************
  27. dnl Check for OpenSSL libraries and headers
  28. dnl **********************************************************************
  29. AC_DEFUN([CURL_WITH_OPENSSL], [
  30. if test "x$OPT_OPENSSL" != xno; then
  31. ssl_msg=
  32. dnl backup the pre-ssl variables
  33. CLEANLDFLAGS="$LDFLAGS"
  34. CLEANCPPFLAGS="$CPPFLAGS"
  35. CLEANLIBS="$LIBS"
  36. dnl This is for Msys/Mingw
  37. case $host in
  38. *-*-msys* | *-*-mingw*)
  39. AC_MSG_CHECKING([for gdi32])
  40. my_ac_save_LIBS=$LIBS
  41. LIBS="-lgdi32 $LIBS"
  42. AC_LINK_IFELSE([ AC_LANG_PROGRAM([[
  43. #include <windef.h>
  44. #include <wingdi.h>
  45. ]],
  46. [[
  47. GdiFlush();
  48. ]])],
  49. [ dnl worked!
  50. AC_MSG_RESULT([yes])],
  51. [ dnl failed, restore LIBS
  52. LIBS=$my_ac_save_LIBS
  53. AC_MSG_RESULT(no)]
  54. )
  55. ;;
  56. esac
  57. case "$OPT_OPENSSL" in
  58. yes)
  59. dnl --with-openssl (without path) used
  60. PKGTEST="yes"
  61. PREFIX_OPENSSL=
  62. ;;
  63. *)
  64. dnl check the given --with-openssl spot
  65. PKGTEST="no"
  66. PREFIX_OPENSSL=$OPT_OPENSSL
  67. dnl Try pkg-config even when cross-compiling. Since we
  68. dnl specify PKG_CONFIG_LIBDIR we're only looking where
  69. dnl the user told us to look
  70. OPENSSL_PCDIR="$OPT_OPENSSL/lib/pkgconfig"
  71. if test -f "$OPENSSL_PCDIR/openssl.pc"; then
  72. AC_MSG_NOTICE([PKG_CONFIG_LIBDIR will be set to "$OPENSSL_PCDIR"])
  73. PKGTEST="yes"
  74. fi
  75. if test "$PKGTEST" != "yes"; then
  76. # try lib64 instead
  77. OPENSSL_PCDIR="$OPT_OPENSSL/lib64/pkgconfig"
  78. if test -f "$OPENSSL_PCDIR/openssl.pc"; then
  79. AC_MSG_NOTICE([PKG_CONFIG_LIBDIR will be set to "$OPENSSL_PCDIR"])
  80. PKGTEST="yes"
  81. fi
  82. fi
  83. if test "$PKGTEST" != "yes"; then
  84. if test ! -f "$PREFIX_OPENSSL/include/openssl/ssl.h"; then
  85. AC_MSG_ERROR([$PREFIX_OPENSSL is a bad --with-openssl prefix!])
  86. fi
  87. fi
  88. dnl in case pkg-config comes up empty, use what we got
  89. dnl via --with-openssl
  90. LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff"
  91. if test "$PREFIX_OPENSSL" != "/usr" ; then
  92. SSL_LDFLAGS="-L$LIB_OPENSSL"
  93. SSL_CPPFLAGS="-I$PREFIX_OPENSSL/include"
  94. fi
  95. SSL_CPPFLAGS="$SSL_CPPFLAGS -I$PREFIX_OPENSSL/include/openssl"
  96. ;;
  97. esac
  98. if test "$PKGTEST" = "yes"; then
  99. CURL_CHECK_PKGCONFIG(openssl, [$OPENSSL_PCDIR])
  100. if test "$PKGCONFIG" != "no" ; then
  101. SSL_LIBS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl
  102. $PKGCONFIG --libs-only-l --libs-only-other openssl 2>/dev/null`
  103. SSL_LDFLAGS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl
  104. $PKGCONFIG --libs-only-L openssl 2>/dev/null`
  105. SSL_CPPFLAGS=`CURL_EXPORT_PCDIR([$OPENSSL_PCDIR]) dnl
  106. $PKGCONFIG --cflags-only-I openssl 2>/dev/null`
  107. AC_SUBST(SSL_LIBS)
  108. AC_MSG_NOTICE([pkg-config: SSL_LIBS: "$SSL_LIBS"])
  109. AC_MSG_NOTICE([pkg-config: SSL_LDFLAGS: "$SSL_LDFLAGS"])
  110. AC_MSG_NOTICE([pkg-config: SSL_CPPFLAGS: "$SSL_CPPFLAGS"])
  111. LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/^-L//'`
  112. dnl use the values pkg-config reported. This is here
  113. dnl instead of below with CPPFLAGS and LDFLAGS because we only
  114. dnl learn about this via pkg-config. If we only have
  115. dnl the argument to --with-openssl we don't know what
  116. dnl additional libs may be necessary. Hope that we
  117. dnl don't need any.
  118. LIBS="$SSL_LIBS $LIBS"
  119. fi
  120. fi
  121. dnl finally, set flags to use SSL
  122. CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
  123. LDFLAGS="$LDFLAGS $SSL_LDFLAGS"
  124. AC_CHECK_LIB(crypto, HMAC_Update,[
  125. HAVECRYPTO="yes"
  126. LIBS="-lcrypto $LIBS"
  127. ],[
  128. if test -n "$LIB_OPENSSL" ; then
  129. LDFLAGS="$CLEANLDFLAGS -L$LIB_OPENSSL"
  130. fi
  131. if test "$PKGCONFIG" = "no" -a -n "$PREFIX_OPENSSL" ; then
  132. # only set this if pkg-config wasn't used
  133. CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include"
  134. fi
  135. # Linking previously failed, try extra paths from --with-openssl or
  136. # pkg-config. Use a different function name to avoid reusing the earlier
  137. # cached result.
  138. AC_CHECK_LIB(crypto, HMAC_Init_ex,[
  139. HAVECRYPTO="yes"
  140. LIBS="-lcrypto $LIBS"], [
  141. dnl still no, but what about with -ldl?
  142. AC_MSG_CHECKING([OpenSSL linking with -ldl])
  143. LIBS="-lcrypto $CLEANLIBS -ldl"
  144. AC_LINK_IFELSE([ AC_LANG_PROGRAM([[
  145. #include <openssl/err.h>
  146. ]], [[
  147. ERR_clear_error();
  148. ]]) ],
  149. [
  150. AC_MSG_RESULT(yes)
  151. HAVECRYPTO="yes"
  152. ],
  153. [
  154. AC_MSG_RESULT(no)
  155. dnl ok, so what about both -ldl and -lpthread?
  156. dnl This may be necessary for static libraries.
  157. AC_MSG_CHECKING([OpenSSL linking with -ldl and -lpthread])
  158. LIBS="-lcrypto $CLEANLIBS -ldl -lpthread"
  159. AC_LINK_IFELSE([
  160. AC_LANG_PROGRAM([[
  161. #include <openssl/err.h>
  162. ]], [[
  163. ERR_clear_error();
  164. ]])],
  165. [
  166. AC_MSG_RESULT(yes)
  167. HAVECRYPTO="yes"
  168. ],
  169. [
  170. AC_MSG_RESULT(no)
  171. LDFLAGS="$CLEANLDFLAGS"
  172. CPPFLAGS="$CLEANCPPFLAGS"
  173. LIBS="$CLEANLIBS"
  174. ])
  175. ])
  176. ])
  177. ])
  178. if test X"$HAVECRYPTO" = X"yes"; then
  179. dnl This is only reasonable to do if crypto actually is there: check for
  180. dnl SSL libs NOTE: it is important to do this AFTER the crypto lib
  181. AC_CHECK_LIB(ssl, SSL_connect)
  182. if test "$ac_cv_lib_ssl_SSL_connect" != yes; then
  183. dnl we didn't find the SSL lib, try the RSAglue/rsaref stuff
  184. AC_MSG_CHECKING(for ssl with RSAglue/rsaref libs in use);
  185. OLIBS=$LIBS
  186. LIBS="-lRSAglue -lrsaref $LIBS"
  187. AC_CHECK_LIB(ssl, SSL_connect)
  188. if test "$ac_cv_lib_ssl_SSL_connect" != yes; then
  189. dnl still no SSL_connect
  190. AC_MSG_RESULT(no)
  191. LIBS=$OLIBS
  192. else
  193. AC_MSG_RESULT(yes)
  194. fi
  195. else
  196. dnl Have the libraries--check for OpenSSL headers
  197. AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \
  198. openssl/pem.h openssl/ssl.h openssl/err.h,
  199. ssl_msg="OpenSSL"
  200. test openssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
  201. OPENSSL_ENABLED=1
  202. AC_DEFINE(USE_OPENSSL, 1, [if OpenSSL is in use]))
  203. if test $ac_cv_header_openssl_x509_h = no; then
  204. dnl we don't use the "action" part of the AC_CHECK_HEADERS macro
  205. dnl since 'err.h' might in fact find a krb4 header with the same
  206. dnl name
  207. AC_CHECK_HEADERS(x509.h rsa.h crypto.h pem.h ssl.h err.h)
  208. if test $ac_cv_header_x509_h = yes &&
  209. test $ac_cv_header_crypto_h = yes &&
  210. test $ac_cv_header_ssl_h = yes; then
  211. dnl three matches
  212. ssl_msg="OpenSSL"
  213. OPENSSL_ENABLED=1
  214. fi
  215. fi
  216. fi
  217. if test X"$OPENSSL_ENABLED" != X"1"; then
  218. LIBS="$CLEANLIBS"
  219. fi
  220. if test X"$OPT_OPENSSL" != Xoff &&
  221. test "$OPENSSL_ENABLED" != "1"; then
  222. AC_MSG_ERROR([OpenSSL libs and/or directories were not found where specified!])
  223. fi
  224. fi
  225. if test X"$OPENSSL_ENABLED" = X"1"; then
  226. dnl These can only exist if OpenSSL exists
  227. AC_CHECK_FUNCS( RAND_egd )
  228. AC_MSG_CHECKING([for BoringSSL])
  229. AC_COMPILE_IFELSE([
  230. AC_LANG_PROGRAM([[
  231. #include <openssl/base.h>
  232. ]],[[
  233. #ifndef OPENSSL_IS_BORINGSSL
  234. #error not boringssl
  235. #endif
  236. ]])
  237. ],[
  238. AC_MSG_RESULT([yes])
  239. AC_DEFINE_UNQUOTED(HAVE_BORINGSSL, 1,
  240. [Define to 1 if using BoringSSL.])
  241. ssl_msg="BoringSSL"
  242. ],[
  243. AC_MSG_RESULT([no])
  244. ])
  245. AC_MSG_CHECKING([for libressl])
  246. AC_COMPILE_IFELSE([
  247. AC_LANG_PROGRAM([[
  248. #include <openssl/opensslv.h>
  249. ]],[[
  250. int dummy = LIBRESSL_VERSION_NUMBER;
  251. ]])
  252. ],[
  253. AC_MSG_RESULT([yes])
  254. AC_DEFINE_UNQUOTED(HAVE_LIBRESSL, 1,
  255. [Define to 1 if using libressl.])
  256. ssl_msg="libressl"
  257. ],[
  258. AC_MSG_RESULT([no])
  259. ])
  260. AC_MSG_CHECKING([for OpenSSL >= v3])
  261. AC_COMPILE_IFELSE([
  262. AC_LANG_PROGRAM([[
  263. #include <openssl/opensslv.h>
  264. ]],[[
  265. #if defined(OPENSSL_VERSION_MAJOR) && (OPENSSL_VERSION_MAJOR >= 3)
  266. return 0;
  267. #else
  268. #error older than 3
  269. #endif
  270. ]])
  271. ],[
  272. AC_MSG_RESULT([yes])
  273. AC_DEFINE_UNQUOTED(HAVE_OPENSSL3, 1,
  274. [Define to 1 if using OpenSSL 3 or later.])
  275. dnl OpenSSLv3 marks the DES functions deprecated but we have no
  276. dnl replacements (yet) so tell the compiler to not warn for them
  277. dnl
  278. dnl Ask OpenSSL to suppress the warnings.
  279. CPPFLAGS="$CPPFLAGS -DOPENSSL_SUPPRESS_DEPRECATED"
  280. ssl_msg="OpenSSL v3+"
  281. ],[
  282. AC_MSG_RESULT([no])
  283. ])
  284. fi
  285. if test "$OPENSSL_ENABLED" = "1"; then
  286. if test -n "$LIB_OPENSSL"; then
  287. dnl when the ssl shared libs were found in a path that the run-time
  288. dnl linker doesn't search through, we need to add it to CURL_LIBRARY_PATH
  289. dnl to prevent further configure tests to fail due to this
  290. if test "x$cross_compiling" != "xyes"; then
  291. CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$LIB_OPENSSL"
  292. export CURL_LIBRARY_PATH
  293. AC_MSG_NOTICE([Added $LIB_OPENSSL to CURL_LIBRARY_PATH])
  294. fi
  295. fi
  296. check_for_ca_bundle=1
  297. fi
  298. test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
  299. fi
  300. if test X"$OPT_OPENSSL" != Xno &&
  301. test "$OPENSSL_ENABLED" != "1"; then
  302. AC_MSG_NOTICE([OPT_OPENSSL: $OPT_OPENSSL])
  303. AC_MSG_NOTICE([OPENSSL_ENABLED: $OPENSSL_ENABLED])
  304. AC_MSG_ERROR([--with-openssl was given but OpenSSL could not be detected])
  305. fi
  306. dnl **********************************************************************
  307. dnl Check for the random seed preferences
  308. dnl **********************************************************************
  309. if test X"$OPENSSL_ENABLED" = X"1"; then
  310. AC_ARG_WITH(egd-socket,
  311. AS_HELP_STRING([--with-egd-socket=FILE],
  312. [Entropy Gathering Daemon socket pathname]),
  313. [ EGD_SOCKET="$withval" ]
  314. )
  315. if test -n "$EGD_SOCKET" ; then
  316. AC_DEFINE_UNQUOTED(EGD_SOCKET, "$EGD_SOCKET",
  317. [your Entropy Gathering Daemon socket pathname] )
  318. fi
  319. dnl Check for user-specified random device
  320. AC_ARG_WITH(random,
  321. AS_HELP_STRING([--with-random=FILE],
  322. [read randomness from FILE (default=/dev/urandom)]),
  323. [ RANDOM_FILE="$withval" ],
  324. [
  325. if test x$cross_compiling != xyes; then
  326. dnl Check for random device
  327. AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
  328. else
  329. AC_MSG_WARN([skipped the /dev/urandom detection when cross-compiling])
  330. fi
  331. ]
  332. )
  333. if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then
  334. AC_SUBST(RANDOM_FILE)
  335. AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE",
  336. [a suitable file to read random data from])
  337. fi
  338. fi
  339. dnl ---
  340. dnl We require OpenSSL with SRP support.
  341. dnl ---
  342. if test "$OPENSSL_ENABLED" = "1"; then
  343. AC_MSG_CHECKING([for SRP support in OpenSSL])
  344. AC_LINK_IFELSE([
  345. AC_LANG_PROGRAM([[
  346. #include <openssl/ssl.h>
  347. ]],[[
  348. SSL_CTX_set_srp_username(NULL, "");
  349. SSL_CTX_set_srp_password(NULL, "");
  350. ]])
  351. ],[
  352. AC_MSG_RESULT([yes])
  353. AC_DEFINE(HAVE_OPENSSL_SRP, 1, [if you have the functions SSL_CTX_set_srp_username and SSL_CTX_set_srp_password])
  354. AC_SUBST(HAVE_OPENSSL_SRP, [1])
  355. ],[
  356. AC_MSG_RESULT([no])
  357. ])
  358. fi
  359. dnl ---
  360. dnl Whether the OpenSSL configuration will be loaded automatically
  361. dnl ---
  362. if test X"$OPENSSL_ENABLED" = X"1"; then
  363. AC_ARG_ENABLE(openssl-auto-load-config,
  364. AS_HELP_STRING([--enable-openssl-auto-load-config],[Enable automatic loading of OpenSSL configuration])
  365. AS_HELP_STRING([--disable-openssl-auto-load-config],[Disable automatic loading of OpenSSL configuration]),
  366. [ if test X"$enableval" = X"no"; then
  367. AC_MSG_NOTICE([automatic loading of OpenSSL configuration disabled])
  368. AC_DEFINE(CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG, 1, [if the OpenSSL configuration won't be loaded automatically])
  369. fi
  370. ])
  371. fi
  372. ])