private static SpongeState Pi(SpongeState state) { SpongeState newState = new SpongeState(state.Size, state.Rate); int w = state.Size.W; for (int y = 0; y < 5; y++) { for (int x = 0; x < 5; x++) { for (int z = 0; z < w; z++) { newState[x, y, z] = state[Bin.Mod(x + 3 * y, 5), x, z]; } } } state.SetBitstring(newState.Bitstring); return(state); }
private static SpongeState Khi(SpongeState state) { SpongeState newState = new SpongeState(state.Size, state.Rate); int w = state.Size.W; for (int y = 0; y < 5; y++) { for (int x = 0; x < 5; x++) { for (int z = 0; z < w; z++) { newState[x, y, z] = state[x, y, z] ^ ((state[Bin.Mod(x + 1, 5), y, z] ^ true) && state[Bin.Mod(x + 2, 5), y, z]); } } } state.SetBitstring(newState.Bitstring); return(state); }
private static SpongeState Rho(SpongeState state) { SpongeState newState = new SpongeState(state.Size, state.Rate); int w = state.Size.W; newState.SetLane(newState.GetLane(0, 0), state.GetLane(0, 0).GetBits()); int x = 1; int y = 0; int u, oldX; for (int t = 0; t < 24; t++) { u = ((t + 1) * (t + 2)) >> 1; for (int z = 0; z < w; z++) { newState[x, y, z] = state[x, y, Bin.Mod(z - u, w)]; } oldX = x; x = y; y = Bin.Mod(2 * oldX + 3 * y, 5); } state.SetBitstring(newState.Bitstring); return(state); }