Skip to content

Commit bb2c6b2

Browse files
authored
Merge pull request #53 from rizlik/support_version
SSLSocket: support version() method
2 parents 6ba654c + 4064227 commit bb2c6b2

File tree

5 files changed

+63
-0
lines changed

5 files changed

+63
-0
lines changed

tests/conftest.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import pytest
2828
import wolfssl
2929
from wolfssl._ffi import lib as _lib
30+
from wolfssltestserver import wolfSSLTestServer
3031

3132
@pytest.fixture
3233
def tcp_socket():
@@ -61,3 +62,15 @@ def ssl_context(ssl_provider, request):
6162
return ssl_provider.SSLContext(ssl_provider.PROTOCOL_TLSv1_3)
6263
if request.param == "SSLv23":
6364
return ssl_provider.SSLContext(ssl_provider.PROTOCOL_SSLv23)
65+
66+
port = 1110
67+
@pytest.fixture
68+
def ssl_server():
69+
from threading import Thread
70+
global port
71+
port += 1
72+
with wolfSSLTestServer(('localhost', port)) as server:
73+
t = Thread(target=server.handle_request)
74+
t.daemon = True
75+
t.start()
76+
yield server

tests/test_client.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
# pylint: disable=redefined-outer-name
2525

2626
import pytest
27+
import wolfssl
2728

2829
HOST = "www.python.org"
2930
PORT = 443
@@ -70,3 +71,21 @@ def test_secure_connection(secure_socket):
7071

7172
secure_socket.write(b"GET / HTTP/1.1\n\n")
7273
assert secure_socket.read(4) == b"HTTP"
74+
75+
@pytest.mark.parametrize("ssl_version",
76+
[pytest.param((wolfssl.PROTOCOL_TLSv1_1, "TLSv1.1"), id="TLSv1.1"),
77+
pytest.param((wolfssl.PROTOCOL_TLSv1_2, "TLSv1.2"), id="TLSv1.2"),
78+
pytest.param((wolfssl.PROTOCOL_TLSv1_3, "TLSv1.3"), id="TLSv1.3")])
79+
def test_get_version(ssl_server, ssl_version, tcp_socket):
80+
protocol = ssl_version[0]
81+
protocol_name = ssl_version[1]
82+
try:
83+
ssl_context = wolfssl.SSLContext(protocol)
84+
except ValueError:
85+
pytest.skip("Protocol {} not supported".format(protocol_name))
86+
return
87+
secure_socket = ssl_context.wrap_socket(tcp_socket)
88+
secure_socket.connect(('127.0.0.1', ssl_server.port))
89+
assert secure_socket.version() == protocol_name
90+
secure_socket.write(b'hello wolfssl')
91+
secure_socket.read(1024)

tests/wolfssltestserver.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from wolfssl import SSLContext, PROTOCOL_TLS, CERT_NONE
2+
from socketserver import TCPServer, BaseRequestHandler
3+
4+
ca_path = './certs/client-cert.pem'
5+
cert_path = './certs/server-cert.pem'
6+
key_path = './certs/server-key.pem'
7+
8+
class wolfSSLTestServer(TCPServer):
9+
class wolfSSLRequestHandler(BaseRequestHandler):
10+
def handle(self):
11+
ssl_socket = self.server.ctx.wrap_socket(self.request, server_side=True)
12+
ssl_socket.recv(1024)
13+
ssl_socket.sendall(b'I hear you fa shizzle!')
14+
ctx = None
15+
def __init__(self, address, version=PROTOCOL_TLS, ca=ca_path, cert=cert_path, key=key_path, verify=CERT_NONE):
16+
TCPServer.__init__(self, address, self.wolfSSLRequestHandler, bind_and_activate=False)
17+
self.allow_reuse_address = self.allow_reuse_port = True
18+
self.ctx = SSLContext(version, server_side=True)
19+
self.ctx.verify_mode = verify
20+
self.ctx.load_verify_locations(ca)
21+
self.ctx.load_cert_chain(cert, key)
22+
self.port = address[1]
23+
self.version = version
24+
self.server_bind()
25+
self.server_activate()

wolfssl/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,6 +857,11 @@ def getpeercert(self, binary_form=False):
857857

858858
return {'subject': ((('commonName', x509.get_subject_cn()),),),
859859
'subjectAltName': x509.get_altnames() }
860+
def version(self):
861+
"""
862+
Returns the version of the protocol used in the connection.
863+
"""
864+
return _ffi.string(_lib.wolfSSL_get_version(self.native_object)).decode("ascii")
860865

861866
# The following functions expose functionality of the underlying
862867
# Socket object. These are also exposed through Python's ssl module

wolfssl/_build_ffi.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ def generate_libwolfssl():
485485
void* wolfSSL_dtls_create_peer(int, char*);
486486
int wolfSSL_dtls_free_peer(void*);
487487
int wolfSSL_dtls_set_peer(WOLFSSL*, void*, unsigned int);
488+
const char* wolfSSL_get_version(const WOLFSSL*);
488489
489490
/*
490491
* WOLFSSL_X509 functions

0 commit comments

Comments
 (0)