7#include <botan/internal/aes.h>
9#include <botan/internal/isa_extn.h>
10#include <botan/internal/simd_avx2.h>
28 B =
SIMD_8x32(_mm256_aesenc_epi128(B.raw(), K.raw()));
33 B0 =
SIMD_8x32(_mm256_aesenc_epi128(B0.raw(), K.raw()));
34 B1 =
SIMD_8x32(_mm256_aesenc_epi128(B1.raw(), K.raw()));
35 B2 =
SIMD_8x32(_mm256_aesenc_epi128(B2.raw(), K.raw()));
36 B3 =
SIMD_8x32(_mm256_aesenc_epi128(B3.raw(), K.raw()));
40 B =
SIMD_8x32(_mm256_aesenclast_epi128(B.raw(), K.raw()));
45 B0 =
SIMD_8x32(_mm256_aesenclast_epi128(B0.raw(), K.raw()));
46 B1 =
SIMD_8x32(_mm256_aesenclast_epi128(B1.raw(), K.raw()));
47 B2 =
SIMD_8x32(_mm256_aesenclast_epi128(B2.raw(), K.raw()));
48 B3 =
SIMD_8x32(_mm256_aesenclast_epi128(B3.raw(), K.raw()));
52 B =
SIMD_8x32(_mm256_aesdec_epi128(B.raw(), K.raw()));
57 B0 =
SIMD_8x32(_mm256_aesdec_epi128(B0.raw(), K.raw()));
58 B1 =
SIMD_8x32(_mm256_aesdec_epi128(B1.raw(), K.raw()));
59 B2 =
SIMD_8x32(_mm256_aesdec_epi128(B2.raw(), K.raw()));
60 B3 =
SIMD_8x32(_mm256_aesdec_epi128(B3.raw(), K.raw()));
64 B =
SIMD_8x32(_mm256_aesdeclast_epi128(B.raw(), K.raw()));
69 B0 =
SIMD_8x32(_mm256_aesdeclast_epi128(B0.raw(), K.raw()));
70 B1 =
SIMD_8x32(_mm256_aesdeclast_epi128(B1.raw(), K.raw()));
71 B2 =
SIMD_8x32(_mm256_aesdeclast_epi128(B2.raw(), K.raw()));
72 B3 =
SIMD_8x32(_mm256_aesdeclast_epi128(B3.raw(), K.raw()));
82BOTAN_FN_ISA_AVX2_VAES
void AES_128::x86_vaes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
101 keyxor(K0, B0, B1, B2, B3);
102 aesenc(K1, B0, B1, B2, B3);
103 aesenc(K2, B0, B1, B2, B3);
104 aesenc(K3, B0, B1, B2, B3);
105 aesenc(K4, B0, B1, B2, B3);
106 aesenc(K5, B0, B1, B2, B3);
107 aesenc(K6, B0, B1, B2, B3);
108 aesenc(K7, B0, B1, B2, B3);
109 aesenc(K8, B0, B1, B2, B3);
110 aesenc(K9, B0, B1, B2, B3);
111 aesenclast(K10, B0, B1, B2, B3);
114 B1.store_le(out + 16 * 2);
115 B2.store_le(out + 16 * 4);
116 B3.store_le(out + 16 * 6);
167BOTAN_FN_ISA_AVX2_VAES
void AES_128::x86_vaes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
186 keyxor(K0, B0, B1, B2, B3);
187 aesdec(K1, B0, B1, B2, B3);
188 aesdec(K2, B0, B1, B2, B3);
189 aesdec(K3, B0, B1, B2, B3);
190 aesdec(K4, B0, B1, B2, B3);
191 aesdec(K5, B0, B1, B2, B3);
192 aesdec(K6, B0, B1, B2, B3);
193 aesdec(K7, B0, B1, B2, B3);
194 aesdec(K8, B0, B1, B2, B3);
195 aesdec(K9, B0, B1, B2, B3);
196 aesdeclast(K10, B0, B1, B2, B3);
198 B0.store_le(out + 16 * 0);
199 B1.store_le(out + 16 * 2);
200 B2.store_le(out + 16 * 4);
201 B3.store_le(out + 16 * 6);
252BOTAN_FN_ISA_AVX2_VAES
void AES_192::x86_vaes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
273 keyxor(K0, B0, B1, B2, B3);
274 aesenc(K1, B0, B1, B2, B3);
275 aesenc(K2, B0, B1, B2, B3);
276 aesenc(K3, B0, B1, B2, B3);
277 aesenc(K4, B0, B1, B2, B3);
278 aesenc(K5, B0, B1, B2, B3);
279 aesenc(K6, B0, B1, B2, B3);
280 aesenc(K7, B0, B1, B2, B3);
281 aesenc(K8, B0, B1, B2, B3);
282 aesenc(K9, B0, B1, B2, B3);
283 aesenc(K10, B0, B1, B2, B3);
284 aesenc(K11, B0, B1, B2, B3);
285 aesenclast(K12, B0, B1, B2, B3);
287 B0.store_le(out + 16 * 0);
288 B1.store_le(out + 16 * 2);
289 B2.store_le(out + 16 * 4);
290 B3.store_le(out + 16 * 6);
345BOTAN_FN_ISA_AVX2_VAES
void AES_192::x86_vaes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
366 keyxor(K0, B0, B1, B2, B3);
367 aesdec(K1, B0, B1, B2, B3);
368 aesdec(K2, B0, B1, B2, B3);
369 aesdec(K3, B0, B1, B2, B3);
370 aesdec(K4, B0, B1, B2, B3);
371 aesdec(K5, B0, B1, B2, B3);
372 aesdec(K6, B0, B1, B2, B3);
373 aesdec(K7, B0, B1, B2, B3);
374 aesdec(K8, B0, B1, B2, B3);
375 aesdec(K9, B0, B1, B2, B3);
376 aesdec(K10, B0, B1, B2, B3);
377 aesdec(K11, B0, B1, B2, B3);
378 aesdeclast(K12, B0, B1, B2, B3);
380 B0.store_le(out + 16 * 0);
381 B1.store_le(out + 16 * 2);
382 B2.store_le(out + 16 * 4);
383 B3.store_le(out + 16 * 6);
435BOTAN_FN_ISA_AVX2_VAES
void AES_256::x86_vaes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
458 keyxor(K0, B0, B1, B2, B3);
459 aesenc(K1, B0, B1, B2, B3);
460 aesenc(K2, B0, B1, B2, B3);
461 aesenc(K3, B0, B1, B2, B3);
462 aesenc(K4, B0, B1, B2, B3);
463 aesenc(K5, B0, B1, B2, B3);
464 aesenc(K6, B0, B1, B2, B3);
465 aesenc(K7, B0, B1, B2, B3);
466 aesenc(K8, B0, B1, B2, B3);
467 aesenc(K9, B0, B1, B2, B3);
468 aesenc(K10, B0, B1, B2, B3);
469 aesenc(K11, B0, B1, B2, B3);
470 aesenc(K12, B0, B1, B2, B3);
471 aesenc(K13, B0, B1, B2, B3);
472 aesenclast(K14, B0, B1, B2, B3);
474 B0.store_le(out + 16 * 0);
475 B1.store_le(out + 16 * 2);
476 B2.store_le(out + 16 * 4);
477 B3.store_le(out + 16 * 6);
536BOTAN_FN_ISA_AVX2_VAES
void AES_256::x86_vaes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
559 keyxor(K0, B0, B1, B2, B3);
560 aesdec(K1, B0, B1, B2, B3);
561 aesdec(K2, B0, B1, B2, B3);
562 aesdec(K3, B0, B1, B2, B3);
563 aesdec(K4, B0, B1, B2, B3);
564 aesdec(K5, B0, B1, B2, B3);
565 aesdec(K6, B0, B1, B2, B3);
566 aesdec(K7, B0, B1, B2, B3);
567 aesdec(K8, B0, B1, B2, B3);
568 aesdec(K9, B0, B1, B2, B3);
569 aesdec(K10, B0, B1, B2, B3);
570 aesdec(K11, B0, B1, B2, B3);
571 aesdec(K12, B0, B1, B2, B3);
572 aesdec(K13, B0, B1, B2, B3);
573 aesdeclast(K14, B0, B1, B2, B3);
575 B0.store_le(out + 16 * 0);
576 B1.store_le(out + 16 * 2);
577 B2.store_le(out + 16 * 4);
578 B3.store_le(out + 16 * 6);
static BOTAN_FN_ISA_AVX2 SIMD_8x32 load_le128(const uint8_t *in) noexcept
static BOTAN_FN_ISA_AVX2 SIMD_8x32 load_le(const uint8_t *in) noexcept
#define BOTAN_FORCE_INLINE