def decrypt(self, password: DecryptKey = None, private_key: DecryptKey = None) -> bytes: """ Decrypt data 1. decrypt key with private key (such as RSA) to a password 2. decrypt data with password (symmetric key, such as AES, DES, ...) :param password: symmetric key :param private_key: asymmetric private key :return: plaintext """ if self.__plaintext is None: # get symmetric key key = None if password is not None: assert isinstance( password, SymmetricKey), 'password error: %s' % password key = password elif private_key is not None: # assert isinstance(private_key, PrivateKey), 'private key error: %s' % private_key key_data = private_key.decrypt(self.key) key = SymmetricKey.parse(key=json_decode(data=key_data)) # get encrypted data data = self.data if key is not None and data is not None: self.__plaintext = key.decrypt(data=data) return self.__plaintext
def update_keys(self, key_map: dict) -> bool: """ Update cipher key table into memory cache :param key_map: cipher keys(with direction) from local storage :return: False on nothing changed """ changed = False for _from in key_map: sender = ID.parse(identifier=_from) table = key_map.get(_from) assert isinstance( table, dict), 'sender table error: %s, %s' % (_from, table) for _to in table: receiver = ID.parse(identifier=_to) pw = table.get(_to) key = SymmetricKey.parse(key=pw) # TODO: check whether exists an old key changed = True # cache key with direction self.__cache_cipher_key(key, sender, receiver) return changed