22 constexpr uint8_t Ebox[16] = {1, 11, 9, 12, 13, 6, 15, 3, 14, 8, 7, 4, 10, 2, 5, 0};
23 constexpr uint8_t Rbox[16] = {7, 12, 11, 13, 14, 4, 9, 15, 6, 3, 8, 10, 2, 5, 1, 0};
87 for(
size_t i = 0; i != blocks; ++i) {
90 uint64_t K[11 * 8] = {0};
102 for(
size_t r = 1; r != 11; ++r) {
103 const uint64_t PK0 = K[8 * (r - 1) + 0];
104 const uint64_t PK1 = K[8 * (r - 1) + 1];
105 const uint64_t PK2 = K[8 * (r - 1) + 2];
106 const uint64_t PK3 = K[8 * (r - 1) + 3];
107 const uint64_t PK4 = K[8 * (r - 1) + 4];
108 const uint64_t PK5 = K[8 * (r - 1) + 5];
109 const uint64_t PK6 = K[8 * (r - 1) + 6];
110 const uint64_t PK7 = K[8 * (r - 1) + 7];
112 K[8 * r + 0] = whirl(PK0, PK7, PK6, PK5, PK4, PK3, PK2, PK1) ^ WHIRL_RC[r - 1];
113 K[8 * r + 1] = whirl(PK1, PK0, PK7, PK6, PK5, PK4, PK3, PK2);
114 K[8 * r + 2] = whirl(PK2, PK1, PK0, PK7, PK6, PK5, PK4, PK3);
115 K[8 * r + 3] = whirl(PK3, PK2, PK1, PK0, PK7, PK6, PK5, PK4);
116 K[8 * r + 4] = whirl(PK4, PK3, PK2, PK1, PK0, PK7, PK6, PK5);
117 K[8 * r + 5] = whirl(PK5, PK4, PK3, PK2, PK1, PK0, PK7, PK6);
118 K[8 * r + 6] = whirl(PK6, PK5, PK4, PK3, PK2, PK1, PK0, PK7);
119 K[8 * r + 7] = whirl(PK7, PK6, PK5, PK4, PK3, PK2, PK1, PK0);
126 uint64_t B0 = M[0] ^ K[0];
127 uint64_t B1 = M[1] ^ K[1];
128 uint64_t B2 = M[2] ^ K[2];
129 uint64_t B3 = M[3] ^ K[3];
130 uint64_t B4 = M[4] ^ K[4];
131 uint64_t B5 = M[5] ^ K[5];
132 uint64_t B6 = M[6] ^ K[6];
133 uint64_t B7 = M[7] ^ K[7];
135 for(
size_t r = 1; r != 11; ++r) {
136 const uint64_t T0 = whirl(B0, B7, B6, B5, B4, B3, B2, B1) ^ K[8 * r + 0];
137 const uint64_t T1 = whirl(B1, B0, B7, B6, B5, B4, B3, B2) ^ K[8 * r + 1];
138 const uint64_t T2 = whirl(B2, B1, B0, B7, B6, B5, B4, B3) ^ K[8 * r + 2];
139 const uint64_t T3 = whirl(B3, B2, B1, B0, B7, B6, B5, B4) ^ K[8 * r + 3];
140 const uint64_t T4 = whirl(B4, B3, B2, B1, B0, B7, B6, B5) ^ K[8 * r + 4];
141 const uint64_t T5 = whirl(B5, B4, B3, B2, B1, B0, B7, B6) ^ K[8 * r + 5];
142 const uint64_t T6 = whirl(B6, B5, B4, B3, B2, B1, B0, B7) ^ K[8 * r + 6];
143 const uint64_t T7 = whirl(B7, B6, B5, B4, B3, B2, B1, B0) ^ K[8 * r + 7];
155 digest[0] ^= B0 ^ M[0];
156 digest[1] ^= B1 ^ M[1];
157 digest[2] ^= B2 ^ M[2];
158 digest[3] ^= B3 ^ M[3];
159 digest[4] ^= B4 ^ M[4];
160 digest[5] ^= B5 ^ M[5];
161 digest[6] ^= B6 ^ M[6];
162 digest[7] ^= B7 ^ M[7];