26 constexpr uint8_t Ebox[16] = {1, 11, 9, 12, 13, 6, 15, 3, 14, 8, 7, 4, 10, 2, 5, 0};
27 constexpr uint8_t Rbox[16] = {7, 12, 11, 13, 14, 4, 9, 15, 6, 3, 8, 10, 2, 5, 1, 0};
105#if defined(BOTAN_HAS_WHIRLPOOL_AVX512)
107 return compress_n_avx512(digest, input, blocks);
111#if defined(BOTAN_HAS_WHIRLPOOL_AVX2)
113 return compress_n_avx2(digest, input, blocks);
119 for(
size_t i = 0; i != blocks; ++i) {
122 uint64_t K[11 * 8] = {0};
134 for(
size_t r = 1; r != 11; ++r) {
135 const uint64_t PK0 = K[8 * (r - 1) + 0];
136 const uint64_t PK1 = K[8 * (r - 1) + 1];
137 const uint64_t PK2 = K[8 * (r - 1) + 2];
138 const uint64_t PK3 = K[8 * (r - 1) + 3];
139 const uint64_t PK4 = K[8 * (r - 1) + 4];
140 const uint64_t PK5 = K[8 * (r - 1) + 5];
141 const uint64_t PK6 = K[8 * (r - 1) + 6];
142 const uint64_t PK7 = K[8 * (r - 1) + 7];
144 K[8 * r + 0] = whirl(PK0, PK7, PK6, PK5, PK4, PK3, PK2, PK1) ^ WHIRL_RC[r - 1];
145 K[8 * r + 1] = whirl(PK1, PK0, PK7, PK6, PK5, PK4, PK3, PK2);
146 K[8 * r + 2] = whirl(PK2, PK1, PK0, PK7, PK6, PK5, PK4, PK3);
147 K[8 * r + 3] = whirl(PK3, PK2, PK1, PK0, PK7, PK6, PK5, PK4);
148 K[8 * r + 4] = whirl(PK4, PK3, PK2, PK1, PK0, PK7, PK6, PK5);
149 K[8 * r + 5] = whirl(PK5, PK4, PK3, PK2, PK1, PK0, PK7, PK6);
150 K[8 * r + 6] = whirl(PK6, PK5, PK4, PK3, PK2, PK1, PK0, PK7);
151 K[8 * r + 7] = whirl(PK7, PK6, PK5, PK4, PK3, PK2, PK1, PK0);
158 uint64_t B0 = M[0] ^ K[0];
159 uint64_t B1 = M[1] ^ K[1];
160 uint64_t B2 = M[2] ^ K[2];
161 uint64_t B3 = M[3] ^ K[3];
162 uint64_t B4 = M[4] ^ K[4];
163 uint64_t B5 = M[5] ^ K[5];
164 uint64_t B6 = M[6] ^ K[6];
165 uint64_t B7 = M[7] ^ K[7];
167 for(
size_t r = 1; r != 11; ++r) {
168 const uint64_t T0 = whirl(B0, B7, B6, B5, B4, B3, B2, B1) ^ K[8 * r + 0];
169 const uint64_t T1 = whirl(B1, B0, B7, B6, B5, B4, B3, B2) ^ K[8 * r + 1];
170 const uint64_t T2 = whirl(B2, B1, B0, B7, B6, B5, B4, B3) ^ K[8 * r + 2];
171 const uint64_t T3 = whirl(B3, B2, B1, B0, B7, B6, B5, B4) ^ K[8 * r + 3];
172 const uint64_t T4 = whirl(B4, B3, B2, B1, B0, B7, B6, B5) ^ K[8 * r + 4];
173 const uint64_t T5 = whirl(B5, B4, B3, B2, B1, B0, B7, B6) ^ K[8 * r + 5];
174 const uint64_t T6 = whirl(B6, B5, B4, B3, B2, B1, B0, B7) ^ K[8 * r + 6];
175 const uint64_t T7 = whirl(B7, B6, B5, B4, B3, B2, B1, B0) ^ K[8 * r + 7];
187 digest[0] ^= B0 ^ M[0];
188 digest[1] ^= B1 ^ M[1];
189 digest[2] ^= B2 ^ M[2];
190 digest[3] ^= B3 ^ M[3];
191 digest[4] ^= B4 ^ M[4];
192 digest[5] ^= B5 ^ M[5];
193 digest[6] ^= B6 ^ M[6];
194 digest[7] ^= B7 ^ M[7];