32 #ifndef MCKL_RANDOM_INTERNAL_AES_AESNI_AES256_HPP 33 #define MCKL_RANDOM_INTERNAL_AES_AESNI_AES256_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 xmm3_ = _mm_set_epi32(static_cast<int>(std::get<7>(key)),
69 static_cast<int>(std::get<6>(key)),
70 static_cast<int>(std::get<5>(key)),
71 static_cast<int>(std::get<4>(key)));
72 std::get<0>(rk) = xmm1_;
73 std::get<1>(rk) = xmm3_;
74 generate<2>(rk, std::integral_constant<bool, 2 < Rp1>());
83 template <std::
size_t, std::
size_t Rp1>
84 void generate(std::array<__m128i, Rp1> &, std::false_type)
88 template <std::
size_t N, std::
size_t Rp1>
89 void generate(std::array<__m128i, Rp1> &rk, std::true_type)
91 generate_key<N>(rk, std::integral_constant<bool, N % 2 == 0>());
92 generate<N + 1>(rk, std::integral_constant<bool, N + 1 < Rp1>());
95 template <std::
size_t N, std::
size_t Rp1>
96 void generate_key(std::array<__m128i, Rp1> &rk, std::true_type)
99 expand_key(std::true_type());
100 std::get<N>(rk) = xmm1_;
103 template <std::
size_t N, std::
size_t Rp1>
104 void generate_key(std::array<__m128i, Rp1> &rk, std::false_type)
106 xmm4_ = aeskeygenassist_si128<0>(xmm1_);
107 expand_key(std::false_type());
108 std::get<N>(rk) = xmm3_;
111 void expand_key(std::true_type)
113 xmm2_ = _mm_shuffle_epi32(xmm2_, 0xFF);
114 xmm4_ = _mm_slli_si128(xmm1_, 4);
115 xmm1_ = _mm_xor_si128(xmm1_, xmm4_);
116 xmm4_ = _mm_slli_si128(xmm4_, 4);
117 xmm1_ = _mm_xor_si128(xmm1_, xmm4_);
118 xmm4_ = _mm_slli_si128(xmm4_, 4);
119 xmm1_ = _mm_xor_si128(xmm1_, xmm4_);
120 xmm1_ = _mm_xor_si128(xmm1_, xmm2_);
123 void expand_key(std::false_type)
125 xmm2_ = _mm_shuffle_epi32(xmm4_, 0xAA);
126 xmm4_ = _mm_slli_si128(xmm3_, 4);
127 xmm3_ = _mm_xor_si128(xmm3_, xmm4_);
128 xmm4_ = _mm_slli_si128(xmm4_, 4);
129 xmm3_ = _mm_xor_si128(xmm3_, xmm4_);
130 xmm4_ = _mm_slli_si128(xmm4_, 4);
131 xmm3_ = _mm_xor_si128(xmm3_, xmm4_);
132 xmm3_ = _mm_xor_si128(xmm3_, xmm2_);
144 _mm_loadu_si128(reinterpret_cast<const __m128i *>(plain));
146 xmm0 = _mm_xor_si128(xmm0, ks.
get<0x0>());
147 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x1>());
148 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x2>());
149 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x3>());
150 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x4>());
151 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x5>());
152 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x6>());
153 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x7>());
154 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x8>());
155 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x9>());
156 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xA>());
157 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xB>());
158 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xC>());
159 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xD>());
160 xmm0 = _mm_aesenclast_si128(xmm0, ks.
get<0xE>());
162 _mm_storeu_si128(reinterpret_cast<__m128i *>(cipher), xmm0);
165 template <
typename ResultType>
167 std::array<std::uint64_t, 2> &ctr, ResultType *r,
const KeySeqType &ks)
172 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(ctr)),
173 static_cast<MCKL_INT64>(std::get<0>(ctr)));
175 xmm0 = _mm_xor_si128(xmm0, ks.
get<0x0>());
176 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x1>());
177 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x2>());
178 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x3>());
179 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x4>());
180 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x5>());
181 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x6>());
182 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x7>());
183 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x8>());
184 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0x9>());
185 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xA>());
186 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xB>());
187 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xC>());
188 xmm0 = _mm_aesenc_si128(xmm0, ks.
get<0xD>());
189 xmm0 = _mm_aesenclast_si128(xmm0, ks.
get<0xE>());
191 _mm_storeu_si128(reinterpret_cast<__m128i *>(r), xmm0);
197 template <
typename ResultType>
198 static void eval_kernel(std::array<std::uint64_t, 2> &ctr, std::size_t n,
201 #if MCKL_USE_ASM_LIBRARY 207 #else // MCKL_USE_ASM_LIBRARY 208 constexpr std::size_t
S = 8;
209 constexpr std::size_t N = S;
211 const std::array<__m128i, KeySeqType::rounds() + 1> rk(ks.
get());
214 _mm_set_epi64x(static_cast<MCKL_INT64>(std::get<1>(ctr)),
215 static_cast<MCKL_INT64>(std::get<0>(ctr)));
218 __m128i *rptr =
reinterpret_cast<__m128i *
>(r);
220 __m128i xmm0 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 1));
221 __m128i xmm1 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 2));
222 __m128i xmm2 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 3));
223 __m128i xmm3 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 4));
224 __m128i xmm4 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 5));
225 __m128i xmm5 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 6));
226 __m128i xmm6 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 7));
227 __m128i xmm7 = _mm_add_epi64(xmmc, _mm_set_epi64x(0, 8));
247 #endif // MCKL_USE_ASM_LIBRARY 257 #endif // MCKL_RANDOM_INTERNAL_AES_AESNI_AES256_HPP #define MCKL_PUSH_GCC_WARNING(warning)
std::array< std::uint32_t, 8 > key_type
static void eval(const void *plain, void *cipher, const KeySeqType &ks)
void mckl_aes256_aesni_sse2_kernel(uint64_t *, size_t, void *, const void *)
void mckl_aes256_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)
void operator()(const key_type &key, std::array< __m128i, Rp1 > &rk)
#define MCKL_RANDOM_INTERNAL_AES_AESNI_EVAL
static void eval(std::array< std::uint64_t, 2 > &ctr, ResultType *r, const KeySeqType &ks)
void increment(std::array< T, K > &ctr, std::integral_constant< T, NSkip >)
Increment a counter by given steps.
static key_type key(const std::array< __m128i, Rp1 > &rk)
#define MCKL_RANDOM_INTERNAL_AES_AESNI_ENCLAST(xmmk)
#define MCKL_POP_GCC_WARNING
__m128i aeskeygenassist_si128(const __m128i &)