Skip to content

Commit 3af67ab

Browse files
Version 0.3.0 (#5)
* SubjectAtlName support
1 parent 743b8f4 commit 3af67ab

File tree

5 files changed

+75
-43
lines changed

5 files changed

+75
-43
lines changed

setup.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
from setuptools import setup, find_packages
22
import sys
33

4-
from pathlib import Path
5-
64

75
if sys.version_info < (3, 7):
86
sys.exit('Sorry, Python < 3.7 is not supported, upgrade your python installation to use tlspyo.')
@@ -14,8 +12,8 @@
1412

1513
setup(name='tlspyo',
1614
packages=[package for package in find_packages()],
17-
version='0.2.5',
18-
download_url='https://github.com/MISTLab/tls-python-object/archive/refs/tags/v0.2.5.tar.gz',
15+
version='0.3.0',
16+
download_url='https://github.com/MISTLab/tls-python-object/archive/refs/tags/v0.3.0.tar.gz',
1917
license='MIT',
2018
description='Secure transport of python objects using TLS encryption',
2119
long_description=long_description,

tlspyo/api.py

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ def __init__(self,
6767

6868
assert accepted_groups is None or isinstance(accepted_groups, dict), "Invalid format for accepted_groups."
6969

70-
self._stopped = False
7170
self._header_size = header_size
7271
self._local_com_port = local_com_port
7372
self._local_com_srv = socket(AF_INET, SOCK_STREAM)
@@ -93,6 +92,9 @@ def __init__(self,
9392
self._local_com_conn, self._local_com_addr = self._local_com_srv.accept()
9493
self._send_local('TEST')
9594

95+
self._stop_lock = Lock()
96+
self._stopped = False
97+
9698
def __del__(self):
9799
self.stop()
98100

@@ -105,14 +107,19 @@ def stop(self):
105107
"""
106108
Stop the Relay.
107109
"""
108-
if not self._stopped:
109-
self._stopped = True
110-
self._send_local('STOP')
110+
try:
111+
with self._stop_lock:
112+
if not self._stopped:
113+
self._send_local('STOP')
111114

112-
self._p.join()
113-
self._local_com_conn.close()
114-
self._local_com_srv.close()
115-
self._local_com_addr = None
115+
self._p.join()
116+
self._local_com_conn.close()
117+
self._local_com_srv.close()
118+
self._local_com_addr = None
119+
self._stopped = True
120+
except KeyboardInterrupt as e:
121+
self.stop()
122+
raise e
116123

117124

118125
class Endpoint:
@@ -172,8 +179,6 @@ def __init__(self,
172179
elif security == "SSL":
173180
security = "TLS"
174181

175-
self._stopped = False
176-
177182
# threading for local object receiving
178183
self.__obj_buffer = queue.Queue()
179184
self.__socket_closed_lock = Lock()
@@ -221,6 +226,9 @@ def __init__(self,
221226
self._t_manage_received_objects = Thread(target=self._manage_received_objects, daemon=True)
222227
self._t_manage_received_objects.start()
223228

229+
self._stop_lock = Lock()
230+
self._stopped = False
231+
224232
def __del__(self):
225233
self.stop()
226234

@@ -236,7 +244,6 @@ def _manage_received_objects(self):
236244
# Check if socket is still open
237245
with self.__socket_closed_lock:
238246
if self.__socket_closed_flag:
239-
self._local_com_conn.close()
240247
return
241248

242249
buf += self._local_com_conn.recv(self._max_buf_len)
@@ -357,22 +364,27 @@ def stop(self):
357364
"""
358365
Stop the Endpoint.
359366
"""
360-
if not self._stopped:
361-
self._stopped = True
362-
# send STOP to the local server
363-
self._send_local(cmd='STOP', dest=None, obj=None)
367+
try:
368+
with self._stop_lock:
369+
if not self._stopped:
370+
# send STOP to the local server
371+
self._send_local(cmd='STOP', dest=None, obj=None)
364372

365-
# Join the message reading thread
366-
with self.__socket_closed_lock:
367-
self.__socket_closed_flag = True
368-
self._t_manage_received_objects.join()
373+
# Join the message reading thread
374+
with self.__socket_closed_lock:
375+
self.__socket_closed_flag = True
376+
self._t_manage_received_objects.join()
369377

370-
# join Twisted process and stop local server
371-
self._p.join()
378+
# join Twisted process and stop local server
379+
self._p.join()
372380

373-
self._local_com_conn.close()
374-
self._local_com_srv.close()
375-
self._local_com_addr = None
381+
self._local_com_conn.close()
382+
self._local_com_srv.close()
383+
self._local_com_addr = None
384+
self._stopped = True
385+
except KeyboardInterrupt as e:
386+
self.stop()
387+
raise e
376388

377389
def _process_received_list(self, received_list):
378390
if self._deserialize_locally:

tlspyo/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def dataReceived(self, data):
4949
stamp, cmd, obj = self._client.deserializer(self._buffer[i:j])
5050
if cmd == 'ACK':
5151
try:
52-
logger.info(f"ACK received after {time.monotonic() - self._client.pending_acks[stamp][0]}s.")
52+
logger.debug(f"ACK received after {time.monotonic() - self._client.pending_acks[stamp][0]}s.")
5353
del self._client.pending_acks[stamp] # delete pending ACK
5454
except KeyError:
5555
logger.warning(f"Received ACK for stamp {stamp} not present in pending ACKs.")

tlspyo/credentials.py

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def generate_tls_credentials(
2828
folder_path,
2929
email_address="emailAddress",
3030
common_name="default",
31+
subject_alt_name=('DNS:default',),
3132
country_name="CA",
3233
locality_name="localityName",
3334
state_or_province_name="stateOrProvinceName",
@@ -42,6 +43,7 @@ def generate_tls_credentials(
4243
folder_path (path-like object): path were the files will be created
4344
email_address (str): your email address
4445
common_name (str): your hostname
46+
subject_alt_name (tuple of str): your subject alt name list
4547
country_name (str): your country code
4648
locality_name (str): your locality name
4749
state_or_province_name (str): your state name
@@ -57,18 +59,26 @@ def generate_tls_credentials(
5759
k = crypto.PKey()
5860
k.generate_key(crypto.TYPE_RSA, 4096)
5961
cert = crypto.X509()
60-
cert.get_subject().C = country_name
61-
cert.get_subject().ST = state_or_province_name
62-
cert.get_subject().L = locality_name
63-
cert.get_subject().O = organization_name
64-
cert.get_subject().OU = organization_unit_name
65-
cert.get_subject().CN = common_name
66-
cert.get_subject().emailAddress = email_address
67-
cert.set_serial_number(serial_number)
62+
63+
subject = cert.get_subject()
64+
subject.commonName = common_name
65+
subject.emailAddress = email_address
66+
subject.organizationName = organization_name
67+
subject.organizationalUnitName = organization_unit_name
68+
subject.localityName = locality_name
69+
subject.stateOrProvinceName = state_or_province_name
70+
subject.countryName = country_name
71+
72+
cert.set_issuer(subject)
6873
cert.gmtime_adj_notBefore(0)
6974
cert.gmtime_adj_notAfter(validity_end_in_seconds)
70-
cert.set_issuer(cert.get_subject())
7175
cert.set_pubkey(k)
76+
cert.set_serial_number(serial_number)
77+
cert.set_version(2) # for SAN
78+
cert.add_extensions([
79+
crypto.X509Extension(b'subjectAltName', False, ','.join(subject_alt_name).encode())
80+
])
81+
7282
cert.sign(k, 'sha512')
7383
with open(cert_file, "wt") as f:
7484
f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode("utf-8"))
@@ -87,6 +97,7 @@ def credentials_generator_tool(custom=False):
8797
folder_path = get_default_keys_folder()
8898
email_address = "emailAddress"
8999
common_name = "default"
100+
subject_alt_name = ["DNS:" + common_name]
90101
country_name = "CA"
91102
locality_name = "localityName"
92103
state_or_province_name = "stateOrProvinceName"
@@ -118,6 +129,16 @@ def credentials_generator_tool(custom=False):
118129
common_name = inp
119130
print(common_name)
120131

132+
subject_alt_name = ["DNS:" + common_name]
133+
print(f"\nSubject alternative name (hostnames, leave empty to stop adding) {subject_alt_name}:")
134+
inp = input()
135+
if inp != "":
136+
subject_alt_name = []
137+
while inp != "":
138+
subject_alt_name.append(inp)
139+
inp = input()
140+
print(subject_alt_name)
141+
121142
print(f"\nCountry code [{country_name}]:")
122143
inp = input()
123144
if inp != "":
@@ -163,6 +184,7 @@ def credentials_generator_tool(custom=False):
163184
generate_tls_credentials(folder_path=folder_path,
164185
email_address=email_address,
165186
common_name=common_name,
187+
subject_alt_name=tuple(subject_alt_name),
166188
country_name=country_name,
167189
locality_name=locality_name,
168190
state_or_province_name=state_or_province_name,

tlspyo/utils.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import signal
1+
# import signal
22
import queue
33

44

5-
try:
6-
signal.signal(signal.SIGINT, signal.SIG_DFL)
7-
except Exception as e:
8-
pass
5+
# try:
6+
# signal.signal(signal.SIGINT, signal.SIG_DFL)
7+
# except Exception as e:
8+
# pass
99

1010

1111
def wait_event(event):

0 commit comments

Comments
 (0)