def extract_strings(data, keys): fd = BytesIO(keys) keys = [fd.read(16) for i in range(U8.read(fd))] if not keys: return fd = BytesIO(data) for i in range(U32LE.read(fd)): msg = fd.read(U32LE.read(fd)) key = keys[i % len(keys)] return Decryptor(key).decrypt(msg)
def read_tag(fd): header = U16LE.read(fd) tag_type = header >> 6 tag_length = header & 0x3f if tag_length == 0x3f: tag_length = U32LE.read(fd) tag_data = fd.read(tag_length) return Tag(tag_type, tag_data)