Interface for the SSL_get_peer_finished, SSL_get_finished.
diff --git a/OpenSSL/SSL.py b/OpenSSL/SSL.py
index 67e4c82..e4d2d3b 100644
--- a/OpenSSL/SSL.py
+++ b/OpenSSL/SSL.py
@@ -1417,6 +1417,38 @@
if not result:
_raise_current_error()
+ def get_finished(self):
+ """
+ Obtain latest Finished message that we sent.
+
+ :return: A string representing the Finished message
+ """
+ # The size of Finished message is 12 bytes in TLS,
+ # 36 bytes in SSL protocol, but let's be safe with
+ # 128 bytes buffer
+ bufsiz = 128
+ buf = _ffi.new("char[]", bufsiz)
+ result = _lib.SSL_get_finished(self._ssl, buf, bufsiz)
+ if result == 0:
+ return None # no Finished so far
+ else:
+ return _ffi.buffer(buf, result)[:]
+
+ def get_peer_finished(self):
+ """
+ Obtain latest Finished message that we expected from peer.
+
+ :return: A string representing the Finished message
+ """
+ # Same buffer size as in get_finished
+ bufsiz = 128
+ buf = _ffi.new("char[]", bufsiz)
+ result = _lib.SSL_get_peer_finished(self._ssl, buf, bufsiz)
+ if result == 0:
+ return None # no Finished so far
+ else:
+ return _ffi.buffer(buf, result)[:]
+
ConnectionType = Connection
# This is similar to the initialization calls at the end of OpenSSL/crypto.py
diff --git a/OpenSSL/test/test_ssl.py b/OpenSSL/test/test_ssl.py
index a6f0127..8861972 100644
--- a/OpenSSL/test/test_ssl.py
+++ b/OpenSSL/test/test_ssl.py
@@ -1932,7 +1932,27 @@
# XXX want_read
+ def test_finished(self):
+ """
+ :py:obj:`Connection.get_finished` and :py:obj:`Connection.get_peer_finished`
+ methods return the TLS Finished messages. Finished messages are send
+ during TLS handshake. Before handshake :py:obj:`Connection.get_finished` and
+ :py:obj:`Connection.get_peer_finished` return None.
+ """
+ ctx = Context(TLSv1_METHOD)
+ connection = Connection(ctx, None)
+ self.assertEqual(connection.get_finished(), None)
+ self.assertEqual(connection.get_peer_finished(), None)
+
+ server, client = self._loopback()
+
+ self.assertNotEqual(server.get_finished(), None)
+ self.assertTrue(len(server.get_finished()) > 0)
+ self.assertTrue(len(server.get_peer_finished()) > 0)
+
+ self.assertEqual(server.get_finished(), client.get_peer_finished())
+ self.assertEqual(client.get_finished(), server.get_peer_finished())
class ConnectionGetCipherListTests(TestCase):
"""