Skip to content

Commit 5537b9f

Browse files
bpo-45536: Check OpenSSL APIs in configure (GH-29088)
(cherry picked from commit 81520fe) Co-authored-by: Christian Heimes <[email protected]>
1 parent 0d0312e commit 5537b9f

File tree

3 files changed

+105
-0
lines changed

3 files changed

+105
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
The ``configure`` script now checks whether OpenSSL headers and libraries
2+
provide required APIs. Most common APIs are verified. The check detects
3+
outdated or missing OpenSSL. Failures do not stop configure.

configure

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17778,6 +17778,66 @@ esac
1777817778
$as_echo "$OPENSSL_RPATH" >&6; }
1777917779

1778017780

17781+
# check if OpenSSL libraries work as expected
17782+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL provides required APIs" >&5
17783+
$as_echo_n "checking whether OpenSSL provides required APIs... " >&6; }
17784+
save_LIBS="$LIBS"
17785+
save_CFLAGS="$CFLAGS"
17786+
save_LDFLAGS="$LDFLAGS"
17787+
LIBS="$LIBS $OPENSSL_LIBS"
17788+
CFLAGS="$CFLAGS_NODIST $OPENSSL_INCLUDES"
17789+
LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS"
17790+
17791+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
17792+
/* end confdefs.h. */
17793+
17794+
#include <openssl/opensslv.h>
17795+
#include <openssl/evp.h>
17796+
#include <openssl/ssl.h>
17797+
17798+
#if OPENSSL_VERSION_NUMBER < 0x10101000L
17799+
#error "OpenSSL >= 1.1.1 is required"
17800+
#endif
17801+
17802+
static void keylog_cb(const SSL *ssl, const char *line) {}
17803+
17804+
int
17805+
main ()
17806+
{
17807+
17808+
/* SSL APIs */
17809+
SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
17810+
SSL_CTX_set_keylog_callback(ctx, keylog_cb);
17811+
SSL *ssl = SSL_new(ctx);
17812+
X509_VERIFY_PARAM *param = SSL_get0_param(ssl);
17813+
X509_VERIFY_PARAM_set1_host(param, "python.org", 0);
17814+
SSL_free(ssl);
17815+
SSL_CTX_free(ctx);
17816+
17817+
/* hashlib APIs */
17818+
OBJ_nid2sn(NID_md5);
17819+
OBJ_nid2sn(NID_sha1);
17820+
OBJ_nid2sn(NID_sha3_512);
17821+
OBJ_nid2sn(NID_blake2b512);
17822+
EVP_PBE_scrypt(NULL, 0, NULL, 0, 2, 8, 1, 0, NULL, 0);
17823+
17824+
;
17825+
return 0;
17826+
}
17827+
_ACEOF
17828+
if ac_fn_c_try_link "$LINENO"; then :
17829+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
17830+
$as_echo "yes" >&6; }
17831+
else
17832+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
17833+
$as_echo "no" >&6; }
17834+
fi
17835+
rm -f core conftest.err conftest.$ac_objext \
17836+
conftest$ac_exeext conftest.$ac_ext
17837+
LIBS="$save_LIBS"
17838+
CFLAGS="$save_CFLAGS"
17839+
LDFLAGS="$save_LDFLAGS"
17840+
1778117841
# ssl module default cipher suite string
1778217842

1778317843

configure.ac

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5831,6 +5831,48 @@ AS_CASE($with_openssl_rpath,
58315831
AC_MSG_RESULT($OPENSSL_RPATH)
58325832
AC_SUBST([OPENSSL_RPATH])
58335833

5834+
# check if OpenSSL libraries work as expected
5835+
AC_MSG_CHECKING(whether OpenSSL provides required APIs)
5836+
save_LIBS="$LIBS"
5837+
save_CFLAGS="$CFLAGS"
5838+
save_LDFLAGS="$LDFLAGS"
5839+
LIBS="$LIBS $OPENSSL_LIBS"
5840+
CFLAGS="$CFLAGS_NODIST $OPENSSL_INCLUDES"
5841+
LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS"
5842+
5843+
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
5844+
#include <openssl/opensslv.h>
5845+
#include <openssl/evp.h>
5846+
#include <openssl/ssl.h>
5847+
5848+
#if OPENSSL_VERSION_NUMBER < 0x10101000L
5849+
#error "OpenSSL >= 1.1.1 is required"
5850+
#endif
5851+
5852+
static void keylog_cb(const SSL *ssl, const char *line) {}
5853+
]], [[
5854+
/* SSL APIs */
5855+
SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
5856+
SSL_CTX_set_keylog_callback(ctx, keylog_cb);
5857+
SSL *ssl = SSL_new(ctx);
5858+
X509_VERIFY_PARAM *param = SSL_get0_param(ssl);
5859+
X509_VERIFY_PARAM_set1_host(param, "python.org", 0);
5860+
SSL_free(ssl);
5861+
SSL_CTX_free(ctx);
5862+
5863+
/* hashlib APIs */
5864+
OBJ_nid2sn(NID_md5);
5865+
OBJ_nid2sn(NID_sha1);
5866+
OBJ_nid2sn(NID_sha3_512);
5867+
OBJ_nid2sn(NID_blake2b512);
5868+
EVP_PBE_scrypt(NULL, 0, NULL, 0, 2, 8, 1, 0, NULL, 0);
5869+
]])],
5870+
[AC_MSG_RESULT(yes)],
5871+
[AC_MSG_RESULT(no)])
5872+
LIBS="$save_LIBS"
5873+
CFLAGS="$save_CFLAGS"
5874+
LDFLAGS="$save_LDFLAGS"
5875+
58345876
# ssl module default cipher suite string
58355877
AH_TEMPLATE(PY_SSL_DEFAULT_CIPHERS,
58365878
[Default cipher suites list for ssl module.

0 commit comments

Comments
 (0)