예제 #1
0
        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);
        }
예제 #2
0
        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);
        }