1616import json
1717import base64
1818import inspect
19- from pathlib import Path
20- from typing import Any , Dict , Optional
19+ from typing import Dict , Optional
2120
2221from cryptography .hazmat .primitives import serialization , hashes
2322from cryptography .hazmat .primitives .asymmetric import padding
2827from Framework .Built_In_Automation .Shared_Resources import BuiltInFunctionSharedResources as sr
2928
3029
30+ from settings import ZEUZ_NODE_PRIVATE_RSA_KEYS_DIR
31+
32+
3133MODULE_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 """
0 commit comments