Skip to content

Commit 39b058f

Browse files
gh-154053: Fix compilation of the ssl module against LibreSSL (GH-154054)
LibreSSL does not provide SSL_CTX_set1_sigalgs_list() or SSL_CTX_set1_client_sigalgs_list(), added in gh-138252, so _ssl failed to compile against LibreSSL on 3.15+. Guard the set_server_sigalgs() and set_client_sigalgs() methods so they raise NotImplementedError on LibreSSL, and skip the corresponding tests.
1 parent 30541f2 commit 39b058f

3 files changed

Lines changed: 24 additions & 1 deletion

File tree

Lib/test/test_ssl.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,15 @@
4949
PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
5050
HOST = socket_helper.HOST
5151
IS_AWS_LC = "AWS-LC" in ssl.OPENSSL_VERSION
52+
IS_LIBRESSL = "LibreSSL" in ssl.OPENSSL_VERSION
5253
IS_OPENSSL_3_0_0 = ssl.OPENSSL_VERSION_INFO >= (3, 0, 0)
5354
CAN_GET_SELECTED_OPENSSL_GROUP = ssl.OPENSSL_VERSION_INFO >= (3, 2)
5455
CAN_IGNORE_UNKNOWN_OPENSSL_GROUPS = ssl.OPENSSL_VERSION_INFO >= (3, 3)
5556
CAN_GET_AVAILABLE_OPENSSL_GROUPS = ssl.OPENSSL_VERSION_INFO >= (3, 5)
5657
CAN_GET_AVAILABLE_OPENSSL_SIGALGS = ssl.OPENSSL_VERSION_INFO >= (3, 4)
57-
CAN_SET_CLIENT_SIGALGS = not IS_AWS_LC
58+
# LibreSSL does not provide SSL_CTX_set1_(client_)sigalgs_list().
59+
CAN_SET_CLIENT_SIGALGS = not IS_AWS_LC and not IS_LIBRESSL
60+
CAN_SET_SERVER_SIGALGS = not IS_LIBRESSL
5861
CAN_IGNORE_UNKNOWN_OPENSSL_SIGALGS = ssl.OPENSSL_VERSION_INFO >= (3, 3)
5962
CAN_GET_SELECTED_OPENSSL_SIGALG = ssl.OPENSSL_VERSION_INFO >= (3, 5)
6063
PY_SSL_DEFAULT_CIPHERS = sysconfig.get_config_var('PY_SSL_DEFAULT_CIPHERS')
@@ -1080,6 +1083,8 @@ def test_set_client_sigalgs(self):
10801083
if CAN_IGNORE_UNKNOWN_OPENSSL_SIGALGS:
10811084
self.assertIsNone(ctx.set_client_sigalgs('rsa_pss_rsae_sha256:?foo'))
10821085

1086+
@unittest.skipUnless(CAN_SET_SERVER_SIGALGS,
1087+
"SSL library doesn't support setting server sigalgs")
10831088
def test_set_server_sigalgs(self):
10841089
ctx = ssl.create_default_context()
10851090

@@ -4593,6 +4598,8 @@ def test_client_sigalgs_mismatch(self):
45934598
chatty=True, connectionchatty=True,
45944599
sni_name=hostname)
45954600

4601+
@unittest.skipUnless(CAN_SET_SERVER_SIGALGS,
4602+
"SSL library doesn't support setting server sigalgs")
45964603
def test_server_sigalgs(self):
45974604
# server rsa_pss_rsae_sha384, client auto
45984605
sigalg = "rsa_pss_rsae_sha384"
@@ -4613,6 +4620,8 @@ def test_server_sigalgs(self):
46134620
if CAN_GET_SELECTED_OPENSSL_SIGALG:
46144621
self.assertEqual(stats['server_sigalg'], sigalg)
46154622

4623+
@unittest.skipUnless(CAN_SET_SERVER_SIGALGS,
4624+
"SSL library doesn't support setting server sigalgs")
46164625
def test_server_sigalgs_mismatch(self):
46174626
client_context, server_context, hostname = testing_context()
46184627
client_context.set_server_sigalgs("rsa_pss_rsae_sha256")
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Fix compilation of the :mod:`ssl` module against LibreSSL, which does not
2+
provide ``SSL_CTX_set1_sigalgs_list()`` and ``SSL_CTX_set1_client_sigalgs_list()``.
3+
The :meth:`!set_server_sigalgs` and :meth:`!set_client_sigalgs` methods of
4+
:class:`ssl.SSLContext` now raise :exc:`NotImplementedError` on LibreSSL.

Modules/_ssl.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3863,6 +3863,10 @@ _ssl__SSLContext_set_client_sigalgs_impl(PySSLContext *self,
38633863
#ifdef OPENSSL_IS_AWSLC
38643864
_setSSLError(get_state_ctx(self), "can't set client sigalgs on AWS-LC", 0, __FILE__, __LINE__);
38653865
return NULL;
3866+
#elif defined(LIBRESSL_VERSION_NUMBER)
3867+
PyErr_SetString(PyExc_NotImplementedError,
3868+
"setting client sigalgs is not supported by LibreSSL");
3869+
return NULL;
38663870
#else
38673871
if (!SSL_CTX_set1_client_sigalgs_list(self->ctx, sigalgslist)) {
38683872
_setSSLError(get_state_ctx(self), "unrecognized signature algorithm", 0, __FILE__, __LINE__);
@@ -3884,11 +3888,17 @@ _ssl__SSLContext_set_server_sigalgs_impl(PySSLContext *self,
38843888
const char *sigalgslist)
38853889
/*[clinic end generated code: output=31ecb1d310285644 input=653b752e4f8d801b]*/
38863890
{
3891+
#ifdef LIBRESSL_VERSION_NUMBER
3892+
PyErr_SetString(PyExc_NotImplementedError,
3893+
"setting server sigalgs is not supported by LibreSSL");
3894+
return NULL;
3895+
#else
38873896
if (!SSL_CTX_set1_sigalgs_list(self->ctx, sigalgslist)) {
38883897
_setSSLError(get_state_ctx(self), "unrecognized signature algorithm", 0, __FILE__, __LINE__);
38893898
return NULL;
38903899
}
38913900
Py_RETURN_NONE;
3901+
#endif
38923902
}
38933903

38943904
static int

0 commit comments

Comments
 (0)