-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathssl_psk.py
39 lines (31 loc) · 1014 Bytes
/
ssl_psk.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import ssl
import _ssl_psk
# memory leak!
_sslptr_to_psk = {}
def _psk_callback(ssl):
return _sslptr_to_psk[ssl]
_ssl_psk.set_python_psk_callback(_psk_callback)
def set_client_psk(ssl, psk):
ptr = _ssl_psk.set_psk_callback(ssl._sslobj)
_sslptr_to_psk[ptr] = psk
def set_server_psk(ssl, psk):
ptr = _ssl_psk.set_psk_server_callback(ssl._sslobj)
_sslptr_to_psk[ptr] = psk
def wrap_socket(*args, **kwargs):
psk = kwargs.setdefault('psk', None)
del kwargs['psk']
do_handshake_on_connect = kwargs.get('do_handshake_on_connect', True)
kwargs['do_handshake_on_connect'] = False
kwargs.setdefault('server_side', False)
server_side = kwargs['server_side']
if psk:
del kwargs['server_side'] # bypass need for cert
sock = ssl.wrap_socket(*args, **kwargs)
if psk:
if server_side:
set_server_psk(sock, psk)
else:
set_client_psk(sock, psk)
if do_handshake_on_connect:
sock.do_handshake()
return sock