Files
wolfssl/wolfcrypt/src/sha3_long.i
2017-10-22 15:58:35 -07:00

2344 lines
70 KiB
OpenEdge ABL

/* sha_long.i
*
* Copyright (C) 2006-2017 wolfSSL Inc.
*
* This file is part of wolfSSL.
*
* wolfSSL is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* wolfSSL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
*/
/* Rotate a 64-bit value left.
*
* a The number to rotate left.
* r The number od bits to rotate left.
* returns the rotated number.
*/
#define ROTL64(a, n) (((a)<<(n))|((a)>>(64-(n))))
/* The block operation performed on the state.
*
* s The state.
*/
static void BlockSha3(word64 *s)
{
word64 b[5], t;
/* Round 0. */
/* Col Mix */
b[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
b[1] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
b[2] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
b[3] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
b[4] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[5]^=t; s[10]^=t; s[15]^=t; s[20]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[1]^=t; s[6]^=t; s[11]^=t; s[16]^=t; s[21]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[2]^=t; s[7]^=t; s[12]^=t; s[17]^=t; s[22]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[3]^=t; s[8]^=t; s[13]^=t; s[18]^=t; s[23]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[4]^=t; s[9]^=t; s[14]^=t; s[19]^=t; s[24]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[6], 44);
b[2] = ROTL64(s[12], 43);
b[3] = ROTL64(s[18], 21);
b[4] = ROTL64(s[24], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[6] = t12 ^ (b[2] | b[3]);
s[12] = b[2] ^ (b[4] & t34);
s[18] = t34 ^ (b[4] | b[0]);
s[24] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[3], 28);
b[1] = ROTL64(s[9], 20);
b[2] = ROTL64(s[10], 3);
b[3] = ROTL64(s[16], 45);
b[4] = ROTL64(s[22], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[3] = b[0] ^ (b[2] & t12);
s[9] = t12 ^ (b[2] | b[3]);
s[10] = b[2] ^ (b[4] & t34);
s[16] = t34 ^ (b[4] | b[0]);
s[22] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[1], 1);
b[1] = ROTL64(s[7], 6);
b[2] = ROTL64(s[13], 25);
b[3] = ROTL64(s[19], 8);
b[4] = ROTL64(s[20], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[1] = b[0] ^ (b[2] & t12);
s[7] = t12 ^ (b[2] | b[3]);
s[13] = b[2] ^ (b[4] & t34);
s[19] = t34 ^ (b[4] | b[0]);
s[20] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[4], 27);
b[1] = ROTL64(s[5], 36);
b[2] = ROTL64(s[11], 10);
b[3] = ROTL64(s[17], 15);
b[4] = ROTL64(s[23], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[4] = b[0] ^ (b[2] & t12);
s[5] = t12 ^ (b[2] | b[3]);
s[11] = b[2] ^ (b[4] & t34);
s[17] = t34 ^ (b[4] | b[0]);
s[23] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[2], 62);
b[1] = ROTL64(s[8], 55);
b[2] = ROTL64(s[14], 39);
b[3] = ROTL64(s[15], 41);
b[4] = ROTL64(s[21], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[2] = b[0] ^ (b[2] & t12);
s[8] = t12 ^ (b[2] | b[3]);
s[14] = b[2] ^ (b[4] & t34);
s[15] = t34 ^ (b[4] | b[0]);
s[21] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x1UL;
/* Round 1. */
/* Col Mix */
b[0] = s[0] ^ s[1] ^ s[2] ^ s[3] ^ s[4];
b[1] = s[5] ^ s[6] ^ s[7] ^ s[8] ^ s[9];
b[2] = s[10] ^ s[11] ^ s[12] ^ s[13] ^ s[14];
b[3] = s[15] ^ s[16] ^ s[17] ^ s[18] ^ s[19];
b[4] = s[20] ^ s[21] ^ s[22] ^ s[23] ^ s[24];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[1]^=t; s[2]^=t; s[3]^=t; s[4]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[5]^=t; s[6]^=t; s[7]^=t; s[8]^=t; s[9]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[10]^=t; s[11]^=t; s[12]^=t; s[13]^=t; s[14]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[15]^=t; s[16]^=t; s[17]^=t; s[18]^=t; s[19]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[20]^=t; s[21]^=t; s[22]^=t; s[23]^=t; s[24]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[9], 44);
b[2] = ROTL64(s[13], 43);
b[3] = ROTL64(s[17], 21);
b[4] = ROTL64(s[21], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[9] = t12 ^ (b[2] | b[3]);
s[13] = b[2] ^ (b[4] & t34);
s[17] = t34 ^ (b[4] | b[0]);
s[21] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[18], 28);
b[1] = ROTL64(s[22], 20);
b[2] = ROTL64(s[1], 3);
b[3] = ROTL64(s[5], 45);
b[4] = ROTL64(s[14], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[18] = b[0] ^ (b[2] & t12);
s[22] = t12 ^ (b[2] | b[3]);
s[1] = b[2] ^ (b[4] & t34);
s[5] = t34 ^ (b[4] | b[0]);
s[14] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[6], 1);
b[1] = ROTL64(s[10], 6);
b[2] = ROTL64(s[19], 25);
b[3] = ROTL64(s[23], 8);
b[4] = ROTL64(s[2], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[6] = b[0] ^ (b[2] & t12);
s[10] = t12 ^ (b[2] | b[3]);
s[19] = b[2] ^ (b[4] & t34);
s[23] = t34 ^ (b[4] | b[0]);
s[2] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[24], 27);
b[1] = ROTL64(s[3], 36);
b[2] = ROTL64(s[7], 10);
b[3] = ROTL64(s[11], 15);
b[4] = ROTL64(s[15], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[24] = b[0] ^ (b[2] & t12);
s[3] = t12 ^ (b[2] | b[3]);
s[7] = b[2] ^ (b[4] & t34);
s[11] = t34 ^ (b[4] | b[0]);
s[15] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[12], 62);
b[1] = ROTL64(s[16], 55);
b[2] = ROTL64(s[20], 39);
b[3] = ROTL64(s[4], 41);
b[4] = ROTL64(s[8], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[12] = b[0] ^ (b[2] & t12);
s[16] = t12 ^ (b[2] | b[3]);
s[20] = b[2] ^ (b[4] & t34);
s[4] = t34 ^ (b[4] | b[0]);
s[8] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8082UL;
/* Round 2. */
/* Col Mix */
b[0] = s[0] ^ s[6] ^ s[12] ^ s[18] ^ s[24];
b[1] = s[3] ^ s[9] ^ s[10] ^ s[16] ^ s[22];
b[2] = s[1] ^ s[7] ^ s[13] ^ s[19] ^ s[20];
b[3] = s[4] ^ s[5] ^ s[11] ^ s[17] ^ s[23];
b[4] = s[2] ^ s[8] ^ s[14] ^ s[15] ^ s[21];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[6]^=t; s[12]^=t; s[18]^=t; s[24]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[3]^=t; s[9]^=t; s[10]^=t; s[16]^=t; s[22]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[1]^=t; s[7]^=t; s[13]^=t; s[19]^=t; s[20]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[4]^=t; s[5]^=t; s[11]^=t; s[17]^=t; s[23]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[2]^=t; s[8]^=t; s[14]^=t; s[15]^=t; s[21]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[22], 44);
b[2] = ROTL64(s[19], 43);
b[3] = ROTL64(s[11], 21);
b[4] = ROTL64(s[8], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[22] = t12 ^ (b[2] | b[3]);
s[19] = b[2] ^ (b[4] & t34);
s[11] = t34 ^ (b[4] | b[0]);
s[8] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[17], 28);
b[1] = ROTL64(s[14], 20);
b[2] = ROTL64(s[6], 3);
b[3] = ROTL64(s[3], 45);
b[4] = ROTL64(s[20], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[17] = b[0] ^ (b[2] & t12);
s[14] = t12 ^ (b[2] | b[3]);
s[6] = b[2] ^ (b[4] & t34);
s[3] = t34 ^ (b[4] | b[0]);
s[20] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[9], 1);
b[1] = ROTL64(s[1], 6);
b[2] = ROTL64(s[23], 25);
b[3] = ROTL64(s[15], 8);
b[4] = ROTL64(s[12], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[9] = b[0] ^ (b[2] & t12);
s[1] = t12 ^ (b[2] | b[3]);
s[23] = b[2] ^ (b[4] & t34);
s[15] = t34 ^ (b[4] | b[0]);
s[12] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[21], 27);
b[1] = ROTL64(s[18], 36);
b[2] = ROTL64(s[10], 10);
b[3] = ROTL64(s[7], 15);
b[4] = ROTL64(s[4], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[21] = b[0] ^ (b[2] & t12);
s[18] = t12 ^ (b[2] | b[3]);
s[10] = b[2] ^ (b[4] & t34);
s[7] = t34 ^ (b[4] | b[0]);
s[4] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[13], 62);
b[1] = ROTL64(s[5], 55);
b[2] = ROTL64(s[2], 39);
b[3] = ROTL64(s[24], 41);
b[4] = ROTL64(s[16], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[13] = b[0] ^ (b[2] & t12);
s[5] = t12 ^ (b[2] | b[3]);
s[2] = b[2] ^ (b[4] & t34);
s[24] = t34 ^ (b[4] | b[0]);
s[16] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x800000000000808aUL;
/* Round 3. */
/* Col Mix */
b[0] = s[0] ^ s[9] ^ s[13] ^ s[17] ^ s[21];
b[1] = s[1] ^ s[5] ^ s[14] ^ s[18] ^ s[22];
b[2] = s[2] ^ s[6] ^ s[10] ^ s[19] ^ s[23];
b[3] = s[3] ^ s[7] ^ s[11] ^ s[15] ^ s[24];
b[4] = s[4] ^ s[8] ^ s[12] ^ s[16] ^ s[20];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[9]^=t; s[13]^=t; s[17]^=t; s[21]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[1]^=t; s[5]^=t; s[14]^=t; s[18]^=t; s[22]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[2]^=t; s[6]^=t; s[10]^=t; s[19]^=t; s[23]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[3]^=t; s[7]^=t; s[11]^=t; s[15]^=t; s[24]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[4]^=t; s[8]^=t; s[12]^=t; s[16]^=t; s[20]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[14], 44);
b[2] = ROTL64(s[23], 43);
b[3] = ROTL64(s[7], 21);
b[4] = ROTL64(s[16], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[14] = t12 ^ (b[2] | b[3]);
s[23] = b[2] ^ (b[4] & t34);
s[7] = t34 ^ (b[4] | b[0]);
s[16] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[11], 28);
b[1] = ROTL64(s[20], 20);
b[2] = ROTL64(s[9], 3);
b[3] = ROTL64(s[18], 45);
b[4] = ROTL64(s[2], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[11] = b[0] ^ (b[2] & t12);
s[20] = t12 ^ (b[2] | b[3]);
s[9] = b[2] ^ (b[4] & t34);
s[18] = t34 ^ (b[4] | b[0]);
s[2] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[22], 1);
b[1] = ROTL64(s[6], 6);
b[2] = ROTL64(s[15], 25);
b[3] = ROTL64(s[4], 8);
b[4] = ROTL64(s[13], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[22] = b[0] ^ (b[2] & t12);
s[6] = t12 ^ (b[2] | b[3]);
s[15] = b[2] ^ (b[4] & t34);
s[4] = t34 ^ (b[4] | b[0]);
s[13] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[8], 27);
b[1] = ROTL64(s[17], 36);
b[2] = ROTL64(s[1], 10);
b[3] = ROTL64(s[10], 15);
b[4] = ROTL64(s[24], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[8] = b[0] ^ (b[2] & t12);
s[17] = t12 ^ (b[2] | b[3]);
s[1] = b[2] ^ (b[4] & t34);
s[10] = t34 ^ (b[4] | b[0]);
s[24] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[19], 62);
b[1] = ROTL64(s[3], 55);
b[2] = ROTL64(s[12], 39);
b[3] = ROTL64(s[21], 41);
b[4] = ROTL64(s[5], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[19] = b[0] ^ (b[2] & t12);
s[3] = t12 ^ (b[2] | b[3]);
s[12] = b[2] ^ (b[4] & t34);
s[21] = t34 ^ (b[4] | b[0]);
s[5] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000080008000UL;
/* Round 4. */
/* Col Mix */
b[0] = s[0] ^ s[8] ^ s[11] ^ s[19] ^ s[22];
b[1] = s[3] ^ s[6] ^ s[14] ^ s[17] ^ s[20];
b[2] = s[1] ^ s[9] ^ s[12] ^ s[15] ^ s[23];
b[3] = s[4] ^ s[7] ^ s[10] ^ s[18] ^ s[21];
b[4] = s[2] ^ s[5] ^ s[13] ^ s[16] ^ s[24];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[8]^=t; s[11]^=t; s[19]^=t; s[22]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[3]^=t; s[6]^=t; s[14]^=t; s[17]^=t; s[20]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[1]^=t; s[9]^=t; s[12]^=t; s[15]^=t; s[23]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[4]^=t; s[7]^=t; s[10]^=t; s[18]^=t; s[21]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[2]^=t; s[5]^=t; s[13]^=t; s[16]^=t; s[24]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[20], 44);
b[2] = ROTL64(s[15], 43);
b[3] = ROTL64(s[10], 21);
b[4] = ROTL64(s[5], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[20] = t12 ^ (b[2] | b[3]);
s[15] = b[2] ^ (b[4] & t34);
s[10] = t34 ^ (b[4] | b[0]);
s[5] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[7], 28);
b[1] = ROTL64(s[2], 20);
b[2] = ROTL64(s[22], 3);
b[3] = ROTL64(s[17], 45);
b[4] = ROTL64(s[12], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[7] = b[0] ^ (b[2] & t12);
s[2] = t12 ^ (b[2] | b[3]);
s[22] = b[2] ^ (b[4] & t34);
s[17] = t34 ^ (b[4] | b[0]);
s[12] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[14], 1);
b[1] = ROTL64(s[9], 6);
b[2] = ROTL64(s[4], 25);
b[3] = ROTL64(s[24], 8);
b[4] = ROTL64(s[19], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[14] = b[0] ^ (b[2] & t12);
s[9] = t12 ^ (b[2] | b[3]);
s[4] = b[2] ^ (b[4] & t34);
s[24] = t34 ^ (b[4] | b[0]);
s[19] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[16], 27);
b[1] = ROTL64(s[11], 36);
b[2] = ROTL64(s[6], 10);
b[3] = ROTL64(s[1], 15);
b[4] = ROTL64(s[21], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[16] = b[0] ^ (b[2] & t12);
s[11] = t12 ^ (b[2] | b[3]);
s[6] = b[2] ^ (b[4] & t34);
s[1] = t34 ^ (b[4] | b[0]);
s[21] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[23], 62);
b[1] = ROTL64(s[18], 55);
b[2] = ROTL64(s[13], 39);
b[3] = ROTL64(s[8], 41);
b[4] = ROTL64(s[3], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[23] = b[0] ^ (b[2] & t12);
s[18] = t12 ^ (b[2] | b[3]);
s[13] = b[2] ^ (b[4] & t34);
s[8] = t34 ^ (b[4] | b[0]);
s[3] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x808bUL;
/* Round 5. */
/* Col Mix */
b[0] = s[0] ^ s[7] ^ s[14] ^ s[16] ^ s[23];
b[1] = s[2] ^ s[9] ^ s[11] ^ s[18] ^ s[20];
b[2] = s[4] ^ s[6] ^ s[13] ^ s[15] ^ s[22];
b[3] = s[1] ^ s[8] ^ s[10] ^ s[17] ^ s[24];
b[4] = s[3] ^ s[5] ^ s[12] ^ s[19] ^ s[21];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[7]^=t; s[14]^=t; s[16]^=t; s[23]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[2]^=t; s[9]^=t; s[11]^=t; s[18]^=t; s[20]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[4]^=t; s[6]^=t; s[13]^=t; s[15]^=t; s[22]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[1]^=t; s[8]^=t; s[10]^=t; s[17]^=t; s[24]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[3]^=t; s[5]^=t; s[12]^=t; s[19]^=t; s[21]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[2], 44);
b[2] = ROTL64(s[4], 43);
b[3] = ROTL64(s[1], 21);
b[4] = ROTL64(s[3], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[2] = t12 ^ (b[2] | b[3]);
s[4] = b[2] ^ (b[4] & t34);
s[1] = t34 ^ (b[4] | b[0]);
s[3] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[10], 28);
b[1] = ROTL64(s[12], 20);
b[2] = ROTL64(s[14], 3);
b[3] = ROTL64(s[11], 45);
b[4] = ROTL64(s[13], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[10] = b[0] ^ (b[2] & t12);
s[12] = t12 ^ (b[2] | b[3]);
s[14] = b[2] ^ (b[4] & t34);
s[11] = t34 ^ (b[4] | b[0]);
s[13] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[20], 1);
b[1] = ROTL64(s[22], 6);
b[2] = ROTL64(s[24], 25);
b[3] = ROTL64(s[21], 8);
b[4] = ROTL64(s[23], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[20] = b[0] ^ (b[2] & t12);
s[22] = t12 ^ (b[2] | b[3]);
s[24] = b[2] ^ (b[4] & t34);
s[21] = t34 ^ (b[4] | b[0]);
s[23] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[5], 27);
b[1] = ROTL64(s[7], 36);
b[2] = ROTL64(s[9], 10);
b[3] = ROTL64(s[6], 15);
b[4] = ROTL64(s[8], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[5] = b[0] ^ (b[2] & t12);
s[7] = t12 ^ (b[2] | b[3]);
s[9] = b[2] ^ (b[4] & t34);
s[6] = t34 ^ (b[4] | b[0]);
s[8] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[15], 62);
b[1] = ROTL64(s[17], 55);
b[2] = ROTL64(s[19], 39);
b[3] = ROTL64(s[16], 41);
b[4] = ROTL64(s[18], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[15] = b[0] ^ (b[2] & t12);
s[17] = t12 ^ (b[2] | b[3]);
s[19] = b[2] ^ (b[4] & t34);
s[16] = t34 ^ (b[4] | b[0]);
s[18] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x80000001UL;
/* Round 6. */
/* Col Mix */
b[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
b[1] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
b[2] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
b[3] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
b[4] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[5]^=t; s[10]^=t; s[15]^=t; s[20]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[2]^=t; s[7]^=t; s[12]^=t; s[17]^=t; s[22]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[4]^=t; s[9]^=t; s[14]^=t; s[19]^=t; s[24]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[1]^=t; s[6]^=t; s[11]^=t; s[16]^=t; s[21]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[3]^=t; s[8]^=t; s[13]^=t; s[18]^=t; s[23]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[12], 44);
b[2] = ROTL64(s[24], 43);
b[3] = ROTL64(s[6], 21);
b[4] = ROTL64(s[18], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[12] = t12 ^ (b[2] | b[3]);
s[24] = b[2] ^ (b[4] & t34);
s[6] = t34 ^ (b[4] | b[0]);
s[18] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[1], 28);
b[1] = ROTL64(s[13], 20);
b[2] = ROTL64(s[20], 3);
b[3] = ROTL64(s[7], 45);
b[4] = ROTL64(s[19], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[1] = b[0] ^ (b[2] & t12);
s[13] = t12 ^ (b[2] | b[3]);
s[20] = b[2] ^ (b[4] & t34);
s[7] = t34 ^ (b[4] | b[0]);
s[19] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[2], 1);
b[1] = ROTL64(s[14], 6);
b[2] = ROTL64(s[21], 25);
b[3] = ROTL64(s[8], 8);
b[4] = ROTL64(s[15], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[2] = b[0] ^ (b[2] & t12);
s[14] = t12 ^ (b[2] | b[3]);
s[21] = b[2] ^ (b[4] & t34);
s[8] = t34 ^ (b[4] | b[0]);
s[15] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[3], 27);
b[1] = ROTL64(s[10], 36);
b[2] = ROTL64(s[22], 10);
b[3] = ROTL64(s[9], 15);
b[4] = ROTL64(s[16], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[3] = b[0] ^ (b[2] & t12);
s[10] = t12 ^ (b[2] | b[3]);
s[22] = b[2] ^ (b[4] & t34);
s[9] = t34 ^ (b[4] | b[0]);
s[16] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[4], 62);
b[1] = ROTL64(s[11], 55);
b[2] = ROTL64(s[23], 39);
b[3] = ROTL64(s[5], 41);
b[4] = ROTL64(s[17], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[4] = b[0] ^ (b[2] & t12);
s[11] = t12 ^ (b[2] | b[3]);
s[23] = b[2] ^ (b[4] & t34);
s[5] = t34 ^ (b[4] | b[0]);
s[17] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000080008081UL;
/* Round 7. */
/* Col Mix */
b[0] = s[0] ^ s[1] ^ s[2] ^ s[3] ^ s[4];
b[1] = s[10] ^ s[11] ^ s[12] ^ s[13] ^ s[14];
b[2] = s[20] ^ s[21] ^ s[22] ^ s[23] ^ s[24];
b[3] = s[5] ^ s[6] ^ s[7] ^ s[8] ^ s[9];
b[4] = s[15] ^ s[16] ^ s[17] ^ s[18] ^ s[19];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[1]^=t; s[2]^=t; s[3]^=t; s[4]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[10]^=t; s[11]^=t; s[12]^=t; s[13]^=t; s[14]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[20]^=t; s[21]^=t; s[22]^=t; s[23]^=t; s[24]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[5]^=t; s[6]^=t; s[7]^=t; s[8]^=t; s[9]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[15]^=t; s[16]^=t; s[17]^=t; s[18]^=t; s[19]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[13], 44);
b[2] = ROTL64(s[21], 43);
b[3] = ROTL64(s[9], 21);
b[4] = ROTL64(s[17], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[13] = t12 ^ (b[2] | b[3]);
s[21] = b[2] ^ (b[4] & t34);
s[9] = t34 ^ (b[4] | b[0]);
s[17] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[6], 28);
b[1] = ROTL64(s[19], 20);
b[2] = ROTL64(s[2], 3);
b[3] = ROTL64(s[10], 45);
b[4] = ROTL64(s[23], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[6] = b[0] ^ (b[2] & t12);
s[19] = t12 ^ (b[2] | b[3]);
s[2] = b[2] ^ (b[4] & t34);
s[10] = t34 ^ (b[4] | b[0]);
s[23] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[12], 1);
b[1] = ROTL64(s[20], 6);
b[2] = ROTL64(s[8], 25);
b[3] = ROTL64(s[16], 8);
b[4] = ROTL64(s[4], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[12] = b[0] ^ (b[2] & t12);
s[20] = t12 ^ (b[2] | b[3]);
s[8] = b[2] ^ (b[4] & t34);
s[16] = t34 ^ (b[4] | b[0]);
s[4] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[18], 27);
b[1] = ROTL64(s[1], 36);
b[2] = ROTL64(s[14], 10);
b[3] = ROTL64(s[22], 15);
b[4] = ROTL64(s[5], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[18] = b[0] ^ (b[2] & t12);
s[1] = t12 ^ (b[2] | b[3]);
s[14] = b[2] ^ (b[4] & t34);
s[22] = t34 ^ (b[4] | b[0]);
s[5] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[24], 62);
b[1] = ROTL64(s[7], 55);
b[2] = ROTL64(s[15], 39);
b[3] = ROTL64(s[3], 41);
b[4] = ROTL64(s[11], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[24] = b[0] ^ (b[2] & t12);
s[7] = t12 ^ (b[2] | b[3]);
s[15] = b[2] ^ (b[4] & t34);
s[3] = t34 ^ (b[4] | b[0]);
s[11] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000000008009UL;
/* Round 8. */
/* Col Mix */
b[0] = s[0] ^ s[6] ^ s[12] ^ s[18] ^ s[24];
b[1] = s[1] ^ s[7] ^ s[13] ^ s[19] ^ s[20];
b[2] = s[2] ^ s[8] ^ s[14] ^ s[15] ^ s[21];
b[3] = s[3] ^ s[9] ^ s[10] ^ s[16] ^ s[22];
b[4] = s[4] ^ s[5] ^ s[11] ^ s[17] ^ s[23];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[6]^=t; s[12]^=t; s[18]^=t; s[24]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[1]^=t; s[7]^=t; s[13]^=t; s[19]^=t; s[20]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[2]^=t; s[8]^=t; s[14]^=t; s[15]^=t; s[21]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[3]^=t; s[9]^=t; s[10]^=t; s[16]^=t; s[22]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[4]^=t; s[5]^=t; s[11]^=t; s[17]^=t; s[23]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[19], 44);
b[2] = ROTL64(s[8], 43);
b[3] = ROTL64(s[22], 21);
b[4] = ROTL64(s[11], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[19] = t12 ^ (b[2] | b[3]);
s[8] = b[2] ^ (b[4] & t34);
s[22] = t34 ^ (b[4] | b[0]);
s[11] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[9], 28);
b[1] = ROTL64(s[23], 20);
b[2] = ROTL64(s[12], 3);
b[3] = ROTL64(s[1], 45);
b[4] = ROTL64(s[15], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[9] = b[0] ^ (b[2] & t12);
s[23] = t12 ^ (b[2] | b[3]);
s[12] = b[2] ^ (b[4] & t34);
s[1] = t34 ^ (b[4] | b[0]);
s[15] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[13], 1);
b[1] = ROTL64(s[2], 6);
b[2] = ROTL64(s[16], 25);
b[3] = ROTL64(s[5], 8);
b[4] = ROTL64(s[24], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[13] = b[0] ^ (b[2] & t12);
s[2] = t12 ^ (b[2] | b[3]);
s[16] = b[2] ^ (b[4] & t34);
s[5] = t34 ^ (b[4] | b[0]);
s[24] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[17], 27);
b[1] = ROTL64(s[6], 36);
b[2] = ROTL64(s[20], 10);
b[3] = ROTL64(s[14], 15);
b[4] = ROTL64(s[3], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[17] = b[0] ^ (b[2] & t12);
s[6] = t12 ^ (b[2] | b[3]);
s[20] = b[2] ^ (b[4] & t34);
s[14] = t34 ^ (b[4] | b[0]);
s[3] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[21], 62);
b[1] = ROTL64(s[10], 55);
b[2] = ROTL64(s[4], 39);
b[3] = ROTL64(s[18], 41);
b[4] = ROTL64(s[7], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[21] = b[0] ^ (b[2] & t12);
s[10] = t12 ^ (b[2] | b[3]);
s[4] = b[2] ^ (b[4] & t34);
s[18] = t34 ^ (b[4] | b[0]);
s[7] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8aUL;
/* Round 9. */
/* Col Mix */
b[0] = s[0] ^ s[9] ^ s[13] ^ s[17] ^ s[21];
b[1] = s[2] ^ s[6] ^ s[10] ^ s[19] ^ s[23];
b[2] = s[4] ^ s[8] ^ s[12] ^ s[16] ^ s[20];
b[3] = s[1] ^ s[5] ^ s[14] ^ s[18] ^ s[22];
b[4] = s[3] ^ s[7] ^ s[11] ^ s[15] ^ s[24];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[9]^=t; s[13]^=t; s[17]^=t; s[21]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[2]^=t; s[6]^=t; s[10]^=t; s[19]^=t; s[23]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[4]^=t; s[8]^=t; s[12]^=t; s[16]^=t; s[20]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[1]^=t; s[5]^=t; s[14]^=t; s[18]^=t; s[22]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[3]^=t; s[7]^=t; s[11]^=t; s[15]^=t; s[24]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[23], 44);
b[2] = ROTL64(s[16], 43);
b[3] = ROTL64(s[14], 21);
b[4] = ROTL64(s[7], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[23] = t12 ^ (b[2] | b[3]);
s[16] = b[2] ^ (b[4] & t34);
s[14] = t34 ^ (b[4] | b[0]);
s[7] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[22], 28);
b[1] = ROTL64(s[15], 20);
b[2] = ROTL64(s[13], 3);
b[3] = ROTL64(s[6], 45);
b[4] = ROTL64(s[4], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[22] = b[0] ^ (b[2] & t12);
s[15] = t12 ^ (b[2] | b[3]);
s[13] = b[2] ^ (b[4] & t34);
s[6] = t34 ^ (b[4] | b[0]);
s[4] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[19], 1);
b[1] = ROTL64(s[12], 6);
b[2] = ROTL64(s[5], 25);
b[3] = ROTL64(s[3], 8);
b[4] = ROTL64(s[21], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[19] = b[0] ^ (b[2] & t12);
s[12] = t12 ^ (b[2] | b[3]);
s[5] = b[2] ^ (b[4] & t34);
s[3] = t34 ^ (b[4] | b[0]);
s[21] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[11], 27);
b[1] = ROTL64(s[9], 36);
b[2] = ROTL64(s[2], 10);
b[3] = ROTL64(s[20], 15);
b[4] = ROTL64(s[18], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[11] = b[0] ^ (b[2] & t12);
s[9] = t12 ^ (b[2] | b[3]);
s[2] = b[2] ^ (b[4] & t34);
s[20] = t34 ^ (b[4] | b[0]);
s[18] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[8], 62);
b[1] = ROTL64(s[1], 55);
b[2] = ROTL64(s[24], 39);
b[3] = ROTL64(s[17], 41);
b[4] = ROTL64(s[10], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[8] = b[0] ^ (b[2] & t12);
s[1] = t12 ^ (b[2] | b[3]);
s[24] = b[2] ^ (b[4] & t34);
s[17] = t34 ^ (b[4] | b[0]);
s[10] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x88UL;
/* Round 10. */
/* Col Mix */
b[0] = s[0] ^ s[8] ^ s[11] ^ s[19] ^ s[22];
b[1] = s[1] ^ s[9] ^ s[12] ^ s[15] ^ s[23];
b[2] = s[2] ^ s[5] ^ s[13] ^ s[16] ^ s[24];
b[3] = s[3] ^ s[6] ^ s[14] ^ s[17] ^ s[20];
b[4] = s[4] ^ s[7] ^ s[10] ^ s[18] ^ s[21];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[8]^=t; s[11]^=t; s[19]^=t; s[22]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[1]^=t; s[9]^=t; s[12]^=t; s[15]^=t; s[23]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[2]^=t; s[5]^=t; s[13]^=t; s[16]^=t; s[24]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[3]^=t; s[6]^=t; s[14]^=t; s[17]^=t; s[20]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[4]^=t; s[7]^=t; s[10]^=t; s[18]^=t; s[21]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[15], 44);
b[2] = ROTL64(s[5], 43);
b[3] = ROTL64(s[20], 21);
b[4] = ROTL64(s[10], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[15] = t12 ^ (b[2] | b[3]);
s[5] = b[2] ^ (b[4] & t34);
s[20] = t34 ^ (b[4] | b[0]);
s[10] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[14], 28);
b[1] = ROTL64(s[4], 20);
b[2] = ROTL64(s[19], 3);
b[3] = ROTL64(s[9], 45);
b[4] = ROTL64(s[24], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[14] = b[0] ^ (b[2] & t12);
s[4] = t12 ^ (b[2] | b[3]);
s[19] = b[2] ^ (b[4] & t34);
s[9] = t34 ^ (b[4] | b[0]);
s[24] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[23], 1);
b[1] = ROTL64(s[13], 6);
b[2] = ROTL64(s[3], 25);
b[3] = ROTL64(s[18], 8);
b[4] = ROTL64(s[8], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[23] = b[0] ^ (b[2] & t12);
s[13] = t12 ^ (b[2] | b[3]);
s[3] = b[2] ^ (b[4] & t34);
s[18] = t34 ^ (b[4] | b[0]);
s[8] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[7], 27);
b[1] = ROTL64(s[22], 36);
b[2] = ROTL64(s[12], 10);
b[3] = ROTL64(s[2], 15);
b[4] = ROTL64(s[17], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[7] = b[0] ^ (b[2] & t12);
s[22] = t12 ^ (b[2] | b[3]);
s[12] = b[2] ^ (b[4] & t34);
s[2] = t34 ^ (b[4] | b[0]);
s[17] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[16], 62);
b[1] = ROTL64(s[6], 55);
b[2] = ROTL64(s[21], 39);
b[3] = ROTL64(s[11], 41);
b[4] = ROTL64(s[1], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[16] = b[0] ^ (b[2] & t12);
s[6] = t12 ^ (b[2] | b[3]);
s[21] = b[2] ^ (b[4] & t34);
s[11] = t34 ^ (b[4] | b[0]);
s[1] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x80008009UL;
/* Round 11. */
/* Col Mix */
b[0] = s[0] ^ s[7] ^ s[14] ^ s[16] ^ s[23];
b[1] = s[4] ^ s[6] ^ s[13] ^ s[15] ^ s[22];
b[2] = s[3] ^ s[5] ^ s[12] ^ s[19] ^ s[21];
b[3] = s[2] ^ s[9] ^ s[11] ^ s[18] ^ s[20];
b[4] = s[1] ^ s[8] ^ s[10] ^ s[17] ^ s[24];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[7]^=t; s[14]^=t; s[16]^=t; s[23]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[4]^=t; s[6]^=t; s[13]^=t; s[15]^=t; s[22]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[3]^=t; s[5]^=t; s[12]^=t; s[19]^=t; s[21]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[2]^=t; s[9]^=t; s[11]^=t; s[18]^=t; s[20]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[1]^=t; s[8]^=t; s[10]^=t; s[17]^=t; s[24]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[4], 44);
b[2] = ROTL64(s[3], 43);
b[3] = ROTL64(s[2], 21);
b[4] = ROTL64(s[1], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[4] = t12 ^ (b[2] | b[3]);
s[3] = b[2] ^ (b[4] & t34);
s[2] = t34 ^ (b[4] | b[0]);
s[1] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[20], 28);
b[1] = ROTL64(s[24], 20);
b[2] = ROTL64(s[23], 3);
b[3] = ROTL64(s[22], 45);
b[4] = ROTL64(s[21], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[20] = b[0] ^ (b[2] & t12);
s[24] = t12 ^ (b[2] | b[3]);
s[23] = b[2] ^ (b[4] & t34);
s[22] = t34 ^ (b[4] | b[0]);
s[21] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[15], 1);
b[1] = ROTL64(s[19], 6);
b[2] = ROTL64(s[18], 25);
b[3] = ROTL64(s[17], 8);
b[4] = ROTL64(s[16], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[15] = b[0] ^ (b[2] & t12);
s[19] = t12 ^ (b[2] | b[3]);
s[18] = b[2] ^ (b[4] & t34);
s[17] = t34 ^ (b[4] | b[0]);
s[16] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[10], 27);
b[1] = ROTL64(s[14], 36);
b[2] = ROTL64(s[13], 10);
b[3] = ROTL64(s[12], 15);
b[4] = ROTL64(s[11], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[10] = b[0] ^ (b[2] & t12);
s[14] = t12 ^ (b[2] | b[3]);
s[13] = b[2] ^ (b[4] & t34);
s[12] = t34 ^ (b[4] | b[0]);
s[11] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[5], 62);
b[1] = ROTL64(s[9], 55);
b[2] = ROTL64(s[8], 39);
b[3] = ROTL64(s[7], 41);
b[4] = ROTL64(s[6], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[5] = b[0] ^ (b[2] & t12);
s[9] = t12 ^ (b[2] | b[3]);
s[8] = b[2] ^ (b[4] & t34);
s[7] = t34 ^ (b[4] | b[0]);
s[6] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000aUL;
/* Round 12. */
/* Col Mix */
b[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
b[1] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
b[2] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
b[3] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
b[4] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[5]^=t; s[10]^=t; s[15]^=t; s[20]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[4]^=t; s[9]^=t; s[14]^=t; s[19]^=t; s[24]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[3]^=t; s[8]^=t; s[13]^=t; s[18]^=t; s[23]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[2]^=t; s[7]^=t; s[12]^=t; s[17]^=t; s[22]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[1]^=t; s[6]^=t; s[11]^=t; s[16]^=t; s[21]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[24], 44);
b[2] = ROTL64(s[18], 43);
b[3] = ROTL64(s[12], 21);
b[4] = ROTL64(s[6], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[24] = t12 ^ (b[2] | b[3]);
s[18] = b[2] ^ (b[4] & t34);
s[12] = t34 ^ (b[4] | b[0]);
s[6] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[2], 28);
b[1] = ROTL64(s[21], 20);
b[2] = ROTL64(s[15], 3);
b[3] = ROTL64(s[14], 45);
b[4] = ROTL64(s[8], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[2] = b[0] ^ (b[2] & t12);
s[21] = t12 ^ (b[2] | b[3]);
s[15] = b[2] ^ (b[4] & t34);
s[14] = t34 ^ (b[4] | b[0]);
s[8] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[4], 1);
b[1] = ROTL64(s[23], 6);
b[2] = ROTL64(s[17], 25);
b[3] = ROTL64(s[11], 8);
b[4] = ROTL64(s[5], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[4] = b[0] ^ (b[2] & t12);
s[23] = t12 ^ (b[2] | b[3]);
s[17] = b[2] ^ (b[4] & t34);
s[11] = t34 ^ (b[4] | b[0]);
s[5] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[1], 27);
b[1] = ROTL64(s[20], 36);
b[2] = ROTL64(s[19], 10);
b[3] = ROTL64(s[13], 15);
b[4] = ROTL64(s[7], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[1] = b[0] ^ (b[2] & t12);
s[20] = t12 ^ (b[2] | b[3]);
s[19] = b[2] ^ (b[4] & t34);
s[13] = t34 ^ (b[4] | b[0]);
s[7] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[3], 62);
b[1] = ROTL64(s[22], 55);
b[2] = ROTL64(s[16], 39);
b[3] = ROTL64(s[10], 41);
b[4] = ROTL64(s[9], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[3] = b[0] ^ (b[2] & t12);
s[22] = t12 ^ (b[2] | b[3]);
s[16] = b[2] ^ (b[4] & t34);
s[10] = t34 ^ (b[4] | b[0]);
s[9] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000808bUL;
/* Round 13. */
/* Col Mix */
b[0] = s[0] ^ s[1] ^ s[2] ^ s[3] ^ s[4];
b[1] = s[20] ^ s[21] ^ s[22] ^ s[23] ^ s[24];
b[2] = s[15] ^ s[16] ^ s[17] ^ s[18] ^ s[19];
b[3] = s[10] ^ s[11] ^ s[12] ^ s[13] ^ s[14];
b[4] = s[5] ^ s[6] ^ s[7] ^ s[8] ^ s[9];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[1]^=t; s[2]^=t; s[3]^=t; s[4]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[20]^=t; s[21]^=t; s[22]^=t; s[23]^=t; s[24]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[15]^=t; s[16]^=t; s[17]^=t; s[18]^=t; s[19]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[10]^=t; s[11]^=t; s[12]^=t; s[13]^=t; s[14]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[5]^=t; s[6]^=t; s[7]^=t; s[8]^=t; s[9]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[21], 44);
b[2] = ROTL64(s[17], 43);
b[3] = ROTL64(s[13], 21);
b[4] = ROTL64(s[9], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[21] = t12 ^ (b[2] | b[3]);
s[17] = b[2] ^ (b[4] & t34);
s[13] = t34 ^ (b[4] | b[0]);
s[9] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[12], 28);
b[1] = ROTL64(s[8], 20);
b[2] = ROTL64(s[4], 3);
b[3] = ROTL64(s[20], 45);
b[4] = ROTL64(s[16], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[12] = b[0] ^ (b[2] & t12);
s[8] = t12 ^ (b[2] | b[3]);
s[4] = b[2] ^ (b[4] & t34);
s[20] = t34 ^ (b[4] | b[0]);
s[16] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[24], 1);
b[1] = ROTL64(s[15], 6);
b[2] = ROTL64(s[11], 25);
b[3] = ROTL64(s[7], 8);
b[4] = ROTL64(s[3], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[24] = b[0] ^ (b[2] & t12);
s[15] = t12 ^ (b[2] | b[3]);
s[11] = b[2] ^ (b[4] & t34);
s[7] = t34 ^ (b[4] | b[0]);
s[3] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[6], 27);
b[1] = ROTL64(s[2], 36);
b[2] = ROTL64(s[23], 10);
b[3] = ROTL64(s[19], 15);
b[4] = ROTL64(s[10], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[6] = b[0] ^ (b[2] & t12);
s[2] = t12 ^ (b[2] | b[3]);
s[23] = b[2] ^ (b[4] & t34);
s[19] = t34 ^ (b[4] | b[0]);
s[10] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[18], 62);
b[1] = ROTL64(s[14], 55);
b[2] = ROTL64(s[5], 39);
b[3] = ROTL64(s[1], 41);
b[4] = ROTL64(s[22], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[18] = b[0] ^ (b[2] & t12);
s[14] = t12 ^ (b[2] | b[3]);
s[5] = b[2] ^ (b[4] & t34);
s[1] = t34 ^ (b[4] | b[0]);
s[22] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x800000000000008bUL;
/* Round 14. */
/* Col Mix */
b[0] = s[0] ^ s[6] ^ s[12] ^ s[18] ^ s[24];
b[1] = s[2] ^ s[8] ^ s[14] ^ s[15] ^ s[21];
b[2] = s[4] ^ s[5] ^ s[11] ^ s[17] ^ s[23];
b[3] = s[1] ^ s[7] ^ s[13] ^ s[19] ^ s[20];
b[4] = s[3] ^ s[9] ^ s[10] ^ s[16] ^ s[22];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[6]^=t; s[12]^=t; s[18]^=t; s[24]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[2]^=t; s[8]^=t; s[14]^=t; s[15]^=t; s[21]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[4]^=t; s[5]^=t; s[11]^=t; s[17]^=t; s[23]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[1]^=t; s[7]^=t; s[13]^=t; s[19]^=t; s[20]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[3]^=t; s[9]^=t; s[10]^=t; s[16]^=t; s[22]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[8], 44);
b[2] = ROTL64(s[11], 43);
b[3] = ROTL64(s[19], 21);
b[4] = ROTL64(s[22], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[8] = t12 ^ (b[2] | b[3]);
s[11] = b[2] ^ (b[4] & t34);
s[19] = t34 ^ (b[4] | b[0]);
s[22] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[13], 28);
b[1] = ROTL64(s[16], 20);
b[2] = ROTL64(s[24], 3);
b[3] = ROTL64(s[2], 45);
b[4] = ROTL64(s[5], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[13] = b[0] ^ (b[2] & t12);
s[16] = t12 ^ (b[2] | b[3]);
s[24] = b[2] ^ (b[4] & t34);
s[2] = t34 ^ (b[4] | b[0]);
s[5] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[21], 1);
b[1] = ROTL64(s[4], 6);
b[2] = ROTL64(s[7], 25);
b[3] = ROTL64(s[10], 8);
b[4] = ROTL64(s[18], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[21] = b[0] ^ (b[2] & t12);
s[4] = t12 ^ (b[2] | b[3]);
s[7] = b[2] ^ (b[4] & t34);
s[10] = t34 ^ (b[4] | b[0]);
s[18] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[9], 27);
b[1] = ROTL64(s[12], 36);
b[2] = ROTL64(s[15], 10);
b[3] = ROTL64(s[23], 15);
b[4] = ROTL64(s[1], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[9] = b[0] ^ (b[2] & t12);
s[12] = t12 ^ (b[2] | b[3]);
s[15] = b[2] ^ (b[4] & t34);
s[23] = t34 ^ (b[4] | b[0]);
s[1] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[17], 62);
b[1] = ROTL64(s[20], 55);
b[2] = ROTL64(s[3], 39);
b[3] = ROTL64(s[6], 41);
b[4] = ROTL64(s[14], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[17] = b[0] ^ (b[2] & t12);
s[20] = t12 ^ (b[2] | b[3]);
s[3] = b[2] ^ (b[4] & t34);
s[6] = t34 ^ (b[4] | b[0]);
s[14] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000000008089UL;
/* Round 15. */
/* Col Mix */
b[0] = s[0] ^ s[9] ^ s[13] ^ s[17] ^ s[21];
b[1] = s[4] ^ s[8] ^ s[12] ^ s[16] ^ s[20];
b[2] = s[3] ^ s[7] ^ s[11] ^ s[15] ^ s[24];
b[3] = s[2] ^ s[6] ^ s[10] ^ s[19] ^ s[23];
b[4] = s[1] ^ s[5] ^ s[14] ^ s[18] ^ s[22];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[9]^=t; s[13]^=t; s[17]^=t; s[21]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[4]^=t; s[8]^=t; s[12]^=t; s[16]^=t; s[20]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[3]^=t; s[7]^=t; s[11]^=t; s[15]^=t; s[24]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[2]^=t; s[6]^=t; s[10]^=t; s[19]^=t; s[23]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[1]^=t; s[5]^=t; s[14]^=t; s[18]^=t; s[22]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[16], 44);
b[2] = ROTL64(s[7], 43);
b[3] = ROTL64(s[23], 21);
b[4] = ROTL64(s[14], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[16] = t12 ^ (b[2] | b[3]);
s[7] = b[2] ^ (b[4] & t34);
s[23] = t34 ^ (b[4] | b[0]);
s[14] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[19], 28);
b[1] = ROTL64(s[5], 20);
b[2] = ROTL64(s[21], 3);
b[3] = ROTL64(s[12], 45);
b[4] = ROTL64(s[3], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[19] = b[0] ^ (b[2] & t12);
s[5] = t12 ^ (b[2] | b[3]);
s[21] = b[2] ^ (b[4] & t34);
s[12] = t34 ^ (b[4] | b[0]);
s[3] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[8], 1);
b[1] = ROTL64(s[24], 6);
b[2] = ROTL64(s[10], 25);
b[3] = ROTL64(s[1], 8);
b[4] = ROTL64(s[17], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[8] = b[0] ^ (b[2] & t12);
s[24] = t12 ^ (b[2] | b[3]);
s[10] = b[2] ^ (b[4] & t34);
s[1] = t34 ^ (b[4] | b[0]);
s[17] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[22], 27);
b[1] = ROTL64(s[13], 36);
b[2] = ROTL64(s[4], 10);
b[3] = ROTL64(s[15], 15);
b[4] = ROTL64(s[6], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[22] = b[0] ^ (b[2] & t12);
s[13] = t12 ^ (b[2] | b[3]);
s[4] = b[2] ^ (b[4] & t34);
s[15] = t34 ^ (b[4] | b[0]);
s[6] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[11], 62);
b[1] = ROTL64(s[2], 55);
b[2] = ROTL64(s[18], 39);
b[3] = ROTL64(s[9], 41);
b[4] = ROTL64(s[20], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[11] = b[0] ^ (b[2] & t12);
s[2] = t12 ^ (b[2] | b[3]);
s[18] = b[2] ^ (b[4] & t34);
s[9] = t34 ^ (b[4] | b[0]);
s[20] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000000008003UL;
/* Round 16. */
/* Col Mix */
b[0] = s[0] ^ s[8] ^ s[11] ^ s[19] ^ s[22];
b[1] = s[2] ^ s[5] ^ s[13] ^ s[16] ^ s[24];
b[2] = s[4] ^ s[7] ^ s[10] ^ s[18] ^ s[21];
b[3] = s[1] ^ s[9] ^ s[12] ^ s[15] ^ s[23];
b[4] = s[3] ^ s[6] ^ s[14] ^ s[17] ^ s[20];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[8]^=t; s[11]^=t; s[19]^=t; s[22]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[2]^=t; s[5]^=t; s[13]^=t; s[16]^=t; s[24]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[4]^=t; s[7]^=t; s[10]^=t; s[18]^=t; s[21]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[1]^=t; s[9]^=t; s[12]^=t; s[15]^=t; s[23]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[3]^=t; s[6]^=t; s[14]^=t; s[17]^=t; s[20]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[5], 44);
b[2] = ROTL64(s[10], 43);
b[3] = ROTL64(s[15], 21);
b[4] = ROTL64(s[20], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[5] = t12 ^ (b[2] | b[3]);
s[10] = b[2] ^ (b[4] & t34);
s[15] = t34 ^ (b[4] | b[0]);
s[20] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[23], 28);
b[1] = ROTL64(s[3], 20);
b[2] = ROTL64(s[8], 3);
b[3] = ROTL64(s[13], 45);
b[4] = ROTL64(s[18], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[23] = b[0] ^ (b[2] & t12);
s[3] = t12 ^ (b[2] | b[3]);
s[8] = b[2] ^ (b[4] & t34);
s[13] = t34 ^ (b[4] | b[0]);
s[18] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[16], 1);
b[1] = ROTL64(s[21], 6);
b[2] = ROTL64(s[1], 25);
b[3] = ROTL64(s[6], 8);
b[4] = ROTL64(s[11], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[16] = b[0] ^ (b[2] & t12);
s[21] = t12 ^ (b[2] | b[3]);
s[1] = b[2] ^ (b[4] & t34);
s[6] = t34 ^ (b[4] | b[0]);
s[11] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[14], 27);
b[1] = ROTL64(s[19], 36);
b[2] = ROTL64(s[24], 10);
b[3] = ROTL64(s[4], 15);
b[4] = ROTL64(s[9], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[14] = b[0] ^ (b[2] & t12);
s[19] = t12 ^ (b[2] | b[3]);
s[24] = b[2] ^ (b[4] & t34);
s[4] = t34 ^ (b[4] | b[0]);
s[9] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[7], 62);
b[1] = ROTL64(s[12], 55);
b[2] = ROTL64(s[17], 39);
b[3] = ROTL64(s[22], 41);
b[4] = ROTL64(s[2], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[7] = b[0] ^ (b[2] & t12);
s[12] = t12 ^ (b[2] | b[3]);
s[17] = b[2] ^ (b[4] & t34);
s[22] = t34 ^ (b[4] | b[0]);
s[2] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000000008002UL;
/* Round 17. */
/* Col Mix */
b[0] = s[0] ^ s[7] ^ s[14] ^ s[16] ^ s[23];
b[1] = s[3] ^ s[5] ^ s[12] ^ s[19] ^ s[21];
b[2] = s[1] ^ s[8] ^ s[10] ^ s[17] ^ s[24];
b[3] = s[4] ^ s[6] ^ s[13] ^ s[15] ^ s[22];
b[4] = s[2] ^ s[9] ^ s[11] ^ s[18] ^ s[20];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[7]^=t; s[14]^=t; s[16]^=t; s[23]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[3]^=t; s[5]^=t; s[12]^=t; s[19]^=t; s[21]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[1]^=t; s[8]^=t; s[10]^=t; s[17]^=t; s[24]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[4]^=t; s[6]^=t; s[13]^=t; s[15]^=t; s[22]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[2]^=t; s[9]^=t; s[11]^=t; s[18]^=t; s[20]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[3], 44);
b[2] = ROTL64(s[1], 43);
b[3] = ROTL64(s[4], 21);
b[4] = ROTL64(s[2], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[3] = t12 ^ (b[2] | b[3]);
s[1] = b[2] ^ (b[4] & t34);
s[4] = t34 ^ (b[4] | b[0]);
s[2] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[15], 28);
b[1] = ROTL64(s[18], 20);
b[2] = ROTL64(s[16], 3);
b[3] = ROTL64(s[19], 45);
b[4] = ROTL64(s[17], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[15] = b[0] ^ (b[2] & t12);
s[18] = t12 ^ (b[2] | b[3]);
s[16] = b[2] ^ (b[4] & t34);
s[19] = t34 ^ (b[4] | b[0]);
s[17] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[5], 1);
b[1] = ROTL64(s[8], 6);
b[2] = ROTL64(s[6], 25);
b[3] = ROTL64(s[9], 8);
b[4] = ROTL64(s[7], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[5] = b[0] ^ (b[2] & t12);
s[8] = t12 ^ (b[2] | b[3]);
s[6] = b[2] ^ (b[4] & t34);
s[9] = t34 ^ (b[4] | b[0]);
s[7] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[20], 27);
b[1] = ROTL64(s[23], 36);
b[2] = ROTL64(s[21], 10);
b[3] = ROTL64(s[24], 15);
b[4] = ROTL64(s[22], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[20] = b[0] ^ (b[2] & t12);
s[23] = t12 ^ (b[2] | b[3]);
s[21] = b[2] ^ (b[4] & t34);
s[24] = t34 ^ (b[4] | b[0]);
s[22] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[10], 62);
b[1] = ROTL64(s[13], 55);
b[2] = ROTL64(s[11], 39);
b[3] = ROTL64(s[14], 41);
b[4] = ROTL64(s[12], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[10] = b[0] ^ (b[2] & t12);
s[13] = t12 ^ (b[2] | b[3]);
s[11] = b[2] ^ (b[4] & t34);
s[14] = t34 ^ (b[4] | b[0]);
s[12] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000000000080UL;
/* Round 18. */
/* Col Mix */
b[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
b[1] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
b[2] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
b[3] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
b[4] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[5]^=t; s[10]^=t; s[15]^=t; s[20]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[3]^=t; s[8]^=t; s[13]^=t; s[18]^=t; s[23]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[1]^=t; s[6]^=t; s[11]^=t; s[16]^=t; s[21]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[4]^=t; s[9]^=t; s[14]^=t; s[19]^=t; s[24]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[2]^=t; s[7]^=t; s[12]^=t; s[17]^=t; s[22]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[18], 44);
b[2] = ROTL64(s[6], 43);
b[3] = ROTL64(s[24], 21);
b[4] = ROTL64(s[12], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[18] = t12 ^ (b[2] | b[3]);
s[6] = b[2] ^ (b[4] & t34);
s[24] = t34 ^ (b[4] | b[0]);
s[12] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[4], 28);
b[1] = ROTL64(s[17], 20);
b[2] = ROTL64(s[5], 3);
b[3] = ROTL64(s[23], 45);
b[4] = ROTL64(s[11], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[4] = b[0] ^ (b[2] & t12);
s[17] = t12 ^ (b[2] | b[3]);
s[5] = b[2] ^ (b[4] & t34);
s[23] = t34 ^ (b[4] | b[0]);
s[11] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[3], 1);
b[1] = ROTL64(s[16], 6);
b[2] = ROTL64(s[9], 25);
b[3] = ROTL64(s[22], 8);
b[4] = ROTL64(s[10], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[3] = b[0] ^ (b[2] & t12);
s[16] = t12 ^ (b[2] | b[3]);
s[9] = b[2] ^ (b[4] & t34);
s[22] = t34 ^ (b[4] | b[0]);
s[10] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[2], 27);
b[1] = ROTL64(s[15], 36);
b[2] = ROTL64(s[8], 10);
b[3] = ROTL64(s[21], 15);
b[4] = ROTL64(s[14], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[2] = b[0] ^ (b[2] & t12);
s[15] = t12 ^ (b[2] | b[3]);
s[8] = b[2] ^ (b[4] & t34);
s[21] = t34 ^ (b[4] | b[0]);
s[14] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[1], 62);
b[1] = ROTL64(s[19], 55);
b[2] = ROTL64(s[7], 39);
b[3] = ROTL64(s[20], 41);
b[4] = ROTL64(s[13], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[1] = b[0] ^ (b[2] & t12);
s[19] = t12 ^ (b[2] | b[3]);
s[7] = b[2] ^ (b[4] & t34);
s[20] = t34 ^ (b[4] | b[0]);
s[13] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x800aUL;
/* Round 19. */
/* Col Mix */
b[0] = s[0] ^ s[1] ^ s[2] ^ s[3] ^ s[4];
b[1] = s[15] ^ s[16] ^ s[17] ^ s[18] ^ s[19];
b[2] = s[5] ^ s[6] ^ s[7] ^ s[8] ^ s[9];
b[3] = s[20] ^ s[21] ^ s[22] ^ s[23] ^ s[24];
b[4] = s[10] ^ s[11] ^ s[12] ^ s[13] ^ s[14];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[1]^=t; s[2]^=t; s[3]^=t; s[4]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[15]^=t; s[16]^=t; s[17]^=t; s[18]^=t; s[19]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[5]^=t; s[6]^=t; s[7]^=t; s[8]^=t; s[9]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[20]^=t; s[21]^=t; s[22]^=t; s[23]^=t; s[24]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[10]^=t; s[11]^=t; s[12]^=t; s[13]^=t; s[14]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[17], 44);
b[2] = ROTL64(s[9], 43);
b[3] = ROTL64(s[21], 21);
b[4] = ROTL64(s[13], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[17] = t12 ^ (b[2] | b[3]);
s[9] = b[2] ^ (b[4] & t34);
s[21] = t34 ^ (b[4] | b[0]);
s[13] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[24], 28);
b[1] = ROTL64(s[11], 20);
b[2] = ROTL64(s[3], 3);
b[3] = ROTL64(s[15], 45);
b[4] = ROTL64(s[7], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[24] = b[0] ^ (b[2] & t12);
s[11] = t12 ^ (b[2] | b[3]);
s[3] = b[2] ^ (b[4] & t34);
s[15] = t34 ^ (b[4] | b[0]);
s[7] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[18], 1);
b[1] = ROTL64(s[5], 6);
b[2] = ROTL64(s[22], 25);
b[3] = ROTL64(s[14], 8);
b[4] = ROTL64(s[1], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[18] = b[0] ^ (b[2] & t12);
s[5] = t12 ^ (b[2] | b[3]);
s[22] = b[2] ^ (b[4] & t34);
s[14] = t34 ^ (b[4] | b[0]);
s[1] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[12], 27);
b[1] = ROTL64(s[4], 36);
b[2] = ROTL64(s[16], 10);
b[3] = ROTL64(s[8], 15);
b[4] = ROTL64(s[20], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[12] = b[0] ^ (b[2] & t12);
s[4] = t12 ^ (b[2] | b[3]);
s[16] = b[2] ^ (b[4] & t34);
s[8] = t34 ^ (b[4] | b[0]);
s[20] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[6], 62);
b[1] = ROTL64(s[23], 55);
b[2] = ROTL64(s[10], 39);
b[3] = ROTL64(s[2], 41);
b[4] = ROTL64(s[19], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[6] = b[0] ^ (b[2] & t12);
s[23] = t12 ^ (b[2] | b[3]);
s[10] = b[2] ^ (b[4] & t34);
s[2] = t34 ^ (b[4] | b[0]);
s[19] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x800000008000000aUL;
/* Round 20. */
/* Col Mix */
b[0] = s[0] ^ s[6] ^ s[12] ^ s[18] ^ s[24];
b[1] = s[4] ^ s[5] ^ s[11] ^ s[17] ^ s[23];
b[2] = s[3] ^ s[9] ^ s[10] ^ s[16] ^ s[22];
b[3] = s[2] ^ s[8] ^ s[14] ^ s[15] ^ s[21];
b[4] = s[1] ^ s[7] ^ s[13] ^ s[19] ^ s[20];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[6]^=t; s[12]^=t; s[18]^=t; s[24]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[4]^=t; s[5]^=t; s[11]^=t; s[17]^=t; s[23]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[3]^=t; s[9]^=t; s[10]^=t; s[16]^=t; s[22]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[2]^=t; s[8]^=t; s[14]^=t; s[15]^=t; s[21]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[1]^=t; s[7]^=t; s[13]^=t; s[19]^=t; s[20]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[11], 44);
b[2] = ROTL64(s[22], 43);
b[3] = ROTL64(s[8], 21);
b[4] = ROTL64(s[19], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[11] = t12 ^ (b[2] | b[3]);
s[22] = b[2] ^ (b[4] & t34);
s[8] = t34 ^ (b[4] | b[0]);
s[19] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[21], 28);
b[1] = ROTL64(s[7], 20);
b[2] = ROTL64(s[18], 3);
b[3] = ROTL64(s[4], 45);
b[4] = ROTL64(s[10], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[21] = b[0] ^ (b[2] & t12);
s[7] = t12 ^ (b[2] | b[3]);
s[18] = b[2] ^ (b[4] & t34);
s[4] = t34 ^ (b[4] | b[0]);
s[10] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[17], 1);
b[1] = ROTL64(s[3], 6);
b[2] = ROTL64(s[14], 25);
b[3] = ROTL64(s[20], 8);
b[4] = ROTL64(s[6], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[17] = b[0] ^ (b[2] & t12);
s[3] = t12 ^ (b[2] | b[3]);
s[14] = b[2] ^ (b[4] & t34);
s[20] = t34 ^ (b[4] | b[0]);
s[6] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[13], 27);
b[1] = ROTL64(s[24], 36);
b[2] = ROTL64(s[5], 10);
b[3] = ROTL64(s[16], 15);
b[4] = ROTL64(s[2], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[13] = b[0] ^ (b[2] & t12);
s[24] = t12 ^ (b[2] | b[3]);
s[5] = b[2] ^ (b[4] & t34);
s[16] = t34 ^ (b[4] | b[0]);
s[2] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[9], 62);
b[1] = ROTL64(s[15], 55);
b[2] = ROTL64(s[1], 39);
b[3] = ROTL64(s[12], 41);
b[4] = ROTL64(s[23], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[9] = b[0] ^ (b[2] & t12);
s[15] = t12 ^ (b[2] | b[3]);
s[1] = b[2] ^ (b[4] & t34);
s[12] = t34 ^ (b[4] | b[0]);
s[23] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000080008081UL;
/* Round 21. */
/* Col Mix */
b[0] = s[0] ^ s[9] ^ s[13] ^ s[17] ^ s[21];
b[1] = s[3] ^ s[7] ^ s[11] ^ s[15] ^ s[24];
b[2] = s[1] ^ s[5] ^ s[14] ^ s[18] ^ s[22];
b[3] = s[4] ^ s[8] ^ s[12] ^ s[16] ^ s[20];
b[4] = s[2] ^ s[6] ^ s[10] ^ s[19] ^ s[23];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[9]^=t; s[13]^=t; s[17]^=t; s[21]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[3]^=t; s[7]^=t; s[11]^=t; s[15]^=t; s[24]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[1]^=t; s[5]^=t; s[14]^=t; s[18]^=t; s[22]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[4]^=t; s[8]^=t; s[12]^=t; s[16]^=t; s[20]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[2]^=t; s[6]^=t; s[10]^=t; s[19]^=t; s[23]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[7], 44);
b[2] = ROTL64(s[14], 43);
b[3] = ROTL64(s[16], 21);
b[4] = ROTL64(s[23], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[7] = t12 ^ (b[2] | b[3]);
s[14] = b[2] ^ (b[4] & t34);
s[16] = t34 ^ (b[4] | b[0]);
s[23] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[8], 28);
b[1] = ROTL64(s[10], 20);
b[2] = ROTL64(s[17], 3);
b[3] = ROTL64(s[24], 45);
b[4] = ROTL64(s[1], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[8] = b[0] ^ (b[2] & t12);
s[10] = t12 ^ (b[2] | b[3]);
s[17] = b[2] ^ (b[4] & t34);
s[24] = t34 ^ (b[4] | b[0]);
s[1] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[11], 1);
b[1] = ROTL64(s[18], 6);
b[2] = ROTL64(s[20], 25);
b[3] = ROTL64(s[2], 8);
b[4] = ROTL64(s[9], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[11] = b[0] ^ (b[2] & t12);
s[18] = t12 ^ (b[2] | b[3]);
s[20] = b[2] ^ (b[4] & t34);
s[2] = t34 ^ (b[4] | b[0]);
s[9] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[19], 27);
b[1] = ROTL64(s[21], 36);
b[2] = ROTL64(s[3], 10);
b[3] = ROTL64(s[5], 15);
b[4] = ROTL64(s[12], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[19] = b[0] ^ (b[2] & t12);
s[21] = t12 ^ (b[2] | b[3]);
s[3] = b[2] ^ (b[4] & t34);
s[5] = t34 ^ (b[4] | b[0]);
s[12] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[22], 62);
b[1] = ROTL64(s[4], 55);
b[2] = ROTL64(s[6], 39);
b[3] = ROTL64(s[13], 41);
b[4] = ROTL64(s[15], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[22] = b[0] ^ (b[2] & t12);
s[4] = t12 ^ (b[2] | b[3]);
s[6] = b[2] ^ (b[4] & t34);
s[13] = t34 ^ (b[4] | b[0]);
s[15] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000000008080UL;
/* Round 22. */
/* Col Mix */
b[0] = s[0] ^ s[8] ^ s[11] ^ s[19] ^ s[22];
b[1] = s[4] ^ s[7] ^ s[10] ^ s[18] ^ s[21];
b[2] = s[3] ^ s[6] ^ s[14] ^ s[17] ^ s[20];
b[3] = s[2] ^ s[5] ^ s[13] ^ s[16] ^ s[24];
b[4] = s[1] ^ s[9] ^ s[12] ^ s[15] ^ s[23];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[8]^=t; s[11]^=t; s[19]^=t; s[22]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[4]^=t; s[7]^=t; s[10]^=t; s[18]^=t; s[21]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[3]^=t; s[6]^=t; s[14]^=t; s[17]^=t; s[20]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[2]^=t; s[5]^=t; s[13]^=t; s[16]^=t; s[24]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[1]^=t; s[9]^=t; s[12]^=t; s[15]^=t; s[23]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[10], 44);
b[2] = ROTL64(s[20], 43);
b[3] = ROTL64(s[5], 21);
b[4] = ROTL64(s[15], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[10] = t12 ^ (b[2] | b[3]);
s[20] = b[2] ^ (b[4] & t34);
s[5] = t34 ^ (b[4] | b[0]);
s[15] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[16], 28);
b[1] = ROTL64(s[1], 20);
b[2] = ROTL64(s[11], 3);
b[3] = ROTL64(s[21], 45);
b[4] = ROTL64(s[6], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[16] = b[0] ^ (b[2] & t12);
s[1] = t12 ^ (b[2] | b[3]);
s[11] = b[2] ^ (b[4] & t34);
s[21] = t34 ^ (b[4] | b[0]);
s[6] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[7], 1);
b[1] = ROTL64(s[17], 6);
b[2] = ROTL64(s[2], 25);
b[3] = ROTL64(s[12], 8);
b[4] = ROTL64(s[22], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[7] = b[0] ^ (b[2] & t12);
s[17] = t12 ^ (b[2] | b[3]);
s[2] = b[2] ^ (b[4] & t34);
s[12] = t34 ^ (b[4] | b[0]);
s[22] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[23], 27);
b[1] = ROTL64(s[8], 36);
b[2] = ROTL64(s[18], 10);
b[3] = ROTL64(s[3], 15);
b[4] = ROTL64(s[13], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[23] = b[0] ^ (b[2] & t12);
s[8] = t12 ^ (b[2] | b[3]);
s[18] = b[2] ^ (b[4] & t34);
s[3] = t34 ^ (b[4] | b[0]);
s[13] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[14], 62);
b[1] = ROTL64(s[24], 55);
b[2] = ROTL64(s[9], 39);
b[3] = ROTL64(s[19], 41);
b[4] = ROTL64(s[4], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[14] = b[0] ^ (b[2] & t12);
s[24] = t12 ^ (b[2] | b[3]);
s[9] = b[2] ^ (b[4] & t34);
s[19] = t34 ^ (b[4] | b[0]);
s[4] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x80000001UL;
/* Round 23. */
/* Col Mix */
b[0] = s[0] ^ s[7] ^ s[14] ^ s[16] ^ s[23];
b[1] = s[1] ^ s[8] ^ s[10] ^ s[17] ^ s[24];
b[2] = s[2] ^ s[9] ^ s[11] ^ s[18] ^ s[20];
b[3] = s[3] ^ s[5] ^ s[12] ^ s[19] ^ s[21];
b[4] = s[4] ^ s[6] ^ s[13] ^ s[15] ^ s[22];
t = b[4] ^ ROTL64(b[1], 1);
s[0]^=t; s[7]^=t; s[14]^=t; s[16]^=t; s[23]^=t;
t = b[0] ^ ROTL64(b[2], 1);
s[1]^=t; s[8]^=t; s[10]^=t; s[17]^=t; s[24]^=t;
t = b[1] ^ ROTL64(b[3], 1);
s[2]^=t; s[9]^=t; s[11]^=t; s[18]^=t; s[20]^=t;
t = b[2] ^ ROTL64(b[4], 1);
s[3]^=t; s[5]^=t; s[12]^=t; s[19]^=t; s[21]^=t;
t = b[3] ^ ROTL64(b[0], 1);
s[4]^=t; s[6]^=t; s[13]^=t; s[15]^=t; s[22]^=t;
/* Row Mix */
b[0] = s[0];
b[1] = ROTL64(s[1], 44);
b[2] = ROTL64(s[2], 43);
b[3] = ROTL64(s[3], 21);
b[4] = ROTL64(s[4], 14);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[0] = b[0] ^ (b[2] & t12);
s[1] = t12 ^ (b[2] | b[3]);
s[2] = b[2] ^ (b[4] & t34);
s[3] = t34 ^ (b[4] | b[0]);
s[4] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[5], 28);
b[1] = ROTL64(s[6], 20);
b[2] = ROTL64(s[7], 3);
b[3] = ROTL64(s[8], 45);
b[4] = ROTL64(s[9], 61);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[5] = b[0] ^ (b[2] & t12);
s[6] = t12 ^ (b[2] | b[3]);
s[7] = b[2] ^ (b[4] & t34);
s[8] = t34 ^ (b[4] | b[0]);
s[9] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[10], 1);
b[1] = ROTL64(s[11], 6);
b[2] = ROTL64(s[12], 25);
b[3] = ROTL64(s[13], 8);
b[4] = ROTL64(s[14], 18);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[10] = b[0] ^ (b[2] & t12);
s[11] = t12 ^ (b[2] | b[3]);
s[12] = b[2] ^ (b[4] & t34);
s[13] = t34 ^ (b[4] | b[0]);
s[14] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[15], 27);
b[1] = ROTL64(s[16], 36);
b[2] = ROTL64(s[17], 10);
b[3] = ROTL64(s[18], 15);
b[4] = ROTL64(s[19], 56);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[15] = b[0] ^ (b[2] & t12);
s[16] = t12 ^ (b[2] | b[3]);
s[17] = b[2] ^ (b[4] & t34);
s[18] = t34 ^ (b[4] | b[0]);
s[19] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
b[0] = ROTL64(s[20], 62);
b[1] = ROTL64(s[21], 55);
b[2] = ROTL64(s[22], 39);
b[3] = ROTL64(s[23], 41);
b[4] = ROTL64(s[24], 2);
{
word64 t12, t34;
t12 = (b[1] ^ b[2]); t34 = (b[3] ^ b[4]);
s[20] = b[0] ^ (b[2] & t12);
s[21] = t12 ^ (b[2] | b[3]);
s[22] = b[2] ^ (b[4] & t34);
s[23] = t34 ^ (b[4] | b[0]);
s[24] = b[4] ^ (b[1] & (b[0] ^ b[1]));
}
/* XOR in constant. */
s[0] ^= 0x8000000080008008UL;
}