Browse code

configure.ac: simplify crypto library configuration

This reworks the crypto library configuration, to make it both simpler to
understand and more usable:

* Only check for OpenSSL when building against OpenSSL (and similar for
PolarSSL/mbed TLS).
* Bail out early if a problem with the library is detected.
* Set CRYPTO_{LIBS,FLAGS} immediately after the crypto library checks,
removing the need for an extra switch-case later on.
* We no longer support building openvpn with crypto but without ssl, so
we can also simplify the logic in configure.ac accordingly.

As a 'side effect' (this actually triggered me), this fixes a bug that
would cause a user-specified OPENSSL_{CRYPTO,SSL}_LIBS to be overwritten
by AC_CHECK_LIB if there are openssl headers available in the PATH.

Signed-off-by: Steffan Karger <steffan@karger.me>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <1452436639-16838-1-git-send-email-steffan@karger.me>
URL: http://article.gmane.org/gmane.network.openvpn.devel/10978
Signed-off-by: Gert Doering <gert@greenie.muc.de>

Steffan Karger authored on 2016/01/10 23:37:19
Showing 3 changed files
... ...
@@ -78,3 +78,11 @@ User-visible Changes
78 78
 
79 79
 - Removed --enable-password-save from configure. This option is now
80 80
   always enabled.
81
+
82
+Maintainer-visible changes
83
+--------------------------
84
+- OpenVPN no longer supports building with crypto support, but without TLS
85
+  support.  As a consequence, OPENSSL_CRYPTO_{CFLAGS,LIBS} and
86
+  OPENSSL_SSL_{CFLAGS,LIBS} have been merged into OPENSSL_{CFLAGS,LIBS}.  This
87
+  is particularly relevant for maintainers who build their own OpenSSL library,
88
+  e.g. when cross-compiling.
... ...
@@ -210,14 +210,10 @@ ENVIRONMENT for ./configure:
210 210
   MAN2HTML    path to man2html utility
211 211
   GIT         path to git utility
212 212
   TAP_CFLAGS  C compiler flags for tap
213
-  OPENSSL_CRYPTO_CFLAGS
214
-              C compiler flags for OPENSSL_CRYPTO, overriding pkg-config
215
-  OPENSSL_CRYPTO_LIBS
216
-              linker flags for OPENSSL_CRYPTO, overriding pkg-config
217
-  OPENSSL_SSL_CFLAGS
218
-              C compiler flags for OPENSSL_SSL, overriding pkg-config
219
-  OPENSSL_SSL_LIBS
220
-              linker flags for OPENSSL_SSL, overriding pkg-config
213
+  OPENSSL_CFLAGS
214
+              C compiler flags for OpenSSL, overriding pkg-config
215
+  OPENSSL_LIBS
216
+              linker flags for OpenSSL, overriding pkg-config
221 217
   POLARSSL_CFLAGS
222 218
               C compiler flags for polarssl
223 219
   POLARSSL_LIBS
... ...
@@ -781,42 +781,32 @@ PKG_CHECK_MODULES(
781 781
 	[]
782 782
 )
783 783
 
784
-PKG_CHECK_MODULES(
785
-	[OPENSSL_CRYPTO],
786
-	[libcrypto >= 0.9.8],
787
-	[have_openssl_crypto="yes"],
788
-	[AC_CHECK_LIB(
789
-		[crypto],
790
-		[RSA_new],
791
-		[
792
-			have_openssl_crypto="yes"
793
-			OPENSSL_CRYPTO_LIBS="-lcrypto"
794
-		]
795
-	)]
796
-)
784
+if test "${with_crypto_library}" = "openssl"; then
785
+	AC_ARG_VAR([OPENSSL_CFLAGS], [C compiler flags for OpenSSL])
786
+	AC_ARG_VAR([OPENSSL_LIBS], [linker flags for OpenSSL])
787
+
788
+	if test -z "${OPENSSL_CFLAGS}" -a -z "${OPENSSL_LIBS}"; then
789
+		# if the user did not explicitly specify flags, try to autodetect
790
+		PKG_CHECK_MODULES(
791
+			[OPENSSL],
792
+			[libcrypto >= 0.9.8, libssl >= 0.9.8],
793
+	        [have_openssl="yes"],
794
+			[have_openssl="no"] # Provide if-not-found to prevent erroring out
795
+		)
797 796
 
798
-PKG_CHECK_MODULES(
799
-	[OPENSSL_SSL],
800
-	[libssl >= 0.9.8],
801
-	[have_openssl_ssl="yes"],
802
-	[AC_CHECK_LIB(
803
-		[ssl],
804
-		[SSL_CTX_new],
805
-		[
806
-			have_openssl_ssl="yes"
807
-			OPENSSL_SSL_LIBS="-lssl"
808
-		],
809
-		[],
810
-		[-lcrypto]
811
-	)]
812
-)
797
+		OPENSSL_LIBS=${OPENSSL_LIBS:--lssl -lcrypto}
798
+	fi
813 799
 
814
-if test "${have_openssl_crypto}" = "yes"; then
815 800
 	saved_CFLAGS="${CFLAGS}"
816 801
 	saved_LIBS="${LIBS}"
817
-	CFLAGS="${CFLAGS} ${OPENSSL_CRYPTO_CFLAGS}"
818
-	LIBS="${LIBS} ${OPENSSL_CRYPTO_LIBS}"
819
-	AC_CHECK_FUNCS([EVP_CIPHER_CTX_set_key_length])
802
+	CFLAGS="${CFLAGS} ${OPENSSL_CFLAGS}"
803
+	LIBS="${LIBS} ${OPENSSL_LIBS}"
804
+
805
+	AC_CHECK_FUNCS([SSL_CTX_new EVP_CIPHER_CTX_set_key_length],
806
+				   ,
807
+				   [AC_MSG_ERROR([openssl check failed])]
808
+	)
809
+
820 810
 	have_openssl_engine="yes"
821 811
 	AC_CHECK_FUNCS(
822 812
 		[ \
... ...
@@ -827,38 +817,45 @@ if test "${have_openssl_crypto}" = "yes"; then
827 827
 		,
828 828
 		[have_openssl_engine="no"; break]
829 829
 	)
830
+	if test "${have_openssl_engine}" = "yes"; then
831
+		AC_DEFINE([HAVE_OPENSSL_ENGINE], [1], [OpenSSL engine support available])
832
+	fi
830 833
 
831 834
 	CFLAGS="${saved_CFLAGS}"
832 835
 	LIBS="${saved_LIBS}"
833
-fi
834 836
 
835
-AC_ARG_VAR([POLARSSL_CFLAGS], [C compiler flags for polarssl])
836
-AC_ARG_VAR([POLARSSL_LIBS], [linker flags for polarssl])
837
-have_polarssl_ssl="yes"
838
-have_polarssl_crypto="yes"
839
-if test -z "${POLARSSL_LIBS}"; then
840
-	AC_CHECK_LIB(
841
-		[polarssl],
842
-		[ssl_init],
843
-		[POLARSSL_LIBS="-lpolarssl"],
844
-		[
845
-			have_polarssl_ssl="no"
846
-			AC_CHECK_LIB(
847
-				[polarssl],
848
-				[aes_crypt_cbc],
849
-				,
850
-				[have_polarssl_crypto="no"],
851
-				[${PKCS11_HELPER_LIBS}]
852
-			)
853
-		],
854
-		[${PKCS11_HELPER_LIBS}]
855
-	)
856
-fi
837
+	have_crypto="yes"
838
+	AC_DEFINE([ENABLE_CRYPTO_OPENSSL], [1], [Use OpenSSL library])
839
+	CRYPTO_CFLAGS="${OPENSSL_CFLAGS}"
840
+	CRYPTO_LIBS="${OPENSSL_LIBS}"
841
+elif test "${with_crypto_library}" = "polarssl"; then
842
+	AC_ARG_VAR([POLARSSL_CFLAGS], [C compiler flags for polarssl])
843
+	AC_ARG_VAR([POLARSSL_LIBS], [linker flags for polarssl])
844
+
845
+	if test -z "${POLARSSL_CFLAGS}" -a -z "${POLARSSL_LIBS}"; then
846
+        # if the user did not explicitly specify flags, try to autodetect
847
+		AC_SEARCH_LIBS(
848
+			[ssl_init],
849
+			[mbedtls],
850
+			[POLARSSL_LIBS=-lmbedtls]
851
+			[
852
+				AC_SEARCH_LIBS(
853
+					[ssl_init],
854
+					[polarssl],
855
+					[POLARSSL_LIBS=-lpolarssl]
856
+					[],
857
+					[${PKCS11_HELPER_LIBS}]
858
+				)
859
+			],
860
+			[${PKCS11_HELPER_LIBS}]
861
+		)
862
+	fi
857 863
 
858
-if test "${with_crypto_library}" = "polarssl" ; then
859 864
 	AC_MSG_CHECKING([polarssl version])
860
-	old_CFLAGS="${CFLAGS}"
861
-	CFLAGS="${POLARSSL_CFLAGS} ${CFLAGS}"
865
+	saved_CFLAGS="${CFLAGS}"
866
+	saved_LIBS="${LIBS}"
867
+	CFLAGS="${POLARSSL_CFLAGS} ${PKCS11_HELPER_CFLAGS} ${CFLAGS}"
868
+	LIBS="${POLARSSL_LIBS} ${PKCS11_HELPER_LIBS} ${LIBS}"
862 869
 	AC_COMPILE_IFELSE(
863 870
 		[AC_LANG_PROGRAM(
864 871
 			[[
... ...
@@ -887,7 +884,6 @@ if test "${with_crypto_library}" = "polarssl" ; then
887 887
 			]]
888 888
 		)],
889 889
 		polarssl_with_pkcs11="yes")
890
-	CFLAGS="${old_CFLAGS}"
891 890
 
892 891
 	AC_MSG_CHECKING([polarssl pkcs11 support])
893 892
 	if test "${enable_pkcs11}" = "yes"; then
... ...
@@ -903,7 +899,15 @@ if test "${with_crypto_library}" = "polarssl" ; then
903 903
 			AC_MSG_ERROR([PolarSSL compiled with PKCS11, while OpenVPN is not])
904 904
 		fi
905 905
 	fi
906
+	CFLAGS="${saved_CFLAGS}"
907
+	LIBS="${saved_LIBS}"
906 908
 
909
+	have_crypto="yes"
910
+	AC_DEFINE([ENABLE_CRYPTO_POLARSSL], [1], [Use PolarSSL library])
911
+	CRYPTO_CFLAGS="${POLARSSL_CFLAGS}"
912
+	CRYPTO_LIBS="${POLARSSL_LIBS}"
913
+else
914
+	AC_MSG_ERROR([Invalid crypto library: ${with_crypto_library}])
907 915
 fi
908 916
 
909 917
 AC_ARG_VAR([LZO_CFLAGS], [C compiler flags for lzo])
... ...
@@ -1049,31 +1053,11 @@ test "${enable_def_auth}" = "yes" && AC_DEFINE([ENABLE_DEF_AUTH], [1], [Enable d
1049 1049
 test "${enable_pf}" = "yes" && AC_DEFINE([ENABLE_PF], [1], [Enable internal packet filter])
1050 1050
 test "${enable_strict_options}" = "yes" && AC_DEFINE([ENABLE_STRICT_OPTIONS_CHECK], [1], [Enable strict options check between peers])
1051 1051
 
1052
-case "${with_crypto_library}" in
1053
-	openssl)
1054
-		have_crypto_crypto="${have_openssl_crypto}"
1055
-		have_crypto_ssl="${have_openssl_ssl}"
1056
-		CRYPTO_CRYPTO_CFLAGS="${OPENSSL_CRYPTO_CFLAGS}"
1057
-		CRYPTO_CRYPTO_LIBS="${OPENSSL_CRYPTO_LIBS}"
1058
-		CRYPTO_SSL_CFLAGS="${OPENSSL_SSL_CFLAGS}"
1059
-		CRYPTO_SSL_LIBS="${OPENSSL_SSL_LIBS}"
1060
-		AC_DEFINE([ENABLE_CRYPTO_OPENSSL], [1], [Use OpenSSL library])
1061
-		test "${have_openssl_engine}" = "yes" && AC_DEFINE([HAVE_OPENSSL_ENGINE], [1], [Use crypto library])
1062
-		;;
1063
-	polarssl)
1064
-		have_crypto_crypto="${have_polarssl_crypto}"
1065
-		have_crypto_ssl="${have_polarssl_ssl}"
1066
-		CRYPTO_CRYPTO_CFLAGS="${POLARSSL_CFLAGS}"
1067
-		CRYPTO_CRYPTO_LIBS="${POLARSSL_LIBS}"
1068
-		AC_DEFINE([ENABLE_CRYPTO_POLARSSL], [1], [Use PolarSSL library])
1069
-		;;
1070
-esac
1071
-
1072 1052
 if test "${enable_crypto}" = "yes"; then
1073
-	test "${have_crypto_crypto}" != "yes" && AC_MSG_ERROR([${with_crypto_library} crypto is required but missing])
1053
+	test "${have_crypto}" != "yes" && AC_MSG_ERROR([${with_crypto_library} crypto is required but missing])
1074 1054
 	test "${enable_crypto_ofb_cfb}" = "yes" && AC_DEFINE([ENABLE_OFB_CFB_MODE], [1], [Enable OFB and CFB cipher modes])
1075
-	OPTIONAL_CRYPTO_CFLAGS="${OPTIONAL_CRYPTO_CFLAGS} ${CRYPTO_CRYPTO_CFLAGS} ${CRYPTO_SSL_CFLAGS}"
1076
-	OPTIONAL_CRYPTO_LIBS="${OPTIONAL_CRYPTO_LIBS} ${CRYPTO_SSL_LIBS} ${CRYPTO_CRYPTO_LIBS}"
1055
+	OPTIONAL_CRYPTO_CFLAGS="${OPTIONAL_CRYPTO_CFLAGS} ${CRYPTO_CFLAGS}"
1056
+	OPTIONAL_CRYPTO_LIBS="${OPTIONAL_CRYPTO_LIBS} ${CRYPTO_LIBS}"
1077 1057
 	AC_DEFINE([ENABLE_CRYPTO], [1], [Enable crypto library])
1078 1058
 fi
1079 1059