7#include <botan/internal/xts.h>
9#include <botan/assert.h>
10#include <botan/internal/isa_extn.h>
11#include <botan/internal/poly_dbl.h>
16void BOTAN_FN_ISA_AVX512_CLMUL XTS_Mode::update_tweak_block_avx512_clmul(uint8_t tweak[],
size_t BS,
size_t N) {
19 if(BS == 16 && N % 8 == 0) {
20 constexpr uint64_t P128 = 0x87;
21 const __m512i poly = _mm512_set_epi64(0, P128, 0, P128, 0, P128, 0, P128);
32 const size_t N_32 = N / 32;
33 const size_t N_8 = (N - N_32 * 32) / 8;
36 for(
size_t i = 0; i != N; i += 8) {
37 __m512i W0 = _mm512_loadu_si512(&
tweak[i * BS]);
38 __m512i W1 = _mm512_loadu_si512(&
tweak[(i + 4) * BS]);
40 for(
size_t r = 0; r != N_32; ++r) {
42 const auto C0 = _mm512_clmulepi64_epi128(_mm512_bsrli_epi128(W0, 12), poly, 0);
43 const auto C1 = _mm512_clmulepi64_epi128(_mm512_bsrli_epi128(W1, 12), poly, 0);
44 W0 = _mm512_xor_si512(_mm512_bslli_epi128(W0, 4), C0);
45 W1 = _mm512_xor_si512(_mm512_bslli_epi128(W1, 4), C1);
48 for(
size_t r = 0; r != N_8; ++r) {
50 const auto C0 = _mm512_clmulepi64_epi128(_mm512_bsrli_epi128(W0, 15), poly, 0);
51 const auto C1 = _mm512_clmulepi64_epi128(_mm512_bsrli_epi128(W1, 15), poly, 0);
52 W0 = _mm512_xor_si512(_mm512_bslli_epi128(W0, 1), C0);
53 W1 = _mm512_xor_si512(_mm512_bslli_epi128(W1, 1), C1);
56 _mm512_storeu_epi64(&
tweak[i * BS], W0);
57 _mm512_storeu_epi64(&
tweak[(i + 4) * BS], W1);
#define BOTAN_ASSERT_NOMSG(expr)
const uint8_t * tweak() const
void poly_double_n_le(uint8_t out[], const uint8_t in[], size_t n)
void xts_compute_tweak_block(uint8_t tweak[], size_t BS, size_t blocks_in_tweak)