static SpongeState Rho(SpongeState state) { var newState = new SpongeState(state.Size, state.Rate); var w = state.Size.W; newState.SetLane(newState.GetLane(0, 0), state.GetLane(0, 0).GetBits()); var x = 1; var y = 0; for (var t = 0; t < 24; t++) { var u = ((t + 1) * (t + 2)) >> 1; for (var z = 0; z < w; z++) { newState[x, y, z] = state[x, y, BinaryFunctions.Mod(z - u, w)]; } var oldX = x; x = y; y = BinaryFunctions.Mod(2 * oldX + 3 * y, 5); } state.SetBitString(newState.BitString); return(state); }
static SpongeState Pi(SpongeState state) { var newState = new SpongeState(state.Size, state.Rate); var w = state.Size.W; for (var y = 0; y < 5; y++) { for (var x = 0; x < 5; x++) { for (var z = 0; z < w; z++) { newState[x, y, z] = state[BinaryFunctions.Mod(x + 3 * y, 5), x, z]; } } } state.SetBitString(newState.BitString); return(state); }
static SpongeState Theta(SpongeState state) { var w = state.Size.W; var c = new bool[5, w]; for (var x = 0; x < 5; x++) { for (var z = 0; z < w; z++) { c[x, z] = state.GetColumn(x, z).GetBits().Aggregate((lhs, rhs) => lhs ^ rhs); } } var d = new bool[5, w]; for (var x = 0; x < 5; x++) { for (var z = 0; z < w; z++) { d[x, z] = c[BinaryFunctions.Mod(x - 1, 5), z] ^ c[BinaryFunctions.Mod(x + 1, 5), BinaryFunctions.Mod(z - 1, w)]; } } for (var x = 0; x < 5; x++) { for (var z = 0; z < w; z++) { var bit = d[x, z]; for (var y = 0; y < 5; y++) { state[x, y, z] ^= bit; } } } return(state); }
static SpongeState Iota(SpongeState state, int round) { var w = state.Size.W; var l = state.Size.L; var rc = BitString.Zeroes(w); int t; var rnd = 7 * round; for (var j = 0; j <= l; j++) { t = j + rnd; var roundT = new RoundT(round, t); if (!RoundTConstants.ContainsKey(roundT)) { RoundTConstants.Add(roundT, RoundConstant(t)); } rc[(1 << j) - 1] = RoundTConstants[roundT]; } state.XorLane(state.GetLane(0, 0), rc); return(state); }
internal Lane(SpongeState state, int x, int y) { State = state; X = x; Y = y; }
internal Sheet(SpongeState state, int x) { State = state; X = x; }
internal Slice(SpongeState state, int z) { State = state; Z = z; }
internal Column(SpongeState state, int x, int z) { State = state; X = x; Z = z; }
internal Row(SpongeState state, int y, int z) { State = state; Y = y; Z = z; }
internal Plane(SpongeState state, int y) { State = state; Y = y; }