32 #ifndef MCKL_RANDOM_INTERNAL_AES_AESNI_AES192_HPP 33 #define MCKL_RANDOM_INTERNAL_AES_AESNI_AES192_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 xmm7_ = _mm_set_epi32(0, 0, static_cast<int>(std::get<5>(key)),
69 static_cast<int>(std::get<4>(key)));
70 std::get<0>(rk) = xmm1_;
71 std::get<1>(rk) = xmm7_;
73 xmm3_ = _mm_setzero_si128();
74 xmm6_ = _mm_setzero_si128();
75 xmm4_ = _mm_shuffle_epi32(xmm7_, 0x4F);
77 std::array<char, Rp1 * 16 + 16> rk_tmp;
79 rk_tmp.data(), std::integral_constant<bool, 24 < Rp1 * 16>());
81 rk, rk_tmp.data(), std::integral_constant<bool, 24 < Rp1 * 16>());
93 template <std::
size_t, std::
size_t>
94 void generate(
char *, std::false_type)
98 template <std::
size_t N, std::
size_t Rp1>
99 void generate(
char *rk_ptr, std::true_type)
101 generate_key<N>(rk_ptr);
103 rk_ptr, std::integral_constant<bool, N * 24 + 16 < Rp1 * 16>());
104 generate<N + 1, Rp1>(
105 rk_ptr, std::integral_constant<bool, N * 24 + 24 < Rp1 * 16>());
108 template <std::
size_t N>
109 void generate_key(
char *rk_ptr)
112 xmm2_ = aeskeygenassist_si128<N % 256>(xmm4_);
113 generate_key_expansion();
114 _mm_storeu_si128(reinterpret_cast<__m128i *>(rk_ptr + N * 24), xmm1_);
117 template <std::
size_t>
118 void complete_key(
char *, std::false_type)
122 template <std::
size_t N>
123 void complete_key(
char *rk_ptr, std::true_type)
126 complete_key_expansion();
128 reinterpret_cast<__m128i *>(rk_ptr + N * 24 + 16), xmm7_);
131 void generate_key_expansion()
133 xmm2_ = _mm_shuffle_epi32(xmm2_, 0xFF);
134 xmm3_ = _mm_castps_si128(_mm_shuffle_ps(
135 _mm_castsi128_ps(xmm3_), _mm_castsi128_ps(xmm1_), 0x10));
136 xmm1_ = _mm_xor_si128(xmm1_, xmm3_);
137 xmm3_ = _mm_castps_si128(_mm_shuffle_ps(
138 _mm_castsi128_ps(xmm3_), _mm_castsi128_ps(xmm1_), 0x8C));
139 xmm1_ = _mm_xor_si128(xmm1_, xmm3_);
140 xmm1_ = _mm_xor_si128(xmm1_, xmm2_);
143 void complete_key_expansion()
146 xmm5_ = _mm_slli_si128(xmm5_, 4);
147 xmm6_ = _mm_castps_si128(_mm_shuffle_ps(
148 _mm_castsi128_ps(xmm6_), _mm_castsi128_ps(xmm1_), 0xF0));
149 xmm6_ = _mm_xor_si128(xmm6_, xmm5_);
150 xmm4_ = _mm_xor_si128(xmm4_, xmm6_);
151 xmm7_ = _mm_shuffle_epi32(xmm4_, 0x0E);
154 template <std::
size_t Rp1>
155 void copy_key(std::array<__m128i, Rp1> &,
const char *, std::false_type)
159 template <std::
size_t Rp1>
161 std::array<__m128i, Rp1> &rk,
const char *rk_ptr, std::true_type)
163 char *dst =
reinterpret_cast<char *
>(rk.data());
164 std::memcpy(dst + 24, rk_ptr + 24, Rp1 * 16 - 24);
176 _mm_loadu_si128(reinterpret_cast<const __m128i *>(plain));
178 xmm0 = _mm_xor_si128(xmm0, ks.
get<0x0>());
179 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x1>());
180 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x2>());
181 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x3>());
182 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x4>());
183 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x5>());
184 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x6>());
185 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x7>());
186 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x8>());
187 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x9>());
188 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xA>());
189 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xB>());
190 xmm0 = _mm_aesenclast_si128(xmm0, ks.
get<0xC>());
192 _mm_storeu_si128(reinterpret_cast<__m128i *>(cipher), xmm0);
195 template <
typename ResultType>
197 std::array<std::uint64_t, 2> &ctr, ResultType *r,
const KeySeqType &ks)
202 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(ctr)),
203 static_cast<MCKL_INT64>(std::get<0>(ctr)));
205 xmm0 = _mm_xor_si128(xmm0, ks.
get<0x0>());
206 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x1>());
207 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x2>());
208 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x3>());
209 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x4>());
210 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x5>());
211 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x6>());
212 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x7>());
213 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x8>());
214 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x9>());
215 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xA>());
216 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xB>());
217 xmm0 = _mm_aesenclast_si128(xmm0, ks.
get<0xC>());
219 _mm_storeu_si128(reinterpret_cast<__m128i *>(r), xmm0);
225 template <
typename ResultType>
226 static void eval_kernel(std::array<std::uint64_t, 2> &ctr, std::size_t n,
229 #if MCKL_USE_ASM_LIBRARY 235 #else // MCKL_USE_ASM_LIBRARY 236 constexpr std::size_t
S = 8;
237 constexpr std::size_t N = S;
239 const std::array<__m128i, KeySeqType::rounds() + 1> rk(ks.
get());
242 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(ctr)),
243 static_cast<MCKL_INT64>(std::get<0>(ctr)));
246 __m128i *rptr =
reinterpret_cast<__m128i *
>(r);
248 __m128i xmm0 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 1));
249 __m128i xmm1 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 2));
250 __m128i xmm2 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 3));
251 __m128i xmm3 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 4));
252 __m128i xmm4 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 5));
253 __m128i xmm5 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 6));
254 __m128i xmm6 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 7));
255 __m128i xmm7 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 8));
273 #endif // MCKL_USE_ASM_LIBRARY 283 #endif // MCKL_RANDOM_INTERNAL_AES_AESNI_AES192_HPP static key_type key(const std::array< __m128i, Rp1 > &rk)
std::array< std::uint32_t, 6 > key_type
void mckl_aes192_aesni_sse2_kernel(uint64_t *, size_t, void *, const void *)
#define MCKL_PUSH_GCC_WARNING(warning)
#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
static void eval(const void *plain, void *cipher, const KeySeqType &ks)
void increment(std::array< T, K > &ctr, std::integral_constant< T, NSkip >)
Increment a counter by given steps.
void operator()(const key_type &key, std::array< __m128i, Rp1 > &rk)
static void eval(std::array< std::uint64_t, 2 > &ctr, ResultType *r, const KeySeqType &ks)
void mckl_aes192_aesni_avx2_kernel(uint64_t *, size_t, void *, const void *)
#define MCKL_RANDOM_INTERNAL_AES_AESNI_ENCLAST(xmmk)
#define MCKL_POP_GCC_WARNING