def encode_shader(shader): shader_size = len(shader) shader_hash = Math.hash_bkdr(shader) print(shader_size, shader_hash) print('-------------------------------------------') print(shader) print('-------------------------------------------') encrypt_keys = b'shader' encrypt_klen = len(encrypt_keys) hexes, array = '', [] for i in range(shader_size): s = '0x%x' % (ord(shader[i]) ^ encrypt_keys[i % encrypt_klen]) array.append(s) hexes += s + ',' if (i + 1) % 32 == 0: hexes += '\n' encrypt_size = len(array) hexes = Bit.bytes2hex(encrypt_keys) + Bit.bytes2hex( Bit.u32_bytes(shader_hash)) + Bit.bytes2hex( Bit.u32_bytes(encrypt_size)) + '\n' + hexes[0:-1] encrypt_size += 14 # magic + hash + length print(('[%d]={\n' % encrypt_size) + hexes + '\n};') print('-------------------------------------------') shader = '' for c in array: shader += chr(int(c, 16)) print(shader) print('-------------------------------------------')
def _gen_header(self, filenum): header = bytearray() if self._blurer is None: header.append(0) else: self._blurer.submit(header) header.extend(Bit.u16_bytes(self._hseed)) header.extend(Bit.u16_bytes(filenum)) for hashcode in self._hashmap: info = self._hashmap[hashcode] header.extend(Bit.u32_bytes(hashcode)) header.extend(Bit.u32_bytes(info[0])) header.extend(Bit.u32_bytes(info[1])) return header
def _build(self, source, fillmb): taglist = self._load_taglist(source) filenum = len(taglist) assert filenum <= 0xFFFF, 'file nums exceeds %u' % 0xFFFF self._hashmap = {} self._fp.write(self._magic) self._fp.write(b'0000') if fillmb > 0: self._filler = AssetBuilder.Filler(fillmb, filenum + 2) self._filler.consume(self._fp) for tag in taglist: self._add_file(tag, os.path.join(source, tag)) offset = self._fp.tell() print('header offset:', offset) self._fp.seek(len(self._magic)) self._fp.write(Bit.u32_bytes(offset)) self._fp.seek(offset) self._fp.write(self._gen_header(filenum)) if self._filler is not None: self._filler.consume(self._fp)
def submit(self, buffer): # 将加密信息记录到资源包 buffer.append(self._keylen) buffer.extend(self._key) buffer.extend(Bit.u32_bytes(self._let))