.. versionadded:: 3.13
+.. data:: HAS_PHA
+
+ Whether the OpenSSL library has built-in support for TLS-PHA.
+
+ .. versionadded:: next
+
.. data:: CHANNEL_BINDING_TYPES
List of supported TLS channel binding types. Strings in this list
(Contributed by Jelle Zijlstra in :gh:`101552`.)
+ssl
+---
+
+* Indicate through :data:`ssl.HAS_PHA` whether the :mod:`ssl` module supports
+ TLSv1.3 post-handshake client authentication (PHA).
+ (Contributed by Will Childs-Klein in :gh:`128036`.)
+
+
symtable
--------
from _ssl import (
HAS_SNI, HAS_ECDH, HAS_NPN, HAS_ALPN, HAS_SSLv2, HAS_SSLv3, HAS_TLSv1,
- HAS_TLSv1_1, HAS_TLSv1_2, HAS_TLSv1_3, HAS_PSK
+ HAS_TLSv1_1, HAS_TLSv1_2, HAS_TLSv1_3, HAS_PSK, HAS_PHA
)
from _ssl import _DEFAULT_CIPHERS, _OPENSSL_API_VERSION
def test_tls13_pha(self):
import ssl
- if not ssl.HAS_TLSv1_3:
- self.skipTest('TLS 1.3 support required')
+ if not ssl.HAS_TLSv1_3 or not ssl.HAS_PHA:
+ self.skipTest('TLS 1.3 PHA support required')
# just check status of PHA flag
h = client.HTTPSConnection('localhost', 443)
self.assertTrue(h._context.post_handshake_auth)
s.connect((HOST, server.port))
-@unittest.skipUnless(has_tls_version('TLSv1_3'), "Test needs TLS 1.3")
+@unittest.skipUnless(has_tls_version('TLSv1_3') and ssl.HAS_PHA,
+ "Test needs TLS 1.3 PHA")
class TestPostHandshakeAuth(unittest.TestCase):
def test_pha_setter(self):
protocols = [
--- /dev/null
+Indicate through :data:`ssl.HAS_PHA` whether the :mod:`ssl` module supports TLSv1.3 post-handshake client authentication (PHA). Patch by Will Childs-Klein.
addbool(m, "HAS_PSK", 1);
#endif
+#ifdef SSL_VERIFY_POST_HANDSHAKE
+ addbool(m, "HAS_PHA", 1);
+#else
+ addbool(m, "HAS_PHA", 0);
+#endif
+
#undef addbool
#undef ADD_INT_CONST