32 #ifndef MCKL_RANDOM_INTERNAL_AES_AESNI_AES128_HPP 33 #define MCKL_RANDOM_INTERNAL_AES_AESNI_AES128_HPP 52 template <std::
size_t Rp1>
56 std::memcpy(key.data(), rk.data(),
sizeof(
key_type));
61 template <std::
size_t Rp1>
64 xmm1_ = _mm_set_epi32(static_cast<int>(std::get<3>(key)),
65 static_cast<int>(std::get<2>(key)),
66 static_cast<int>(std::get<1>(key)),
67 static_cast<int>(std::get<0>(key)));
68 std::get<0>(rk) = xmm1_;
69 generate<1>(rk, std::integral_constant<bool, 1 < Rp1>());
77 template <std::
size_t, std::
size_t Rp1>
78 void generate(std::array<__m128i, Rp1> &, std::false_type)
82 template <std::
size_t N, std::
size_t Rp1>
83 void generate(std::array<__m128i, Rp1> &rk, std::true_type)
85 xmm2_ = aeskeygenassist_si128<N % 256>(xmm1_);
87 std::get<N>(rk) = xmm1_;
88 generate<N + 1>(rk, std::integral_constant<bool, N + 1 < Rp1>());
93 xmm2_ = _mm_shuffle_epi32(xmm2_, 0xFF);
94 xmm3_ = _mm_slli_si128(xmm1_, 4);
95 xmm1_ = _mm_xor_si128(xmm1_, xmm3_);
96 xmm3_ = _mm_slli_si128(xmm3_, 4);
97 xmm1_ = _mm_xor_si128(xmm1_, xmm3_);
98 xmm3_ = _mm_slli_si128(xmm3_, 4);
99 xmm1_ = _mm_xor_si128(xmm1_, xmm3_);
100 xmm1_ = _mm_xor_si128(xmm1_, xmm2_);
112 _mm_loadu_si128(reinterpret_cast<const __m128i *>(plain));
114 xmm0 = _mm_xor_si128(xmm0, ks.
get<0x0>());
115 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x1>());
116 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x2>());
117 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x3>());
118 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x4>());
119 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x5>());
120 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x6>());
121 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x7>());
122 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x8>());
123 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x9>());
124 xmm0 = _mm_aesenclast_si128(xmm0, ks.
get<0xA>());
126 _mm_storeu_si128(reinterpret_cast<__m128i *>(cipher), xmm0);
129 template <
typename ResultType>
131 std::array<std::uint64_t, 2> &ctr, ResultType *r,
const KeySeqType &ks)
136 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(ctr)),
137 static_cast<MCKL_INT64>(std::get<0>(ctr)));
139 xmm0 = _mm_xor_si128(xmm0, ks.
get<0x0>());
140 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x1>());
141 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x2>());
142 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x3>());
143 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x4>());
144 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x5>());
145 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x6>());
146 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x7>());
147 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x8>());
148 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x9>());
149 xmm0 = _mm_aesenclast_si128(xmm0, ks.
get<0xA>());
151 _mm_storeu_si128(reinterpret_cast<__m128i *>(r), xmm0);
157 template <
typename ResultType>
158 static void eval_kernel(std::array<std::uint64_t, 2> &ctr, std::size_t n,
161 #if MCKL_USE_ASM_LIBRARY 167 #else // MCKL_USE_ASM_LIBRARY 168 constexpr std::size_t
S = 8;
169 constexpr std::size_t N = S;
171 const std::array<__m128i, KeySeqType::rounds() + 1> rk(ks.
get());
174 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(ctr)),
175 static_cast<MCKL_INT64>(std::get<0>(ctr)));
178 __m128i *rptr =
reinterpret_cast<__m128i *
>(r);
180 __m128i xmm0 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 1));
181 __m128i xmm1 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 2));
182 __m128i xmm2 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 3));
183 __m128i xmm3 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 4));
184 __m128i xmm4 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 5));
185 __m128i xmm5 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 6));
186 __m128i xmm6 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 7));
187 __m128i xmm7 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 8));
203 #endif // MCKL_USE_ASM_LIBRARY 213 #endif // MCKL_RANDOM_INTERNAL_AES_AESNI_AES128_HPP
#define MCKL_PUSH_GCC_WARNING(warning)
static void eval(std::array< std::uint64_t, 2 > &ctr, ResultType *r, const KeySeqType &ks)
void mckl_aes128_aesni_avx2_kernel(uint64_t *, size_t, void *, const void *)
#define MCKL_RANDOM_INTERNAL_AES_AESNI_ENC(xmmk)
const std::array< rk_type, rounds()+1 > & get() const
#define MCKL_RANDOM_INTERNAL_AES_AESNI_STORE(n, N, rptr)
#define MCKL_RANDOM_INTERNAL_AES_AESNI_ENCFIRST(xmmk)
#define MCKL_RANDOM_INTERNAL_AES_AESNI_EVAL
void increment(std::array< T, K > &ctr, std::integral_constant< T, NSkip >)
Increment a counter by given steps.
static void eval(const void *plain, void *cipher, const KeySeqType &ks)
void operator()(const key_type &key, std::array< __m128i, Rp1 > &rk)
void mckl_aes128_aesni_sse2_kernel(uint64_t *, size_t, void *, const void *)
static key_type key(const std::array< __m128i, Rp1 > &rk)
std::array< std::uint32_t, 4 > key_type
#define MCKL_RANDOM_INTERNAL_AES_AESNI_ENCLAST(xmmk)
#define MCKL_POP_GCC_WARNING