def import_data(self, input, password): "Imports data into an entrystore" # check and pad password if password is None: raise base.PasswordError # check the data self.check(input) dataversion = self.__parse_header(input[:12]) # handle only version 2 data files if dataversion != 2: raise base.VersionError # Fetch the used 64 bit salt salt = input[12:20] iv = input[20:36] key = PBKDF2(password, salt, iterations=12000).read(32) # decrypt the data input = input[36:] if len(input) % 16 != 0: raise base.FormatError cipher = AES.new(key, AES.MODE_CBC, iv) input = cipher.decrypt(input) hash256 = input[0:32] data = input[32:] if hash256 != hashlib.sha256(data).digest(): raise base.PasswordError # decompress data padlen = ord(data[-1]) for i in data[-padlen:]: if ord(i) != padlen: raise base.FormatError data = zlib.decompress(data[0:-padlen]) # check and import data if data.strip()[:5] != "<?xml": raise base.FormatError entrystore = RevelationXML.import_data(self, data) return entrystore
def import_data(self, input, password): "Imports data into an entrystore" # check password if password is None: raise base.PasswordError # create a LuksFile buffer = StringIO.StringIO(input) luksfile = luks.LuksFile() try: luksfile.load_from_file(buffer) except: luksfile.close() buffer.close() raise base.FormatError slot = luksfile.open_any_key(password) if slot == None: luksfile.close() buffer.close() raise base.PasswordError data = luksfile.decrypt_data(0, luksfile.data_length()) # remove the pad, and decompress padlen = struct.unpack("<I", data[-4:])[0] data = zlib.decompress(data[0:-padlen]) if data.strip()[:5] != "<?xml": raise base.FormatError entrystore = RevelationXML.import_data(self, data) return entrystore