TLSharp.Core.MTProto.Crypto.AesEngine.EncryptBlock C# (CSharp) Method

EncryptBlock() private method

private EncryptBlock ( uint KW ) : void
KW uint
return void
        private void EncryptBlock(
            uint[,] KW)
        {
            uint r, r0, r1, r2, r3;

            C0 ^= KW[0, 0];
            C1 ^= KW[0, 1];
            C2 ^= KW[0, 2];
            C3 ^= KW[0, 3];

            for (r = 1; r < ROUNDS - 1;)
            {
                r0 = T0[C0 & 255] ^ Shift(T0[(C1 >> 8) & 255], 24) ^ Shift(T0[(C2 >> 16) & 255], 16) ^
                     Shift(T0[(C3 >> 24) & 255], 8) ^ KW[r, 0];
                r1 = T0[C1 & 255] ^ Shift(T0[(C2 >> 8) & 255], 24) ^ Shift(T0[(C3 >> 16) & 255], 16) ^
                     Shift(T0[(C0 >> 24) & 255], 8) ^ KW[r, 1];
                r2 = T0[C2 & 255] ^ Shift(T0[(C3 >> 8) & 255], 24) ^ Shift(T0[(C0 >> 16) & 255], 16) ^
                     Shift(T0[(C1 >> 24) & 255], 8) ^ KW[r, 2];
                r3 = T0[C3 & 255] ^ Shift(T0[(C0 >> 8) & 255], 24) ^ Shift(T0[(C1 >> 16) & 255], 16) ^
                     Shift(T0[(C2 >> 24) & 255], 8) ^ KW[r++, 3];
                C0 = T0[r0 & 255] ^ Shift(T0[(r1 >> 8) & 255], 24) ^ Shift(T0[(r2 >> 16) & 255], 16) ^
                     Shift(T0[(r3 >> 24) & 255], 8) ^ KW[r, 0];
                C1 = T0[r1 & 255] ^ Shift(T0[(r2 >> 8) & 255], 24) ^ Shift(T0[(r3 >> 16) & 255], 16) ^
                     Shift(T0[(r0 >> 24) & 255], 8) ^ KW[r, 1];
                C2 = T0[r2 & 255] ^ Shift(T0[(r3 >> 8) & 255], 24) ^ Shift(T0[(r0 >> 16) & 255], 16) ^
                     Shift(T0[(r1 >> 24) & 255], 8) ^ KW[r, 2];
                C3 = T0[r3 & 255] ^ Shift(T0[(r0 >> 8) & 255], 24) ^ Shift(T0[(r1 >> 16) & 255], 16) ^
                     Shift(T0[(r2 >> 24) & 255], 8) ^ KW[r++, 3];
            }

            r0 = T0[C0 & 255] ^ Shift(T0[(C1 >> 8) & 255], 24) ^ Shift(T0[(C2 >> 16) & 255], 16) ^
                 Shift(T0[(C3 >> 24) & 255], 8) ^ KW[r, 0];
            r1 = T0[C1 & 255] ^ Shift(T0[(C2 >> 8) & 255], 24) ^ Shift(T0[(C3 >> 16) & 255], 16) ^
                 Shift(T0[(C0 >> 24) & 255], 8) ^ KW[r, 1];
            r2 = T0[C2 & 255] ^ Shift(T0[(C3 >> 8) & 255], 24) ^ Shift(T0[(C0 >> 16) & 255], 16) ^
                 Shift(T0[(C1 >> 24) & 255], 8) ^ KW[r, 2];
            r3 = T0[C3 & 255] ^ Shift(T0[(C0 >> 8) & 255], 24) ^ Shift(T0[(C1 >> 16) & 255], 16) ^
                 Shift(T0[(C2 >> 24) & 255], 8) ^ KW[r++, 3];

            // the final round's table is a simple function of S so we don't use a whole other four tables for it

            C0 = S[r0 & 255] ^ (((uint)S[(r1 >> 8) & 255]) << 8) ^ (((uint)S[(r2 >> 16) & 255]) << 16) ^
                 (((uint)S[(r3 >> 24) & 255]) << 24) ^ KW[r, 0];
            C1 = S[r1 & 255] ^ (((uint)S[(r2 >> 8) & 255]) << 8) ^ (((uint)S[(r3 >> 16) & 255]) << 16) ^
                 (((uint)S[(r0 >> 24) & 255]) << 24) ^ KW[r, 1];
            C2 = S[r2 & 255] ^ (((uint)S[(r3 >> 8) & 255]) << 8) ^ (((uint)S[(r0 >> 16) & 255]) << 16) ^
                 (((uint)S[(r1 >> 24) & 255]) << 24) ^ KW[r, 2];
            C3 = S[r3 & 255] ^ (((uint)S[(r0 >> 8) & 255]) << 8) ^ (((uint)S[(r1 >> 16) & 255]) << 16) ^
                 (((uint)S[(r2 >> 24) & 255]) << 24) ^ KW[r, 3];
        }