curl-openssl.m4 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. #***************************************************************************
  2. # _ _ ____ _
  3. # Project ___| | | | _ \| |
  4. # / __| | | | |_) | |
  5. # | (__| |_| | _ <| |___
  6. # \___|\___/|_| \_\_____|
  7. #
  8. # Copyright (C) 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. CLEANLDFLAGSPC="$LDFLAGSPC"
  35. CLEANCPPFLAGS="$CPPFLAGS"
  36. CLEANLIBS="$LIBS"
  37. dnl This is for MSYS/MinGW
  38. case $host in
  39. *-*-msys* | *-*-mingw*)
  40. AC_MSG_CHECKING([for gdi32])
  41. my_ac_save_LIBS=$LIBS
  42. LIBS="-lgdi32 $LIBS"
  43. AC_LINK_IFELSE([ AC_LANG_PROGRAM([[
  44. #include <windef.h>
  45. #include <wingdi.h>
  46. ]],
  47. [[
  48. GdiFlush();
  49. ]])],
  50. [ dnl worked!
  51. AC_MSG_RESULT([yes])],
  52. [ dnl failed, restore LIBS
  53. LIBS=$my_ac_save_LIBS
  54. AC_MSG_RESULT(no)]
  55. )
  56. ;;
  57. esac
  58. case "$OPT_OPENSSL" in
  59. yes)
  60. dnl --with-openssl (without path) used
  61. PKGTEST="yes"
  62. PREFIX_OPENSSL=
  63. ;;
  64. *)
  65. dnl check the given --with-openssl spot
  66. PKGTEST="no"
  67. PREFIX_OPENSSL=$OPT_OPENSSL
  68. dnl Try pkg-config even when cross-compiling. Since we
  69. dnl specify PKG_CONFIG_LIBDIR we're only looking where
  70. dnl the user told us to look
  71. OPENSSL_PCDIR="$OPT_OPENSSL/lib/pkgconfig"
  72. if test -f "$OPENSSL_PCDIR/openssl.pc"; then
  73. AC_MSG_NOTICE([PKG_CONFIG_LIBDIR will be set to "$OPENSSL_PCDIR"])
  74. PKGTEST="yes"
  75. fi
  76. if test "$PKGTEST" != "yes"; then
  77. # try lib64 instead
  78. OPENSSL_PCDIR="$OPT_OPENSSL/lib64/pkgconfig"
  79. if test -f "$OPENSSL_PCDIR/openssl.pc"; then
  80. AC_MSG_NOTICE([PKG_CONFIG_LIBDIR will be set to "$OPENSSL_PCDIR"])
  81. PKGTEST="yes"
  82. fi
  83. fi
  84. if test "$PKGTEST" != "yes"; then
  85. if test ! -f "$PREFIX_OPENSSL/include/openssl/ssl.h"; then
  86. AC_MSG_ERROR([$PREFIX_OPENSSL is a bad --with-openssl prefix!])
  87. fi
  88. fi
  89. dnl in case pkg-config comes up empty, use what we got
  90. dnl via --with-openssl
  91. LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff"
  92. if test "$PREFIX_OPENSSL" != "/usr" ; then
  93. SSL_LDFLAGS="-L$LIB_OPENSSL"
  94. SSL_CPPFLAGS="-I$PREFIX_OPENSSL/include"
  95. fi
  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_MSG_NOTICE([pkg-config: SSL_LIBS: "$SSL_LIBS"])
  108. AC_MSG_NOTICE([pkg-config: SSL_LDFLAGS: "$SSL_LDFLAGS"])
  109. AC_MSG_NOTICE([pkg-config: SSL_CPPFLAGS: "$SSL_CPPFLAGS"])
  110. LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/^-L//'`
  111. dnl use the values pkg-config reported. This is here
  112. dnl instead of below with CPPFLAGS and LDFLAGS because we only
  113. dnl learn about this via pkg-config. If we only have
  114. dnl the argument to --with-openssl we don't know what
  115. dnl additional libs may be necessary. Hope that we
  116. dnl don't need any.
  117. LIBS="$SSL_LIBS $LIBS"
  118. fi
  119. fi
  120. dnl finally, set flags to use SSL
  121. CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
  122. LDFLAGS="$LDFLAGS $SSL_LDFLAGS"
  123. LDFLAGSPC="$LDFLAGSPC $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. LDFLAGSPC="$CLEANLDFLAGSPC -L$LIB_OPENSSL"
  131. fi
  132. if test "$PKGCONFIG" = "no" -a -n "$PREFIX_OPENSSL" ; then
  133. # only set this if pkg-config wasn't used
  134. CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include"
  135. fi
  136. # Linking previously failed, try extra paths from --with-openssl or
  137. # pkg-config. Use a different function name to avoid reusing the earlier
  138. # cached result.
  139. AC_CHECK_LIB(crypto, HMAC_Init_ex,[
  140. HAVECRYPTO="yes"
  141. LIBS="-lcrypto $LIBS"], [
  142. dnl still no, but what about with -ldl?
  143. AC_MSG_CHECKING([OpenSSL linking with -ldl])
  144. LIBS="-lcrypto $CLEANLIBS -ldl"
  145. AC_LINK_IFELSE([ AC_LANG_PROGRAM([[
  146. #include <openssl/err.h>
  147. ]], [[
  148. ERR_clear_error();
  149. ]]) ],
  150. [
  151. AC_MSG_RESULT(yes)
  152. HAVECRYPTO="yes"
  153. ],
  154. [
  155. AC_MSG_RESULT(no)
  156. dnl ok, so what about both -ldl and -lpthread?
  157. dnl This may be necessary for static libraries.
  158. AC_MSG_CHECKING([OpenSSL linking with -ldl and -lpthread])
  159. LIBS="-lcrypto $CLEANLIBS -ldl -lpthread"
  160. AC_LINK_IFELSE([
  161. AC_LANG_PROGRAM([[
  162. #include <openssl/err.h>
  163. ]], [[
  164. ERR_clear_error();
  165. ]])],
  166. [
  167. AC_MSG_RESULT(yes)
  168. HAVECRYPTO="yes"
  169. ],
  170. [
  171. AC_MSG_RESULT(no)
  172. LDFLAGS="$CLEANLDFLAGS"
  173. LDFLAGSPC="$CLEANLDFLAGSPC"
  174. CPPFLAGS="$CLEANCPPFLAGS"
  175. LIBS="$CLEANLIBS"
  176. ])
  177. ])
  178. ])
  179. ])
  180. if test X"$HAVECRYPTO" = X"yes"; then
  181. dnl This is only reasonable to do if crypto actually is there: check for
  182. dnl SSL libs NOTE: it is important to do this AFTER the crypto lib
  183. AC_CHECK_LIB(ssl, SSL_connect)
  184. if test "$ac_cv_lib_ssl_SSL_connect" != yes; then
  185. dnl we didn't find the SSL lib, try the RSAglue/rsaref stuff
  186. AC_MSG_CHECKING(for ssl with RSAglue/rsaref libs in use);
  187. OLIBS=$LIBS
  188. LIBS="-lRSAglue -lrsaref $LIBS"
  189. AC_CHECK_LIB(ssl, SSL_connect)
  190. if test "$ac_cv_lib_ssl_SSL_connect" != yes; then
  191. dnl still no SSL_connect
  192. AC_MSG_RESULT(no)
  193. LIBS=$OLIBS
  194. else
  195. AC_MSG_RESULT(yes)
  196. fi
  197. else
  198. dnl Have the libraries--check for OpenSSL headers
  199. AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \
  200. openssl/pem.h openssl/ssl.h openssl/err.h,
  201. ssl_msg="OpenSSL"
  202. test openssl != "$DEFAULT_SSL_BACKEND" || VALID_DEFAULT_SSL_BACKEND=yes
  203. OPENSSL_ENABLED=1
  204. AC_DEFINE(USE_OPENSSL, 1, [if OpenSSL is in use]))
  205. fi
  206. if test X"$OPENSSL_ENABLED" != X"1"; then
  207. LIBS="$CLEANLIBS"
  208. fi
  209. if test X"$OPT_OPENSSL" != Xoff &&
  210. test "$OPENSSL_ENABLED" != "1"; then
  211. AC_MSG_ERROR([OpenSSL libs and/or directories were not found where specified!])
  212. fi
  213. fi
  214. if test X"$OPENSSL_ENABLED" = X"1"; then
  215. dnl These can only exist if OpenSSL exists
  216. AC_MSG_CHECKING([for BoringSSL])
  217. AC_COMPILE_IFELSE([
  218. AC_LANG_PROGRAM([[
  219. #include <openssl/base.h>
  220. ]],[[
  221. #ifndef OPENSSL_IS_BORINGSSL
  222. #error not boringssl
  223. #endif
  224. ]])
  225. ],[
  226. AC_MSG_RESULT([yes])
  227. ssl_msg="BoringSSL"
  228. OPENSSL_IS_BORINGSSL=1
  229. ],[
  230. AC_MSG_RESULT([no])
  231. ])
  232. AC_MSG_CHECKING([for AWS-LC])
  233. AC_COMPILE_IFELSE([
  234. AC_LANG_PROGRAM([[
  235. #include <openssl/base.h>
  236. ]],[[
  237. #ifndef OPENSSL_IS_AWSLC
  238. #error not AWS-LC
  239. #endif
  240. ]])
  241. ],[
  242. AC_MSG_RESULT([yes])
  243. ssl_msg="AWS-LC"
  244. OPENSSL_IS_BORINGSSL=1
  245. ],[
  246. AC_MSG_RESULT([no])
  247. ])
  248. AC_MSG_CHECKING([for LibreSSL])
  249. AC_COMPILE_IFELSE([
  250. AC_LANG_PROGRAM([[
  251. #include <openssl/opensslv.h>
  252. ]],[[
  253. int dummy = LIBRESSL_VERSION_NUMBER;
  254. ]])
  255. ],[
  256. AC_MSG_RESULT([yes])
  257. ssl_msg="LibreSSL"
  258. ],[
  259. AC_MSG_RESULT([no])
  260. ])
  261. AC_MSG_CHECKING([for OpenSSL >= v3])
  262. AC_COMPILE_IFELSE([
  263. AC_LANG_PROGRAM([[
  264. #include <openssl/opensslv.h>
  265. ]],[[
  266. #if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
  267. return 0;
  268. #else
  269. #error older than 3
  270. #endif
  271. ]])
  272. ],[
  273. AC_MSG_RESULT([yes])
  274. ssl_msg="OpenSSL v3+"
  275. ],[
  276. AC_MSG_RESULT([no])
  277. ])
  278. fi
  279. dnl is this OpenSSL (fork) providing the original QUIC API?
  280. AC_CHECK_FUNCS([SSL_set_quic_use_legacy_codepoint],
  281. [QUIC_ENABLED=yes])
  282. if test "$QUIC_ENABLED" = "yes"; then
  283. AC_MSG_NOTICE([OpenSSL fork speaks QUIC API])
  284. else
  285. AC_MSG_NOTICE([OpenSSL version does not speak QUIC API])
  286. fi
  287. if test "$OPENSSL_ENABLED" = "1"; then
  288. if test -n "$LIB_OPENSSL"; then
  289. dnl when the ssl shared libs were found in a path that the run-time
  290. dnl linker doesn't search through, we need to add it to CURL_LIBRARY_PATH
  291. dnl to prevent further configure tests to fail due to this
  292. if test "x$cross_compiling" != "xyes"; then
  293. CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$LIB_OPENSSL"
  294. export CURL_LIBRARY_PATH
  295. AC_MSG_NOTICE([Added $LIB_OPENSSL to CURL_LIBRARY_PATH])
  296. fi
  297. fi
  298. check_for_ca_bundle=1
  299. LIBCURL_PC_REQUIRES_PRIVATE="$LIBCURL_PC_REQUIRES_PRIVATE openssl"
  300. fi
  301. test -z "$ssl_msg" || ssl_backends="${ssl_backends:+$ssl_backends, }$ssl_msg"
  302. fi
  303. if test X"$OPT_OPENSSL" != Xno &&
  304. test "$OPENSSL_ENABLED" != "1"; then
  305. AC_MSG_NOTICE([OPT_OPENSSL: $OPT_OPENSSL])
  306. AC_MSG_NOTICE([OPENSSL_ENABLED: $OPENSSL_ENABLED])
  307. AC_MSG_ERROR([--with-openssl was given but OpenSSL could not be detected])
  308. fi
  309. dnl ---
  310. dnl We require OpenSSL with SRP support.
  311. dnl ---
  312. if test "$OPENSSL_ENABLED" = "1"; then
  313. AC_MSG_CHECKING([for SRP support in OpenSSL])
  314. AC_LINK_IFELSE([
  315. AC_LANG_PROGRAM([[
  316. #include <openssl/ssl.h>
  317. ]],[[
  318. SSL_CTX_set_srp_username(NULL, "");
  319. SSL_CTX_set_srp_password(NULL, "");
  320. ]])
  321. ],[
  322. AC_MSG_RESULT([yes])
  323. AC_DEFINE(HAVE_OPENSSL_SRP, 1, [if you have the functions SSL_CTX_set_srp_username and SSL_CTX_set_srp_password])
  324. HAVE_OPENSSL_SRP=1
  325. ],[
  326. AC_MSG_RESULT([no])
  327. ])
  328. fi
  329. dnl ---
  330. dnl Whether the OpenSSL configuration will be loaded automatically
  331. dnl ---
  332. if test X"$OPENSSL_ENABLED" = X"1"; then
  333. AC_ARG_ENABLE(openssl-auto-load-config,
  334. AS_HELP_STRING([--enable-openssl-auto-load-config],[Enable automatic loading of OpenSSL configuration])
  335. AS_HELP_STRING([--disable-openssl-auto-load-config],[Disable automatic loading of OpenSSL configuration]),
  336. [ if test X"$enableval" = X"no"; then
  337. AC_MSG_NOTICE([automatic loading of OpenSSL configuration disabled])
  338. AC_DEFINE(CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG, 1, [if the OpenSSL configuration won't be loaded automatically])
  339. fi
  340. ])
  341. fi
  342. dnl ---
  343. dnl We may use OpenSSL QUIC.
  344. dnl ---
  345. if test "$OPENSSL_ENABLED" = "1"; then
  346. AC_MSG_CHECKING([for QUIC support and OpenSSL >= 3.3])
  347. AC_LINK_IFELSE([
  348. AC_LANG_PROGRAM([[
  349. #include <openssl/ssl.h>
  350. ]],[[
  351. #if (OPENSSL_VERSION_NUMBER < 0x30300000L)
  352. #error need at least version 3.3.0
  353. #endif
  354. OSSL_QUIC_client_method();
  355. ]])
  356. ],[
  357. AC_MSG_RESULT([yes])
  358. have_openssl_quic=1
  359. ],[
  360. AC_MSG_RESULT([no])
  361. ])
  362. fi
  363. ])