Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
	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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
	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
Ejemplo n.º 5
0
	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
Ejemplo n.º 6
0
	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
Ejemplo n.º 7
0
	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
Ejemplo n.º 8
0
    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