Skip to content

Commit 8a66875

Browse files
committed
allow multiple private keys
1 parent 07e9e41 commit 8a66875

3 files changed

Lines changed: 48 additions & 31 deletions

File tree

Framework/Built_In_Automation/Shared_Resources/secrets.py

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616
import json
1717
import base64
1818
import inspect
19-
from pathlib import Path
20-
from typing import Any, Dict, Optional
19+
from typing import Dict, Optional
2120

2221
from cryptography.hazmat.primitives import serialization, hashes
2322
from cryptography.hazmat.primitives.asymmetric import padding
@@ -28,6 +27,9 @@
2827
from Framework.Built_In_Automation.Shared_Resources import BuiltInFunctionSharedResources as sr
2928

3029

30+
from settings import ZEUZ_NODE_PRIVATE_RSA_KEYS_DIR
31+
32+
3133
MODULE_NAME = inspect.getmodulename(__file__)
3234

3335

@@ -44,7 +46,7 @@ class Secret:
4446

4547
def __init__(self):
4648
self._cache: Dict[str, str] = {}
47-
self._private_key_path = Path.home() / "zeuz_node_downloads" / "private_key.pem"
49+
self._private_key_folder = ZEUZ_NODE_PRIVATE_RSA_KEYS_DIR
4850

4951
def __getitem__(self, key_name: str) -> str:
5052
"""
@@ -148,24 +150,32 @@ def __getitem__(self, key_name: str) -> str:
148150
raise KeyError(f"Failed to retrieve secret '{key_name}': {str(e)}")
149151

150152

151-
def _load_private_key(self):
153+
def _load_private_keys(self):
152154
sModuleInfo = inspect.currentframe().f_code.co_name + " : " + MODULE_NAME
153155

154156
try:
155-
if not self._private_key_path.exists():
157+
if not self._private_key_folder.exists():
156158
CommonUtil.ExecLog(
157159
sModuleInfo,
158-
f"Private key not found at {self._private_key_path}",
160+
f"Private key folder not found at {self._private_key_folder}",
159161
3
160162
)
161-
raise FileNotFoundError(f"Private key not found at {self._private_key_path}")
163+
raise FileNotFoundError(f"Private key folder not found at {self._private_key_folder}")
164+
165+
private_keys = []
166+
for pem_file in self._private_key_folder.glob("*.pem"):
167+
with open(pem_file, 'rb') as f:
168+
private_key = serialization.load_pem_private_key(f.read(), password=None)
169+
private_keys.append(private_key)
170+
171+
if not private_keys:
172+
raise FileNotFoundError(f"No .pem files found in {self._private_key_folder}")
162173

163-
with open(self._private_key_path, 'rb') as f:
164-
return serialization.load_pem_private_key(f.read(), password=None)
174+
return private_keys
165175
except Exception as e:
166176
CommonUtil.ExecLog(
167177
sModuleInfo,
168-
f"Failed to load private key: {str(e)}",
178+
f"Failed to load private keys: {str(e)}",
169179
3
170180
)
171181
raise
@@ -180,32 +190,38 @@ def _decrypt_data(self, encrypted_data: str) -> str:
180190
Returns:
181191
Decrypted plaintext string
182192
"""
183-
private_key = self._load_private_key()
193+
private_keys = self._load_private_keys()
184194

185195
decoded_data = base64.b64decode(encrypted_data)
186196
data = json.loads(decoded_data.decode('utf-8'))
187197

188198
encrypted_aes_key = base64.b64decode(data['encryptedKey'])
189-
aes_key = private_key.decrypt(
190-
encrypted_aes_key,
191-
padding.OAEP(
192-
mgf=padding.MGF1(algorithm=hashes.SHA256()),
193-
algorithm=hashes.SHA256(),
194-
label=None
195-
)
196-
)
197-
198199
iv = base64.b64decode(data['iv'])
199200
encrypted_content = base64.b64decode(data['encryptedData'])
200201

201-
cipher = Cipher(algorithms.AES(aes_key), modes.CBC(iv))
202-
decryptor = cipher.decryptor()
203-
decrypted_padded = decryptor.update(encrypted_content) + decryptor.finalize()
204-
205-
unpadder = PKCS7(128).unpadder()
206-
decrypted = unpadder.update(decrypted_padded) + unpadder.finalize()
202+
for private_key in private_keys:
203+
try:
204+
aes_key = private_key.decrypt(
205+
encrypted_aes_key,
206+
padding.OAEP(
207+
mgf=padding.MGF1(algorithm=hashes.SHA256()),
208+
algorithm=hashes.SHA256(),
209+
label=None
210+
)
211+
)
212+
213+
cipher = Cipher(algorithms.AES(aes_key), modes.CBC(iv))
214+
decryptor = cipher.decryptor()
215+
decrypted_padded = decryptor.update(encrypted_content) + decryptor.finalize()
216+
217+
unpadder = PKCS7(128).unpadder()
218+
decrypted = unpadder.update(decrypted_padded) + unpadder.finalize()
219+
220+
return decrypted.decode('utf-8')
221+
except Exception:
222+
continue
207223

208-
return decrypted.decode('utf-8')
224+
raise Exception("No private key could decrypt the data")
209225

210226
def clear_cache(self, key_name: Optional[str] = None):
211227
"""

Framework/Built_In_Automation/Web/Selenium/utils.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@
1818
import struct
1919
import urllib.request
2020
from rich.progress import Progress
21-
22-
23-
# ZeuZ Node Downloads base directory
24-
ZEUZ_NODE_DOWNLOADS_DIR = Path.home() / "zeuz_node_downloads"
21+
from settings import ZEUZ_NODE_DOWNLOADS_DIR
2522

2623

2724
class ChromeForTesting:

settings.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
# BASE_DIR or PROJECT_ROOT or Zeuz_Python_Node dir
88
PROJECT_ROOT = Path(__file__).parent
99

10+
ZEUZ_NODE_ARTIFACTS_DIR = Path.home() / "zeuz_node_artifacts"
11+
ZEUZ_NODE_DOWNLOADS_DIR = ZEUZ_NODE_ARTIFACTS_DIR / "zeuz_node_downloads"
12+
ZEUZ_NODE_PRIVATE_RSA_KEYS_DIR = ZEUZ_NODE_ARTIFACTS_DIR / "rsa_private_keys"
13+
1014
# AutomationLog dir
1115
AutomationLog_DIR = PROJECT_ROOT / "AutomationLog"
1216

0 commit comments

Comments
 (0)