Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for querying the negotiated TLS version. The Quickening #244

Merged
merged 18 commits into from
May 30, 2015
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
2015-05-27 Jim Shaver <dcypherd@gmail.com>

* OpenSSL/SSL.py, : Add ``get_protocol_version()`` and
``get_protocol_version_name()`` to Connection
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’d like Connection to be in `` too. Also please add some periods after sentences. :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on work from Rich Moore
* OpenSSL/test/test_crypto.py: tests for ``get_protocol_version()``
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just add OpenSSL/test/test_crypto.py to the list above. it’s implicit that we add tests for new code. :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and ``get_protocol_version_name()``

2015-05-02 Jim Shaver <dcypherd@gmail.com>

* .travis.yml, setup.py, tox.ini: Removed support for Python 3.2.
Expand Down
23 changes: 23 additions & 0 deletions OpenSSL/SSL.py
Original file line number Diff line number Diff line change
Expand Up @@ -1883,6 +1883,18 @@ def get_cipher_version(self):
return version.decode("utf-8")


def get_protocol_version_name(self):
"""
Obtain the protocol version of the current connection.

:returns: The TLS version of the current connection, for example
the value for TLS 1.2 would be ``b'TLSv1.2'``.
:rtype: :py:class:`unicode`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe that’s not true anymore?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

208438c now bytes

"""
version = _ffi.string(_lib.SSL_get_version(self._ssl))
return version


@_requires_npn
def get_next_proto_negotiated(self):
"""
Expand Down Expand Up @@ -1938,6 +1950,17 @@ def get_alpn_proto_negotiated(self):
return _ffi.buffer(data[0], data_len[0])[:]


def get_protocol_version(self):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please group those two methods together

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved in 208438c

"""
Obtain the protocol version of the current connection.

:returns: The TLS version of the current connection, for example
the value for TLS 1.2 would be 0x303.
:rtype: :py:class:`int`
"""
version = _lib.SSL_version(self._ssl)
return version

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this needs three empty lines

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are three lines at the bottom, it has been moved 208438c


ConnectionType = Connection

Expand Down
29 changes: 29 additions & 0 deletions OpenSSL/test/test_ssl.py
Original file line number Diff line number Diff line change
Expand Up @@ -2745,6 +2745,35 @@ def test_get_cipher_bits(self):
self.assertEqual(server_cipher_bits, client_cipher_bits)


def test_get_protocol_version_name(self):
"""
:py:obj:`Connection.get_protocol_version_name()` returns a string
giving the protocol version of the current connection.
"""
server, client = self._loopback()
client_protocol_version_name = client.get_protocol_version_name()
server_protocol_version_name = server.get_protocol_version_name()

self.assertIsInstance(server_protocol_version_name, bytes)
self.assertIsInstance(client_protocol_version_name, bytes)

self.assertEqual(server_protocol_version_name, client_protocol_version_name)


def test_get_protocol_version(self):
"""
:py:obj:`Connection.get_protocol_version()` returns an integer
giving the protocol version of the current connection.
"""
server, client = self._loopback()
client_protocol_version = client.get_protocol_version()
server_protocol_version = server.get_protocol_version()

self.assertIsInstance(server_protocol_version, int)
self.assertIsInstance(client_protocol_version, int)

self.assertEqual(server_protocol_version, client_protocol_version)


class ConnectionGetCipherListTests(TestCase):
"""
Expand Down
16 changes: 16 additions & 0 deletions doc/api/ssl.rst
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,22 @@ Connection objects have the following methods:
but not it returns the entire list in one go.


.. py:method:: Connection.get_protocol_version()

Retrieve the version of the SSL or TLS protocol used by the Connection.
For example, it will return ``0x303`` for connections made over TLS
version 1.2, or ``Unknown`` for connections that were not successfully
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that seems unlikely :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed unknown in 208438c

established.


.. py:method:: Connection.get_protocol_version_name()

Retrieve the version of the SSL or TLS protocol used by the Connection.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

“…as an unicode string.” would be nice to differentiate it from the other method, no?

For example, it will return ``TLSv1`` in bytes for connections made over
TLS version 1, or ``Unknown`` for connections that were not successfully
established.


.. py:method:: Connection.get_client_ca_list()

Retrieve the list of preferred client certificate issuers sent by the server
Expand Down