def open(self): """Open the keepass repository.""" if not PYKEEPASS: raise ImportError(name='pykeepass') try: self.keepass = PyKeePass(self.prefix, password=getpassword(self.prefix), keyfile=self.keyfile) except CredentialsIntegrityError as error: raise PMError(error)
def open(self): """Sign in to your Lastpass account.""" if self.prefix == '': raise PMError("Your Lastpass username is empty") status = [self._binary, 'status', '--quiet'] res, _, _ = self._call(status) if res: login = ['login', '--trust', '--color=never', self.prefix] password = getpassword('Lastpass') res = self._command(login, password)
def open(self): """Open the keepass repository.""" if not PYKEEPASS: raise ImportError(name='pykeepass') try: self.keepass = PyKeePass(self.prefix, password=getpassword(self.prefix), keyfile=self.keyfile) except (CredentialsError, PayloadChecksumError, HeaderChecksumError) as error: # pragma: no cover raise PMError(error)
def decrypt(self, jsons): """Import file is AES GCM encrypted, let's decrypt it. Based on the import script from Aegis: https://github.com/beemdevelopment/Aegis/blob/master/scripts/decrypt.py Format documentation: https://github.com/beemdevelopment/Aegis/blob/master/docs/vault.md """ if not CRYPTOGRAPHY: raise ImportError(name='cryptography') password = getpassword(self.prefix) master_key = None for slot in jsons['header']['slots']: if slot['type'] != 1: continue kdf = Scrypt(salt=bytes.fromhex(slot['salt']), length=32, n=slot['n'], r=slot['r'], p=slot['p'], backend=default_backend()) key = kdf.derive(password.encode("utf-8")) cipher = AESGCM(key) param = slot['key_params'] try: nonce = bytes.fromhex(param['nonce']) data = bytes.fromhex(slot['key']) + bytes.fromhex(param['tag']) master_key = cipher.decrypt(nonce=nonce, data=data, associated_data=None) except InvalidTag: # pragma: no cover pass if master_key is None: # pragma: no cover raise FormatError("unable to decrypt the master key.") cipher = AESGCM(master_key) param = jsons['header']['params'] content = base64.b64decode(jsons['db']) + bytes.fromhex(param['tag']) plain = cipher.decrypt(nonce=bytes.fromhex(param['nonce']), data=content, associated_data=None) return plain.decode('utf-8')