def keccak_f(state):
def round(A, RC):
W, H = state.W, state.H
rangeW, rangeH = state.rangeW, state.rangeH
lanew = state.lanew
zero = state.zero
# theta
C = [functools.reduce(xor, A[x]) for x in rangeW]
D = [0] * W
for x in rangeW:
D[x] = C[(x - 1) % W] ^ rol(C[(x + 1) % W], 1, lanew)
for y in rangeH:
A[x][y] ^= D[x]
# rho and pi
B = zero()
for x in rangeW:
for y in rangeH:
B[y % W][(2 * x + 3 * y) % H] = rol(A[x][y], RotationConstants[y][x], lanew)
# chi
for x in rangeW:
for y in rangeH:
A[x][y] = B[x][y] ^ ((~ B[(x + 1) % W][y]) & B[(x + 2) % W][y])
# iota
A[0][0] ^= RC
l = int(log(state.lanew, 2))
nr = 12 + 2 * l
for ir in range(nr):
round(state.s, RoundConstants[ir])
评论列表
文章目录