Skip to content

Commit f0e41da

Browse files
committed
bpo-45847: Port _ssl and _hashlib to PY_STDLIB_MOD
Signed-off-by: Christian Heimes <[email protected]>
1 parent b48ac6f commit f0e41da

File tree

4 files changed

+348
-157
lines changed

4 files changed

+348
-157
lines changed

Modules/Setup.stdlib.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@
121121
#
122122
@MODULE__SQLITE3_TRUE@_sqlite3 _sqlite/connection.c _sqlite/cursor.c _sqlite/microprotocols.c _sqlite/module.c _sqlite/prepare_protocol.c _sqlite/row.c _sqlite/statement.c _sqlite/util.c
123123

124+
# needs -lssl and -lcrypt
125+
@MODULE__SSL_TRUE@_ssl _ssl.c
126+
# needs -lcrypt
127+
@MODULE__HASHLIB_TRUE@_hashlib _hashopenssl.c
128+
124129

125130
############################################################################
126131
# macOS specific modules

configure

Lines changed: 243 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,10 @@ MODULE__TESTINTERNALCAPI_FALSE
642642
MODULE__TESTINTERNALCAPI_TRUE
643643
MODULE__TESTCAPI_FALSE
644644
MODULE__TESTCAPI_TRUE
645+
MODULE__HASHLIB_FALSE
646+
MODULE__HASHLIB_TRUE
647+
MODULE__SSL_FALSE
648+
MODULE__SSL_TRUE
645649
MODULE__LZMA_FALSE
646650
MODULE__LZMA_TRUE
647651
MODULE__BZ2_FALSE
@@ -20134,6 +20138,16 @@ rm -f core conftest.err conftest.$ac_objext \
2013420138

2013520139

2013620140
# rpath to libssl and libcrypto
20141+
if test "x$GNULD" = xyes; then :
20142+
20143+
rpath_arg="-Wl,--enable-new-dtags,-rpath="
20144+
20145+
else
20146+
20147+
rpath_arg="-Wl,-rpath="
20148+
20149+
fi
20150+
2013720151
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-openssl-rpath" >&5
2013820152
$as_echo_n "checking for --with-openssl-rpath... " >&6; }
2013920153

@@ -20147,12 +20161,26 @@ fi
2014720161

2014820162
case $with_openssl_rpath in #(
2014920163
auto|yes) :
20150-
OPENSSL_RPATH=auto ;; #(
20164+
20165+
OPENSSL_RPATH=auto
20166+
for arg in "$OPENSSL_LDFLAGS"; do
20167+
case $arg in #(
20168+
-L*) :
20169+
OPENSSL_LDFLAGS_RPATH="$OPENSSL_LDFLAGS_RPATH ${rpath_arg}$(echo $arg | cut -c3-)"
20170+
;; #(
20171+
*) :
20172+
;;
20173+
esac
20174+
done
20175+
;; #(
2015120176
no) :
2015220177
OPENSSL_RPATH= ;; #(
2015320178
*) :
2015420179
if test -d "$with_openssl_rpath"; then :
20155-
OPENSSL_RPATH="$with_openssl_rpath"
20180+
20181+
OPENSSL_RPATH="$with_openssl_rpath"
20182+
OPENSSL_LDFLAGS_RPATH="${rpath_arg}$with_openssl_rpath"
20183+
2015620184
else
2015720185
as_fn_error $? "--with-openssl-rpath \"$with_openssl_rpath\" is not a directory" "$LINENO" 5
2015820186
fi
@@ -20163,71 +20191,163 @@ esac
2016320191
$as_echo "$OPENSSL_RPATH" >&6; }
2016420192

2016520193

20194+
# This static linking is NOT OFFICIALLY SUPPORTED and not advertised.
20195+
# Requires static OpenSSL build with position-independent code. Some features
20196+
# like DSO engines or external OSSL providers don't work. Only tested with GCC
20197+
# and clang on X86_64.
20198+
if test "x$PY_UNSUPPORTED_OPENSSL_BUILD" = xstatic; then :
20199+
20200+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsupported static openssl build" >&5
20201+
$as_echo_n "checking for unsupported static openssl build... " >&6; }
20202+
new_OPENSSL_LIBS=
20203+
for arg in $OPENSSL_LIBS; do
20204+
case $arg in #(
20205+
-l*) :
20206+
20207+
libname=$(echo $arg | cut -c3-)
20208+
new_OPENSSL_LIBS="$new_OPENSSL_LIBS -l:lib${libname}.a -Wl,--exclude-libs,lib${libname}.a"
20209+
;; #(
20210+
*) :
20211+
new_OPENSSL_LIBS="$new_OPENSSL_LIBS $arg"
20212+
;;
20213+
esac
20214+
done
20215+
OPENSSL_LIBS="$new_OPENSSL_LIBS $ZLIB_LIBS"
20216+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPENSSL_LIBS" >&5
20217+
$as_echo "$OPENSSL_LIBS" >&6; }
20218+
20219+
fi
20220+
20221+
LIBCRYPTO_LIBS=
20222+
for arg in $OPENSSL_LIBS; do
20223+
case $arg in #(
20224+
-l*ssl*|-Wl*ssl*) :
20225+
;; #(
20226+
*) :
20227+
LIBCRYPTO_LIBS="$LIBCRYPTO_LIBS $arg"
20228+
;;
20229+
esac
20230+
done
20231+
2016620232
# check if OpenSSL libraries work as expected
20167-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL provides required APIs" >&5
20168-
$as_echo_n "checking whether OpenSSL provides required APIs... " >&6; }
20169-
if ${ac_cv_working_openssl+:} false; then :
20233+
save_CFLAGS=$CFLAGS
20234+
save_CPPFLAGS=$CPPFLAGS
20235+
save_LDFLAGS=$LDFLAGS
20236+
save_LIBS=$LIBS
20237+
20238+
20239+
LIBS="$LIBS $OPENSSL_LIBS"
20240+
CFLAGS="$CFLAGS $OPENSSL_INCLUDES"
20241+
LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH"
20242+
20243+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL provides required ssl module APIs" >&5
20244+
$as_echo_n "checking whether OpenSSL provides required ssl module APIs... " >&6; }
20245+
if ${ac_cv_working_openssl_ssl+:} false; then :
2017020246
$as_echo_n "(cached) " >&6
2017120247
else
2017220248

20173-
save_LIBS="$LIBS"
20174-
save_CFLAGS="$CFLAGS"
20175-
save_LDFLAGS="$LDFLAGS"
20176-
LIBS="$LIBS $OPENSSL_LIBS"
20177-
CFLAGS="$CFLAGS_NODIST $OPENSSL_INCLUDES"
20178-
LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS"
20179-
20180-
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
20249+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
2018120250
/* end confdefs.h. */
2018220251

20183-
#include <openssl/opensslv.h>
20184-
#include <openssl/evp.h>
20185-
#include <openssl/ssl.h>
20252+
#include <openssl/opensslv.h>
20253+
#include <openssl/ssl.h>
20254+
#if OPENSSL_VERSION_NUMBER < 0x10101000L
20255+
#error "OpenSSL >= 1.1.1 is required"
20256+
#endif
20257+
static void keylog_cb(const SSL *ssl, const char *line) {}
2018620258

20187-
#if OPENSSL_VERSION_NUMBER < 0x10101000L
20188-
#error "OpenSSL >= 1.1.1 is required"
20189-
#endif
20259+
int
20260+
main ()
20261+
{
20262+
20263+
SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
20264+
SSL_CTX_set_keylog_callback(ctx, keylog_cb);
20265+
SSL *ssl = SSL_new(ctx);
20266+
X509_VERIFY_PARAM *param = SSL_get0_param(ssl);
20267+
X509_VERIFY_PARAM_set1_host(param, "python.org", 0);
20268+
SSL_free(ssl);
20269+
SSL_CTX_free(ctx);
20270+
20271+
;
20272+
return 0;
20273+
}
20274+
_ACEOF
20275+
if ac_fn_c_try_link "$LINENO"; then :
20276+
ac_cv_working_openssl_ssl=yes
20277+
else
20278+
ac_cv_working_openssl_ssl=no
20279+
fi
20280+
rm -f core conftest.err conftest.$ac_objext \
20281+
conftest$ac_exeext conftest.$ac_ext
20282+
20283+
fi
20284+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_openssl_ssl" >&5
20285+
$as_echo "$ac_cv_working_openssl_ssl" >&6; }
20286+
20287+
CFLAGS=$save_CFLAGS
20288+
CPPFLAGS=$save_CPPFLAGS
20289+
LDFLAGS=$save_LDFLAGS
20290+
LIBS=$save_LIBS
20291+
20292+
20293+
20294+
save_CFLAGS=$CFLAGS
20295+
save_CPPFLAGS=$CPPFLAGS
20296+
save_LDFLAGS=$LDFLAGS
20297+
save_LIBS=$LIBS
20298+
20299+
20300+
LIBS="$LIBS $LIBCRYPTO_LIBS"
20301+
CFLAGS="$CFLAGS $OPENSSL_INCLUDES"
20302+
LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH"
20303+
20304+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL provides required hashlib module APIs" >&5
20305+
$as_echo_n "checking whether OpenSSL provides required hashlib module APIs... " >&6; }
20306+
if ${ac_cv_working_openssl_hashlib+:} false; then :
20307+
$as_echo_n "(cached) " >&6
20308+
else
20309+
20310+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
20311+
/* end confdefs.h. */
2019020312

20191-
static void keylog_cb(const SSL *ssl, const char *line) {}
20313+
#include <openssl/opensslv.h>
20314+
#include <openssl/evp.h>
20315+
#if OPENSSL_VERSION_NUMBER < 0x10101000L
20316+
#error "OpenSSL >= 1.1.1 is required"
20317+
#endif
2019220318

2019320319
int
2019420320
main ()
2019520321
{
2019620322

20197-
/* SSL APIs */
20198-
SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
20199-
SSL_CTX_set_keylog_callback(ctx, keylog_cb);
20200-
SSL *ssl = SSL_new(ctx);
20201-
X509_VERIFY_PARAM *param = SSL_get0_param(ssl);
20202-
X509_VERIFY_PARAM_set1_host(param, "python.org", 0);
20203-
SSL_free(ssl);
20204-
SSL_CTX_free(ctx);
20205-
20206-
/* hashlib APIs */
20207-
OBJ_nid2sn(NID_md5);
20208-
OBJ_nid2sn(NID_sha1);
20209-
OBJ_nid2sn(NID_sha3_512);
20210-
OBJ_nid2sn(NID_blake2b512);
20211-
EVP_PBE_scrypt(NULL, 0, NULL, 0, 2, 8, 1, 0, NULL, 0);
20323+
OBJ_nid2sn(NID_md5);
20324+
OBJ_nid2sn(NID_sha1);
20325+
OBJ_nid2sn(NID_sha3_512);
20326+
OBJ_nid2sn(NID_blake2b512);
20327+
EVP_PBE_scrypt(NULL, 0, NULL, 0, 2, 8, 1, 0, NULL, 0);
2021220328

2021320329
;
2021420330
return 0;
2021520331
}
2021620332
_ACEOF
2021720333
if ac_fn_c_try_link "$LINENO"; then :
20218-
ac_cv_working_openssl=yes
20334+
ac_cv_working_openssl_hashlib=yes
2021920335
else
20220-
ac_cv_working_openssl=no
20336+
ac_cv_working_openssl_hashlib=no
2022120337
fi
2022220338
rm -f core conftest.err conftest.$ac_objext \
2022320339
conftest$ac_exeext conftest.$ac_ext
20224-
LIBS="$save_LIBS"
20225-
CFLAGS="$save_CFLAGS"
20226-
LDFLAGS="$save_LDFLAGS"
2022720340

2022820341
fi
20229-
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_openssl" >&5
20230-
$as_echo "$ac_cv_working_openssl" >&6; }
20342+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_openssl_hashlib" >&5
20343+
$as_echo "$ac_cv_working_openssl_hashlib" >&6; }
20344+
20345+
CFLAGS=$save_CFLAGS
20346+
CPPFLAGS=$save_CPPFLAGS
20347+
LDFLAGS=$save_LDFLAGS
20348+
LIBS=$save_LIBS
20349+
20350+
2023120351

2023220352
# ssl module default cipher suite string
2023320353

@@ -21601,6 +21721,79 @@ $as_echo "$py_cv_module__lzma" >&6; }
2160121721

2160221722

2160321723

21724+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _ssl" >&5
21725+
$as_echo_n "checking for stdlib extension module _ssl... " >&6; }
21726+
case $py_stdlib_not_available in #(
21727+
*_ssl*) :
21728+
py_cv_module__ssl=n/a ;; #(
21729+
*) :
21730+
if true; then :
21731+
if test "$ac_cv_working_openssl_ssl" = yes; then :
21732+
py_cv_module__ssl=yes
21733+
else
21734+
py_cv_module__ssl=missing
21735+
fi
21736+
else
21737+
py_cv_module__ssl=disabled
21738+
fi
21739+
;;
21740+
esac
21741+
as_fn_append MODULE_BLOCK "MODULE__SSL=$py_cv_module__ssl$as_nl"
21742+
if test "x$py_cv_module__ssl" = xyes; then :
21743+
21744+
as_fn_append MODULE_BLOCK "MODULE__SSL_CFLAGS=$OPENSSL_INCLUDES$as_nl"
21745+
as_fn_append MODULE_BLOCK "MODULE__SSL_LDFLAGS=$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $OPENSSL_LIBS$as_nl"
21746+
21747+
fi
21748+
if test "$py_cv_module__ssl" = yes; then
21749+
MODULE__SSL_TRUE=
21750+
MODULE__SSL_FALSE='#'
21751+
else
21752+
MODULE__SSL_TRUE='#'
21753+
MODULE__SSL_FALSE=
21754+
fi
21755+
21756+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__ssl" >&5
21757+
$as_echo "$py_cv_module__ssl" >&6; }
21758+
21759+
21760+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _hashlib" >&5
21761+
$as_echo_n "checking for stdlib extension module _hashlib... " >&6; }
21762+
case $py_stdlib_not_available in #(
21763+
*_hashlib*) :
21764+
py_cv_module__hashlib=n/a ;; #(
21765+
*) :
21766+
if true; then :
21767+
if test "$ac_cv_working_openssl_hashlib" = yes; then :
21768+
py_cv_module__hashlib=yes
21769+
else
21770+
py_cv_module__hashlib=missing
21771+
fi
21772+
else
21773+
py_cv_module__hashlib=disabled
21774+
fi
21775+
;;
21776+
esac
21777+
as_fn_append MODULE_BLOCK "MODULE__HASHLIB=$py_cv_module__hashlib$as_nl"
21778+
if test "x$py_cv_module__hashlib" = xyes; then :
21779+
21780+
as_fn_append MODULE_BLOCK "MODULE__HASHLIB_CFLAGS=$OPENSSL_INCLUDES$as_nl"
21781+
as_fn_append MODULE_BLOCK "MODULE__HASHLIB_LDFLAGS=$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $LIBCRYPTO_LIBS$as_nl"
21782+
21783+
fi
21784+
if test "$py_cv_module__hashlib" = yes; then
21785+
MODULE__HASHLIB_TRUE=
21786+
MODULE__HASHLIB_FALSE='#'
21787+
else
21788+
MODULE__HASHLIB_TRUE='#'
21789+
MODULE__HASHLIB_FALSE=
21790+
fi
21791+
21792+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__hashlib" >&5
21793+
$as_echo "$py_cv_module__hashlib" >&6; }
21794+
21795+
21796+
2160421797
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _testcapi" >&5
2160521798
$as_echo_n "checking for stdlib extension module _testcapi... " >&6; }
2160621799
case $py_stdlib_not_available in #(
@@ -22278,6 +22471,14 @@ if test -z "${MODULE__LZMA_TRUE}" && test -z "${MODULE__LZMA_FALSE}"; then
2227822471
as_fn_error $? "conditional \"MODULE__LZMA\" was never defined.
2227922472
Usually this means the macro was only invoked conditionally." "$LINENO" 5
2228022473
fi
22474+
if test -z "${MODULE__SSL_TRUE}" && test -z "${MODULE__SSL_FALSE}"; then
22475+
as_fn_error $? "conditional \"MODULE__SSL\" was never defined.
22476+
Usually this means the macro was only invoked conditionally." "$LINENO" 5
22477+
fi
22478+
if test -z "${MODULE__HASHLIB_TRUE}" && test -z "${MODULE__HASHLIB_FALSE}"; then
22479+
as_fn_error $? "conditional \"MODULE__HASHLIB\" was never defined.
22480+
Usually this means the macro was only invoked conditionally." "$LINENO" 5
22481+
fi
2228122482
if test -z "${MODULE__TESTCAPI_TRUE}" && test -z "${MODULE__TESTCAPI_FALSE}"; then
2228222483
as_fn_error $? "conditional \"MODULE__TESTCAPI\" was never defined.
2228322484
Usually this means the macro was only invoked conditionally." "$LINENO" 5

0 commit comments

Comments
 (0)