def do_round(self, v, k): nv = 0 op = self.op_params[k] for i in range(0x20): b = v >> op.perm[i] & 1 nv = nv | (b << i) nv = nv ^ op.xorv nv = rotlu32(nv, op.shiftv) nv = modu32(nv + op.addv) return nv
def itsf(self, vals): res = [] for i in range(len(vals)): v = vals[i] for j in range(0x80): v = self.do_iround(v, i) v = modu32(v - self.op_params[i].add0) res.append(v) res[0] ^= res[2] res[1] ^= res[3] return res
def tsf(self, vals, nr=0x80): vals[0] ^= vals[2] vals[1] ^= vals[3] res = [] for i in range(len(vals)): v = vals[i] v = modu32(v + self.op_params[i].add0) for j in range(nr): v = self.do_round(v, i) res.append(v) return res
def do_iround(self, v, k): op = self.op_params[k] v = modu32(v - op.addv) v = rotlu32(v, -op.shiftv) v = v ^ op.xorv nv = 0 for i in range(0x20): b = v >> i & 1 nv = nv | (b << op.perm[i]) return nv
def find_s3(self, tb): need = modu32(-rotlu32(W1_CMP, -0x11) + (0xb00bface ^ tb[0] ^ tb[1])) need = need ^ 0xdeadbeef ^ tb[2] return need
def checksum(self, tb): v = (0xb00bface ^ tb[0] ^ tb[1]) - (0xdeadbeef ^ tb[2] ^ tb[3]) v = rotlu32(modu32(v), 0x11) return v