8#include <botan/internal/ghash.h>
10#include <botan/internal/isa_extn.h>
11#include <botan/internal/polyval_fn.h>
12#include <botan/internal/simd_4x32.h>
14#if defined(BOTAN_HAS_POLYVAL)
15 #include <botan/internal/polyval.h>
35 mid ^=
clmul<0x00>(H1 ^ H1.shift_elems_right<2>(), X1 ^ X1.shift_elems_right<2>());
36 mid ^=
clmul<0x00>(H2 ^ H2.shift_elems_right<2>(), X2 ^ X2.shift_elems_right<2>());
37 mid ^=
clmul<0x00>(H3 ^ H3.shift_elems_right<2>(), X3 ^ X3.shift_elems_right<2>());
38 mid ^=
clmul<0x00>(H4 ^ H4.shift_elems_right<2>(), X4 ^ X4.shift_elems_right<2>());
42 return polyval_reduce(hi ^ mid.shift_elems_right<2>(), lo ^ mid.shift_elems_left<2>());
69 mid ^=
clmul<0x00>(H1 ^ H1.shift_elems_right<2>(), X1 ^ X1.shift_elems_right<2>());
70 mid ^=
clmul<0x00>(H2 ^ H2.shift_elems_right<2>(), X2 ^ X2.shift_elems_right<2>());
71 mid ^=
clmul<0x00>(H3 ^ H3.shift_elems_right<2>(), X3 ^ X3.shift_elems_right<2>());
72 mid ^=
clmul<0x00>(H4 ^ H4.shift_elems_right<2>(), X4 ^ X4.shift_elems_right<2>());
73 mid ^=
clmul<0x00>(H5 ^ H5.shift_elems_right<2>(), X5 ^ X5.shift_elems_right<2>());
74 mid ^=
clmul<0x00>(H6 ^ H6.shift_elems_right<2>(), X6 ^ X6.shift_elems_right<2>());
75 mid ^=
clmul<0x00>(H7 ^ H7.shift_elems_right<2>(), X7 ^ X7.shift_elems_right<2>());
76 mid ^=
clmul<0x00>(H8 ^ H8.shift_elems_right<2>(), X8 ^ X8.shift_elems_right<2>());
80 return polyval_reduce(hi ^ mid.shift_elems_right<2>(), lo ^ mid.shift_elems_left<2>());
90 H1.store_le(&H_pow[0]);
91 H2.store_le(&H_pow[2]);
92 H3.store_le(&H_pow[4]);
93 H4.store_le(&H_pow[6]);
97void BOTAN_FN_ISA_CLMUL
110 if(H_pow.size() < 2 * 8) {
116 H5.store_le(&H_pow[8]);
117 H6.store_le(&H_pow[10]);
118 H7.store_le(&H_pow[12]);
119 H8.store_le(&H_pow[14]);
137 a = polyval_multiply_x8(H1, H2, H3, H4, H5, H6, H7, H8, m7, m6, m5, m4, m3, m2, m1, m0 ^ a);
156 a = polyval_multiply_x4(H1, H2, H3, H4, m3, m2, m1, a);
163 for(
size_t i = 0; i != blocks; ++i) {
175void BOTAN_FN_ISA_CLMUL GHASH::ghash_precompute_cpu(
const uint8_t H_bytes[16],
secure_vector<uint64_t>& H_pow) {
179void BOTAN_FN_ISA_CLMUL GHASH::ghash_multiply_cpu(uint8_t x[16],
181 const uint8_t input[],
183 multiply_clmul<true>(x, H_pow, input, blocks);
186#if defined(BOTAN_HAS_POLYVAL)
192void BOTAN_FN_ISA_CLMUL Polyval::polyval_multiply_cpu(uint8_t x[16],
194 const uint8_t input[],
196 multiply_clmul<false>(x, H_pow, input, blocks);
#define BOTAN_ASSERT_NOMSG(expr)
static SIMD_4x32 BOTAN_FN_ISA_SIMD_4X32 load_le(const void *in) noexcept
BOTAN_FORCE_INLINE SIMD_4x32 BOTAN_FN_ISA_SIMD_4X32 mulx_polyval(const SIMD_4x32 &h)
BOTAN_FORCE_INLINE BOTAN_FN_ISA_SIMD_4X32 SIMD_4x32 load_block(const uint8_t in[])
BOTAN_FORCE_INLINE SIMD_4x32 BOTAN_FN_ISA_CLMUL polyval_multiply(const SIMD_4x32 &H, const SIMD_4x32 &x)
BOTAN_FORCE_INLINE SIMD_4x32 BOTAN_FN_ISA_CLMUL polyval_reduce(const SIMD_4x32 &hi, const SIMD_4x32 &lo)
BOTAN_FORCE_INLINE BOTAN_FN_ISA_CLMUL SIMD_4x32 clmul(const SIMD_4x32 &H, const SIMD_4x32 &x)
BOTAN_FORCE_INLINE BOTAN_FN_ISA_SIMD_4X32 SIMD_4x32 reverse_vector(const SIMD_4x32 &in)
std::vector< T, secure_allocator< T > > secure_vector
BOTAN_FORCE_INLINE BOTAN_FN_ISA_SIMD_4X32 void store_block(const SIMD_4x32 &b, uint8_t out[])