atomicshop 3.4.0__py3-none-any.whl → 3.4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of atomicshop might be problematic. Click here for more details.

atomicshop/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  """Atomic Basic functions and classes to make developer life easier"""
2
2
 
3
3
  __author__ = "Den Kras"
4
- __version__ = '3.4.0'
4
+ __version__ = '3.4.2'
@@ -502,6 +502,8 @@ def mitm_server(config_file_path: str, script_version: str):
502
502
  exceptions_logger_queue=EXCEPTIONS_CSV_LOGGER_QUEUE,
503
503
  forwarding_dns_service_ipv4_list___only_for_localhost=[config_static.DNSServer.forwarding_dns_service_ipv4],
504
504
  skip_extension_id_list=config_static.SkipExtensions.SKIP_EXTENSION_ID_LIST,
505
+ enable_sslkeylogfile_env_to_client_ssl_context=config_static.Certificates.enable_sslkeylogfile_env_to_client_ssl_context,
506
+ sslkeylog_file_path=config_static.Certificates.sslkeylog_file_path,
505
507
  print_kwargs=dict(stdout=False)
506
508
  )
507
509
 
@@ -30,7 +30,9 @@ class Certificator:
30
30
  custom_private_key_path: str,
31
31
  forwarding_dns_service_ipv4_list___only_for_localhost: list,
32
32
  skip_extension_id_list: list,
33
- tls: bool
33
+ tls: bool,
34
+ enable_sslkeylogfile_env_to_client_ssl_context: bool,
35
+ sslkeylog_file_path: str
34
36
  ):
35
37
  self.ca_certificate_name = ca_certificate_name
36
38
  self.ca_certificate_filepath = ca_certificate_filepath
@@ -49,6 +51,9 @@ class Certificator:
49
51
  forwarding_dns_service_ipv4_list___only_for_localhost)
50
52
  self.skip_extension_id_list = skip_extension_id_list
51
53
  self.tls = tls
54
+ self.enable_sslkeylogfile_env_to_client_ssl_context: bool = (
55
+ enable_sslkeylogfile_env_to_client_ssl_context)
56
+ self.sslkeylog_file_path: str = sslkeylog_file_path
52
57
 
53
58
  # noinspection PyTypeChecker
54
59
  self.certauth_wrapper: CertAuthWrapper = None
@@ -221,5 +226,10 @@ class Certificator:
221
226
 
222
227
  # You need to build new context and exchange the context that being inherited from the main socket,
223
228
  # or else the context will receive previous certificate each time.
224
- sni_received_parameters.ssl_socket.context = \
225
- creator.create_server_ssl_context___load_certificate_and_key(sni_server_certificate_file_path, None)
229
+ sni_received_parameters.ssl_socket.context = (
230
+ creator.create_server_ssl_context___load_certificate_and_key(
231
+ certificate_file_path=sni_server_certificate_file_path, key_file_path=None,
232
+ enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
233
+ sslkeylog_file_path=self.sslkeylog_file_path
234
+ )
235
+ )
@@ -25,7 +25,15 @@ def add_reusable_address_option(socket_instance):
25
25
  socket_instance.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
26
26
 
27
27
 
28
- def create_ssl_context_for_server(allow_legacy=False) -> ssl.SSLContext:
28
+ def create_ssl_context_for_server(
29
+ enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
30
+ sslkeylog_file_path: str = None,
31
+ allow_legacy: bool = False
32
+ ) -> ssl.SSLContext:
33
+ """
34
+ This function creates the SSL context for the server.
35
+ Meaning that your script will act like a server, and the client will connect to it.
36
+ """
29
37
  # Creating context with SSL certificate and the private key before the socket
30
38
  # https://docs.python.org/3/library/ssl.html
31
39
  # Creating context for SSL wrapper, specifying "PROTOCOL_TLS_SERVER" will pick the best TLS version protocol for
@@ -48,6 +56,15 @@ def create_ssl_context_for_server(allow_legacy=False) -> ssl.SSLContext:
48
56
  ssl_context.verify_mode = ssl.CERT_NONE
49
57
  ssl_context.check_hostname = False
50
58
 
59
+ if enable_sslkeylogfile_env_to_client_ssl_context:
60
+ if sslkeylog_file_path is None:
61
+ sslkeylog_file_path = os.environ.get('SSLKEYLOGFILE')
62
+
63
+ if not os.path.exists(sslkeylog_file_path):
64
+ open(sslkeylog_file_path, "a").close()
65
+
66
+ ssl_context.keylog_filename = sslkeylog_file_path
67
+
51
68
  # If you must support old clients that only offer TLS_RSA_* suites under OpenSSL 3:
52
69
  if allow_legacy:
53
70
  # This enables RSA key exchange and other legacy bits at security level 1
@@ -64,6 +81,7 @@ def create_ssl_context_for_client(
64
81
  ) -> ssl.SSLContext:
65
82
  """
66
83
  This function creates the SSL context for the client.
84
+ This means that your script will act like a client, and will connect to a server.
67
85
  The SSL context is created with the "PROTOCOL_TLS_CLIENT" protocol.
68
86
 
69
87
  :param enable_sslkeylogfile_env_to_client_ssl_context: boolean, enables the SSLKEYLOGFILE environment variable
@@ -83,9 +101,9 @@ def create_ssl_context_for_client(
83
101
  if sslkeylog_file_path is None:
84
102
  sslkeylog_file_path = os.environ.get('SSLKEYLOGFILE')
85
103
 
86
- # This will create the file if it doesn't exist
87
- open(sslkeylog_file_path, "a").close()
88
- ssl_context.keylog_filename = sslkeylog_file_path
104
+ if not os.path.exists(sslkeylog_file_path):
105
+ open(sslkeylog_file_path, "a").close()
106
+ ssl_context.keylog_filename = sslkeylog_file_path
89
107
 
90
108
  current_ciphers = 'AES256-GCM-SHA384:' + ssl._DEFAULT_CIPHERS
91
109
  ssl_context.set_ciphers(current_ciphers)
@@ -191,10 +209,14 @@ def copy_server_ctx_settings(src: ssl.SSLContext, dst: ssl.SSLContext) -> None:
191
209
  def create_server_ssl_context___load_certificate_and_key(
192
210
  certificate_file_path: str,
193
211
  key_file_path: str | None,
194
- inherit_from: ssl.SSLContext | None = None
212
+ inherit_from: ssl.SSLContext | None = None,
213
+ enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
214
+ sslkeylog_file_path: str = None,
195
215
  ) -> ssl.SSLContext:
196
216
  # Create and set ssl context for server.
197
- ssl_context: ssl.SSLContext = create_ssl_context_for_server(True)
217
+ ssl_context: ssl.SSLContext = create_ssl_context_for_server(
218
+ allow_legacy=True, enable_sslkeylogfile_env_to_client_ssl_context=enable_sslkeylogfile_env_to_client_ssl_context,
219
+ sslkeylog_file_path=sslkeylog_file_path)
198
220
 
199
221
  # If you replaced contexts during SNI, copy policy from the old one
200
222
  if inherit_from is not None:
@@ -47,7 +47,9 @@ class SNISetup:
47
47
  tls: bool,
48
48
  domain_from_dns_server: str = None,
49
49
  skip_extension_id_list: list = None,
50
- exceptions_logger: loggingw.ExceptionCsvLogger = None
50
+ exceptions_logger: loggingw.ExceptionCsvLogger = None,
51
+ enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
52
+ sslkeylog_file_path: str = None
51
53
  ):
52
54
  self.ca_certificate_name = ca_certificate_name
53
55
  self.ca_certificate_filepath = ca_certificate_filepath
@@ -74,6 +76,8 @@ class SNISetup:
74
76
  self.tls = tls
75
77
  self.exceptions_logger = exceptions_logger
76
78
  self.certificator_instance = None
79
+ self.enable_sslkeylogfile_env_to_client_ssl_context: bool = enable_sslkeylogfile_env_to_client_ssl_context
80
+ self.sslkeylog_file_path: str = sslkeylog_file_path
77
81
 
78
82
  def wrap_socket_with_ssl_context_server_sni_extended(
79
83
  self,
@@ -82,7 +86,9 @@ class SNISetup:
82
86
  ):
83
87
 
84
88
  # Create SSL Socket to wrap the raw socket with.
85
- ssl_context: ssl.SSLContext = creator.create_ssl_context_for_server(True)
89
+ ssl_context: ssl.SSLContext = creator.create_ssl_context_for_server(
90
+ allow_legacy=True, enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
91
+ sslkeylog_file_path=self.sslkeylog_file_path)
86
92
 
87
93
  self.certificator_instance = certificator.Certificator(
88
94
  ca_certificate_name=self.ca_certificate_name,
@@ -101,7 +107,9 @@ class SNISetup:
101
107
  forwarding_dns_service_ipv4_list___only_for_localhost=(
102
108
  self.forwarding_dns_service_ipv4_list___only_for_localhost),
103
109
  skip_extension_id_list=self.skip_extension_id_list,
104
- tls=self.tls
110
+ tls=self.tls,
111
+ enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
112
+ sslkeylog_file_path=self.sslkeylog_file_path
105
113
  )
106
114
 
107
115
  # Add SNI callback function to the SSL context.
@@ -160,7 +168,10 @@ class SNISetup:
160
168
  certificator_instance=self.certificator_instance,
161
169
  domain_from_dns_server=self.domain_from_dns_server,
162
170
  default_certificate_domain_list=self.default_certificate_domain_list,
163
- exceptions_logger=self.exceptions_logger )
171
+ exceptions_logger=self.exceptions_logger,
172
+ enable_sslkeylogfile_env_to_client_ssl_context=(
173
+ self.certificator_instance.enable_sslkeylogfile_env_to_client_ssl_context),
174
+ sslkeylog_file_path=self.certificator_instance.sslkeylog_file_path)
164
175
  ssl_context.set_servername_callback(
165
176
  sni_handler_instance.setup_sni_callback(print_kwargs=print_kwargs))
166
177
 
@@ -178,7 +189,9 @@ class SNIHandler:
178
189
  certificator_instance: certificator.Certificator,
179
190
  domain_from_dns_server: str,
180
191
  default_certificate_domain_list: list,
181
- exceptions_logger: loggingw.ExceptionCsvLogger
192
+ exceptions_logger: loggingw.ExceptionCsvLogger,
193
+ enable_sslkeylogfile_env_to_client_ssl_context: bool,
194
+ sslkeylog_file_path: str
182
195
  ):
183
196
  self.sni_use_default_callback_function_extended = sni_use_default_callback_function_extended
184
197
  self.sni_add_new_domains_to_default_server_certificate = sni_add_new_domains_to_default_server_certificate
@@ -187,6 +200,8 @@ class SNIHandler:
187
200
  self.domain_from_dns_server: str = domain_from_dns_server
188
201
  self.default_certificate_domain_list = default_certificate_domain_list
189
202
  self.exceptions_logger = exceptions_logger
203
+ self.enable_sslkeylogfile_env_to_client_ssl_context: bool = enable_sslkeylogfile_env_to_client_ssl_context
204
+ self.sslkeylog_file_path: str = sslkeylog_file_path
190
205
 
191
206
  # noinspection PyTypeChecker
192
207
  self.sni_received_parameters: SNIReceivedParameters = None
@@ -325,7 +340,9 @@ class SNIHandler:
325
340
  creator.create_server_ssl_context___load_certificate_and_key(
326
341
  default_server_certificate_path,
327
342
  None,
328
- inherit_from=self.sni_received_parameters.ssl_socket.context
343
+ inherit_from=self.sni_received_parameters.ssl_socket.context,
344
+ enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
345
+ sslkeylog_file_path=self.sslkeylog_file_path
329
346
  )
330
347
  )
331
348
  else:
@@ -1,6 +1,5 @@
1
1
  import multiprocessing
2
2
  import threading
3
- import time
4
3
 
5
4
  import select
6
5
  from typing import Literal, Union, Callable, Any
@@ -80,6 +79,8 @@ class SocketWrapper:
80
79
  statistics_logger_queue: multiprocessing.Queue = None,
81
80
  exceptions_logger_name: str = 'SocketWrapperExceptions',
82
81
  exceptions_logger_queue: multiprocessing.Queue = None,
82
+ enable_sslkeylogfile_env_to_client_ssl_context: bool = False,
83
+ sslkeylog_file_path: str = None,
83
84
  print_kwargs: dict = None,
84
85
  ):
85
86
  """
@@ -173,6 +174,12 @@ class SocketWrapper:
173
174
  :param exceptions_logger_name: string, name of the logger that will be used to log exceptions.
174
175
  :param exceptions_logger_queue: multiprocessing.Queue, queue that will be used to log exceptions in
175
176
  multiprocessing. You need to start the logger listener in the main process to handle the queue.
177
+ :param enable_sslkeylogfile_env_to_client_ssl_context: boolean, if True, each client SSL context
178
+ that will be created by the SocketWrapper will have save the SSL handshake keys to the file
179
+ defined in 'sslkeylog_file_path' parameter.
180
+ :param sslkeylog_file_path: string, path to file where SSL handshake keys will be saved.
181
+ If not provided and 'enable_sslkeylogfile_env_to_client_ssl_context' is True, then
182
+ the environment variable 'SSLKEYLOGFILE' will be used.
176
183
  :param print_kwargs: dict, additional arguments to pass to the print function.
177
184
  """
178
185
 
@@ -208,6 +215,9 @@ class SocketWrapper:
208
215
  self.ssh_script_to_execute = ssh_script_to_execute
209
216
  self.forwarding_dns_service_ipv4_list___only_for_localhost = (
210
217
  forwarding_dns_service_ipv4_list___only_for_localhost)
218
+ self.enable_sslkeylogfile_env_to_client_ssl_context: bool = (
219
+ enable_sslkeylogfile_env_to_client_ssl_context)
220
+ self.sslkeylog_file_path: str = sslkeylog_file_path
211
221
  self.print_kwargs: dict = print_kwargs
212
222
 
213
223
  self.socket_object = None
@@ -616,7 +626,9 @@ class SocketWrapper:
616
626
  forwarding_dns_service_ipv4_list___only_for_localhost=(
617
627
  self.forwarding_dns_service_ipv4_list___only_for_localhost),
618
628
  tls=is_tls,
619
- exceptions_logger=self.exceptions_logger
629
+ exceptions_logger=self.exceptions_logger,
630
+ enable_sslkeylogfile_env_to_client_ssl_context=self.enable_sslkeylogfile_env_to_client_ssl_context,
631
+ sslkeylog_file_path=self.sslkeylog_file_path
620
632
  )
621
633
 
622
634
  ssl_client_socket, accept_error_message = \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atomicshop
3
- Version: 3.4.0
3
+ Version: 3.4.2
4
4
  Summary: Atomic functions and classes to make developer life easier
5
5
  Author: Denis Kras
6
6
  License-Expression: MIT
@@ -1,4 +1,4 @@
1
- atomicshop/__init__.py,sha256=ixOmnAbr1hvPV-ANWmylWbdUrobDsVq3iPHZfp7dYM4,122
1
+ atomicshop/__init__.py,sha256=z6B8jy3rF9-QI0t-bMD5Kjc5FyXhKQba4P5WtIQrHhk,122
2
2
  atomicshop/_basics_temp.py,sha256=6cu2dd6r2dLrd1BRNcVDKTHlsHs_26Gpw8QS6v32lQ0,3699
3
3
  atomicshop/_create_pdf_demo.py,sha256=Yi-PGZuMg0RKvQmLqVeLIZYadqEZwUm-4A9JxBl_vYA,3713
4
4
  atomicshop/_patch_import.py,sha256=ENp55sKVJ0e6-4lBvZnpz9PQCt3Otbur7F6aXDlyje4,6334
@@ -130,7 +130,7 @@ atomicshop/mitm/connection_thread_worker.py,sha256=NPHizpPJOaYjP05EEGxEOOKHhgbe4
130
130
  atomicshop/mitm/import_config.py,sha256=7aLfKqflc3ZnzKc2_Y4T0eenzQpKG94M0r-PaVwF99M,18881
131
131
  atomicshop/mitm/initialize_engines.py,sha256=qzz5jzh_lKC03bI1w5ebngVXo1K-RV3poAyW-nObyqo,11042
132
132
  atomicshop/mitm/message.py,sha256=CDhhm4BTuZE7oNZCjvIZ4BuPOW4MuIzQLOg91hJaxDI,3065
133
- atomicshop/mitm/mitm_main.py,sha256=vjdK18ix3oH3thTgCi5qlAL13Bw_PgHaLGH2D9xic8w,40229
133
+ atomicshop/mitm/mitm_main.py,sha256=i0YcLDKAYH1aUS_Rf7IbwXiSQzndsdOY_JuYTvTiTN8,40453
134
134
  atomicshop/mitm/recs_files.py,sha256=tv8XFhYZMkBv4DauvpiAdPgvSo0Bcm1CghnmwO7dx8M,5018
135
135
  atomicshop/mitm/shared_functions.py,sha256=0lzeyINd44sVEfFbahJxQmz6KAMWbYrW5ou3UYfItvw,1777
136
136
  atomicshop/mitm/statistic_analyzer.py,sha256=EC9g21ocOsFzNfntV-nZHSGtrS1-Kxb0QDSGWS5FuNA,28942
@@ -298,24 +298,24 @@ atomicshop/wrappers/pywin32w/wmis/wmi_helpers.py,sha256=Ng5pbWeQBNcPqfFuxHEIdkIU
298
298
  atomicshop/wrappers/socketw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
299
  atomicshop/wrappers/socketw/accepter.py,sha256=4I9ORugRDvwaqSzm_gWSjZnRwQGY8hDTlCdsYHwH_ZE,2377
300
300
  atomicshop/wrappers/socketw/base.py,sha256=EcosGkD8VzgBY3GeIHDSG29ThQfXwg3-GQPmBTAqTdw,3048
301
- atomicshop/wrappers/socketw/certificator.py,sha256=mtWPJ_ew3OSwt0-1W4jaoco1VIY4NRCrMv3mDUxb_Cc,12418
302
- atomicshop/wrappers/socketw/creator.py,sha256=hHq8frKQtqZ1-Xfdm2kAsxqtsLFxXKDNwgGKdVKV6yg,16192
301
+ atomicshop/wrappers/socketw/certificator.py,sha256=mA78HXg6j_WKQ7D26Ue66QKA9y1Iu-EWsnc6cI6RC8w,12976
302
+ atomicshop/wrappers/socketw/creator.py,sha256=DpYzw45DDrHzdSPWt4k-k5ymxr2-91E14yofC4sQ9NM,17198
303
303
  atomicshop/wrappers/socketw/dns_server.py,sha256=UHq1a3NVdOrclEOOQIe-wNtIgbF8DFeNXsobvtoM1U8,55961
304
304
  atomicshop/wrappers/socketw/exception_wrapper.py,sha256=_p98OdOaKYSMqJ23pHLXBUA7NkbVmpgqcSJAdWr6wwc,7560
305
305
  atomicshop/wrappers/socketw/get_process.py,sha256=aJC-_qFUv3NgWCSUzDI72E4z8_-VTZE9NVZ0CwUoNlM,5698
306
306
  atomicshop/wrappers/socketw/receiver.py,sha256=9B3MvcDqr4C3x2fsnjG5SQognd1wRqsBgikxZa0wXG8,8243
307
307
  atomicshop/wrappers/socketw/sender.py,sha256=5ecHUlz4Sxt4oWevBFfy33jQLRXmmVLOF34njfvSbxY,4801
308
- atomicshop/wrappers/socketw/sni.py,sha256=uj6KKYKmSrzXcKBhVLaHQhYn1wNfIUpdnmcvn21V9iE,18176
308
+ atomicshop/wrappers/socketw/sni.py,sha256=-EnZwJJU35NZgYo6SyIr7tfM_ISCgb1ZDYXShYAO9bQ,19547
309
309
  atomicshop/wrappers/socketw/socket_client.py,sha256=WWIiCxUX9irN9aWzJ6-1xrXNB_iv_diq3ha1yrWsNGU,22671
310
310
  atomicshop/wrappers/socketw/socket_server_tester.py,sha256=Qobmh4XV8ZxLUaw-eW4ESKAbeSLecCKn2OWFzMhadk0,6420
311
- atomicshop/wrappers/socketw/socket_wrapper.py,sha256=abvs3Jb7PZ6H5il0Yto6gCLkwY5tD40f0GYOzZVb8ng,42581
311
+ atomicshop/wrappers/socketw/socket_wrapper.py,sha256=KdwZvATt7iEC2R0to9jcE0kBtG1cjcZwmF_cMn5fFms,43616
312
312
  atomicshop/wrappers/socketw/ssl_base.py,sha256=62-hPm7zla1rh3m_WvDnXqKH-sDUTdiRptD8STCkgdk,2313
313
313
  atomicshop/wrappers/socketw/statistics_csv.py,sha256=_gA8bMX6Sw_UCXKi2y9wNAwlqifgExgDGfQIa9pFxQA,5543
314
314
  atomicshop/wrappers/winregw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
315
315
  atomicshop/wrappers/winregw/winreg_installed_software.py,sha256=Qzmyktvob1qp6Tjk2DjLfAqr_yXV0sgWzdMW_9kwNjY,2345
316
316
  atomicshop/wrappers/winregw/winreg_network.py,sha256=ih0BVNwByLvf9F_Lac4EdmDYYJA3PzMvmG0PieDZrsE,9905
317
- atomicshop-3.4.0.dist-info/licenses/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
318
- atomicshop-3.4.0.dist-info/METADATA,sha256=7L3q8e0dAu6OukGb_M71h6kx-aLtHEr7E710wUkSUpI,9317
319
- atomicshop-3.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
320
- atomicshop-3.4.0.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
321
- atomicshop-3.4.0.dist-info/RECORD,,
317
+ atomicshop-3.4.2.dist-info/licenses/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
318
+ atomicshop-3.4.2.dist-info/METADATA,sha256=LSck6xzVp4t5nFs5mLWlM5-6NvidcN44oDJueNqU7sQ,9317
319
+ atomicshop-3.4.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
320
+ atomicshop-3.4.2.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
321
+ atomicshop-3.4.2.dist-info/RECORD,,