def export_data(self, entrystore, password): "Exports data from an entrystore" # serialize data enc = locale.getpreferredencoding() db = "" iter = entrystore.iter_children(None) while iter is not None: e = entrystore.get_entry(iter) if type(e) != entry.FolderEntry: e = e.convert_generic() edata = "" edata += create_field( e.name.encode(enc, "replace") + "\xAD" + e[entry.UsernameField].encode("iso-8859-1")) edata += create_field(e[entry.PasswordField].encode( enc, "replace")) edata += create_field(e.description.encode(enc, "replace")) db += edata iter = entrystore.iter_traverse_next(iter) # encrypt data random = util.random_string(8) salt = util.random_string(20) iv = util.random_string(8) testhash = generate_testhash(password, random) ciphertext = encrypt(SHA(password + salt).digest(), db, iv) return random + testhash + salt + iv + ciphertext
def export_data(self, entrystore, password): "Exports data from an entrystore" # serialize data enc = locale.getpreferredencoding() db = "" iter = entrystore.iter_children(None) while iter is not None: e = entrystore.get_entry(iter) if type(e) != entry.FolderEntry: e = e.convert_generic() edata = "" edata += create_field(e.name.encode(enc, "replace") + "\xAD" + e[entry.UsernameField].encode("iso-8859-1")) edata += create_field(e[entry.PasswordField].encode(enc, "replace")) edata += create_field(e.description.encode(enc, "replace")) db += edata iter = entrystore.iter_traverse_next(iter) # encrypt data random = util.random_string(8) salt = util.random_string(20) iv = util.random_string(8) testhash = generate_testhash(password, random) ciphertext = encrypt(SHA(password + salt).digest(), db, iv) return random + testhash + salt + iv + ciphertext
def export_data(self, entrystore, password): "Exports data from an entrystore" # set up magic entry at start of database db = "" db += "\x48\x00\x00\x00\x00\x00\x00\x00" db += " !!!Version 2 File Format!!! Please upgrade to PasswordSafe 2.0 or later" db += "\x03\x00\x00\x00\x06\x00\x00\x00" db += "2.0\x00\x00\x00\x00\x00" db += "\x00\x00\x00\x00\x06\x00\x00\x00" db += "\x00\x00\x00\x00\x00\x00\x00\x00" # serialize data uuids = [] iter = entrystore.iter_children(None) enc = locale.getpreferredencoding() while iter is not None: e = entrystore.get_entry(iter) if type(e) != entry.FolderEntry: e = e.convert_generic() uuid = util.random_string(16) while uuid in uuids: uuid = util.random_string(16) edata = "" edata += create_field(uuid, FIELDTYPE_UUID) edata += create_field(self.__get_group(entrystore, iter), FIELDTYPE_GROUP) edata += create_field(e.name.encode(enc, "replace"), FIELDTYPE_TITLE) s = e[entry.UsernameField] if s is None: s = "" edata += create_field(s.encode(enc, "replace"), FIELDTYPE_USER) edata += create_field( e[entry.PasswordField].encode(enc, "replace"), FIELDTYPE_PASSWORD) edata += create_field(e.description.encode(enc, "replace"), FIELDTYPE_NOTES) edata += create_field("", FIELDTYPE_END) db += edata iter = entrystore.iter_traverse_next(iter) # encrypt data random = util.random_string(8) salt = util.random_string(20) iv = util.random_string(8) testhash = generate_testhash(password, random) ciphertext = encrypt(SHA(password + salt).digest(), db, iv) return random + testhash + salt + iv + ciphertext
def export_data(self, entrystore, password): "Exports data from an entrystore" # set up magic entry at start of database db = "" db += "\x48\x00\x00\x00\x00\x00\x00\x00" db += " !!!Version 2 File Format!!! Please upgrade to PasswordSafe 2.0 or later" db += "\x03\x00\x00\x00\x06\x00\x00\x00" db += "2.0\x00\x00\x00\x00\x00" db += "\x00\x00\x00\x00\x06\x00\x00\x00" db += "\x00\x00\x00\x00\x00\x00\x00\x00" # serialize data uuids = [] iter = entrystore.iter_children(None) enc = locale.getpreferredencoding() while iter is not None: e = entrystore.get_entry(iter) if type(e) != entry.FolderEntry: e = e.convert_generic() uuid = util.random_string(16) while uuid in uuids: uuid = util.random_string(16) edata = "" edata += create_field(uuid, FIELDTYPE_UUID) edata += create_field(self.__get_group(entrystore, iter), FIELDTYPE_GROUP) edata += create_field(e.name.encode(enc, "replace"), FIELDTYPE_TITLE) s = e[entry.UsernameField] if s is None: s = "" edata += create_field(s.encode(enc, "replace"), FIELDTYPE_USER) edata += create_field(e[entry.PasswordField].encode(enc, "replace"), FIELDTYPE_PASSWORD) edata += create_field(e.description.encode(enc, "replace"), FIELDTYPE_NOTES) edata += create_field("", FIELDTYPE_END) db += edata iter = entrystore.iter_traverse_next(iter) # encrypt data random = util.random_string(8) salt = util.random_string(20) iv = util.random_string(8) testhash = generate_testhash(password, random) ciphertext = encrypt(SHA(password + salt).digest(), db, iv) return random + testhash + salt + iv + ciphertext
def export_data(self, entrystore, password): "Exports data from an entrystore" # check and pad password if password is None: raise base.PasswordError password = util.pad_right(password[:32], 32, "\0") # generate XML data = RevelationXML.export_data(self, entrystore) # compress data, and right-pad with the repeated ascii # value of the pad length data = zlib.compress(data) padlen = 16 - (len(data) % 16) if padlen == 0: padlen = 16 data += chr(padlen) * padlen # generate an initial vector for the CBC encryption iv = util.random_string(16) # encrypt data AES.block_size = 16 AES.key_size = 32 data = AES.new(password, AES.MODE_CBC, iv).encrypt(data) # encrypt the iv, and prepend it to the data with a header data = self.__generate_header() + AES.new(password).encrypt(iv) + data return data
def __encrypt(self, cipher, data): "Encrypts data" # get data sizes blocks = (len(data) / 7) + 1 size = 8 * blocks # add noise data += "\x00" + util.random_string(size - len(data) - 1) # rotate data rotated = "" for block in range(blocks): for offset in range(8): rotated += data[offset * blocks + block] data = rotated # encrypt data data = cipher.encrypt(data) # ascii-armor data res = "" for i in range(len(data)): high = ord(data[i]) / 16 low = ord(data[i]) - high * 16 res += chr(ord("a") + high) + chr(ord("a") + low) data = res return data
def __encrypt(self, cipher, data): "Encrypts data" # get data sizes blocks = (old_div(len(data), 7)) + 1 size = 8 * blocks # add noise data += "\x00" + util.random_string(size - len(data) - 1) # rotate data rotated = "" for block in range(blocks): for offset in range(8): rotated += data[offset * blocks + block] data = rotated # encrypt data data = cipher.encrypt(data) # ascii-armor data res = "" for i in range(len(data)): high = old_div(ord(data[i]), 16) low = ord(data[i]) - high * 16 res += chr(ord("a") + high) + chr(ord("a") + low) data = res return data