Skip to content

Commit 9f5a6a0

Browse files
authored
Merge pull request #123 from nabla-c0d3/pr-120
New method get_ems_support()
2 parents 8ccc613 + f9c6199 commit 9f5a6a0

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed

nassl/_nassl/nassl_SSL.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,12 @@ static PyObject* nassl_SSL_set1_groups(nassl_SSL_Object *self, PyObject *args)
304304
PyMem_Free(listOfNids);
305305
Py_RETURN_NONE;
306306
}
307+
308+
static PyObject *nassl_SSL_get_extms_support(nassl_SSL_Object *self)
309+
{
310+
long returnValue = SSL_get_extms_support(self->ssl);
311+
return Py_BuildValue("l", returnValue);
312+
}
307313
#endif
308314

309315
static PyObject* nassl_SSL_shutdown(nassl_SSL_Object *self, PyObject *args)
@@ -1187,6 +1193,9 @@ static PyMethodDef nassl_SSL_Object_methods[] =
11871193
{"set1_groups", (PyCFunction)nassl_SSL_set1_groups, METH_VARARGS,
11881194
"OpenSSL's SSL_set1_groups()"
11891195
},
1196+
{"get_extms_support", (PyCFunction)nassl_SSL_get_extms_support, METH_NOARGS,
1197+
"OpenSSL's SSL_get_extms_support()."
1198+
},
11901199
#endif
11911200
{"get_peer_cert_chain", (PyCFunction)nassl_SSL_get_peer_cert_chain, METH_NOARGS,
11921201
"OpenSSL's SSL_get_peer_cert_chain(). Returns an array of _nassl.X509 objects."

nassl/ssl_client.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,12 @@ class OpenSslEarlyDataStatusEnum(IntEnum):
418418
ACCEPTED = 2
419419

420420

421+
class ExtendedMasterSecretSupportEnum(IntEnum):
422+
NOT_USED_IN_CURRENT_SESSION = 0
423+
USED_IN_CURRENT_SESSION = 1
424+
UNKNOWN = -1
425+
426+
421427
class SslClient(BaseSslClient):
422428
"""High level API implementing an SSL client.
423429
@@ -465,3 +471,15 @@ def get_verified_chain(self) -> List[str]:
465471
raise CertificateChainVerificationFailed(verify_code)
466472

467473
return [x509.as_pem() for x509 in self._ssl.get0_verified_chain()]
474+
475+
def get_extended_master_secret_support(self) -> ExtendedMasterSecretSupportEnum:
476+
"""Indicates whether the current session used extended master secret."""
477+
support = self._ssl.get_extms_support()
478+
if support == 1:
479+
return ExtendedMasterSecretSupportEnum.USED_IN_CURRENT_SESSION
480+
elif support == 0:
481+
return ExtendedMasterSecretSupportEnum.NOT_USED_IN_CURRENT_SESSION
482+
elif support == -1:
483+
return ExtendedMasterSecretSupportEnum.UNKNOWN
484+
else:
485+
raise ValueError(f"Unexpected return value get_extms_support(): {support}")

tests/ssl_client_test.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from nassl.legacy_ssl_client import LegacySslClient
88
from nassl.ssl_client import (
99
ClientCertificateRequested,
10+
ExtendedMasterSecretSupportEnum,
1011
OpenSslVersionEnum,
1112
OpenSslVerifyEnum,
1213
SslClient,
@@ -359,6 +360,48 @@ def test_set_groups_curve_x448(self):
359360
assert dh_info.size == 448
360361
assert len(dh_info.public_bytes) == 56
361362

363+
def test_get_extended_master_secret_not_used(self):
364+
with LegacyOpenSslServer() as server:
365+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
366+
sock.settimeout(5)
367+
sock.connect((server.hostname, server.port))
368+
369+
ssl_client = SslClient(
370+
ssl_version=OpenSslVersionEnum.TLSV1_2,
371+
underlying_socket=sock,
372+
ssl_verify=OpenSslVerifyEnum.NONE,
373+
)
374+
exms_support_before_handshake = ssl_client.get_extended_master_secret_support()
375+
assert exms_support_before_handshake == ExtendedMasterSecretSupportEnum.UNKNOWN
376+
377+
try:
378+
ssl_client.do_handshake()
379+
finally:
380+
ssl_client.shutdown()
381+
382+
exms_support = ssl_client.get_extended_master_secret_support()
383+
assert exms_support == ExtendedMasterSecretSupportEnum.NOT_USED_IN_CURRENT_SESSION
384+
385+
def test_get_extended_master_secret_used(self):
386+
with ModernOpenSslServer() as server:
387+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
388+
sock.settimeout(5)
389+
sock.connect((server.hostname, server.port))
390+
391+
ssl_client = SslClient(
392+
ssl_version=OpenSslVersionEnum.TLSV1_2,
393+
underlying_socket=sock,
394+
ssl_verify=OpenSslVerifyEnum.NONE,
395+
)
396+
397+
try:
398+
ssl_client.do_handshake()
399+
finally:
400+
ssl_client.shutdown()
401+
402+
exms_support = ssl_client.get_extended_master_secret_support()
403+
assert exms_support == ExtendedMasterSecretSupportEnum.USED_IN_CURRENT_SESSION
404+
362405

363406
class TestLegacySslClientOnline:
364407
def test_ssl_2(self):

0 commit comments

Comments
 (0)