7#include <botan/internal/aes.h>
9#include <botan/internal/isa_extn.h>
10#include <botan/internal/loadstor.h>
11#include <botan/internal/simd_avx2.h>
26 B =
SIMD_8x32(_mm256_aesenc_epi128(B.raw(), K.raw()));
31 B0 =
SIMD_8x32(_mm256_aesenc_epi128(B0.raw(), K.raw()));
32 B1 =
SIMD_8x32(_mm256_aesenc_epi128(B1.raw(), K.raw()));
33 B2 =
SIMD_8x32(_mm256_aesenc_epi128(B2.raw(), K.raw()));
34 B3 =
SIMD_8x32(_mm256_aesenc_epi128(B3.raw(), K.raw()));
38 B =
SIMD_8x32(_mm256_aesenclast_epi128(B.raw(), K.raw()));
43 B0 =
SIMD_8x32(_mm256_aesenclast_epi128(B0.raw(), K.raw()));
44 B1 =
SIMD_8x32(_mm256_aesenclast_epi128(B1.raw(), K.raw()));
45 B2 =
SIMD_8x32(_mm256_aesenclast_epi128(B2.raw(), K.raw()));
46 B3 =
SIMD_8x32(_mm256_aesenclast_epi128(B3.raw(), K.raw()));
50 B =
SIMD_8x32(_mm256_aesdec_epi128(B.raw(), K.raw()));
55 B0 =
SIMD_8x32(_mm256_aesdec_epi128(B0.raw(), K.raw()));
56 B1 =
SIMD_8x32(_mm256_aesdec_epi128(B1.raw(), K.raw()));
57 B2 =
SIMD_8x32(_mm256_aesdec_epi128(B2.raw(), K.raw()));
58 B3 =
SIMD_8x32(_mm256_aesdec_epi128(B3.raw(), K.raw()));
62 B =
SIMD_8x32(_mm256_aesdeclast_epi128(B.raw(), K.raw()));
67 B0 =
SIMD_8x32(_mm256_aesdeclast_epi128(B0.raw(), K.raw()));
68 B1 =
SIMD_8x32(_mm256_aesdeclast_epi128(B1.raw(), K.raw()));
69 B2 =
SIMD_8x32(_mm256_aesdeclast_epi128(B2.raw(), K.raw()));
70 B3 =
SIMD_8x32(_mm256_aesdeclast_epi128(B3.raw(), K.raw()));
78BOTAN_FN_ISA_AVX2_VAES
void AES_128::x86_vaes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
97 keyxor(K0, B0, B1, B2, B3);
98 aesenc(K1, B0, B1, B2, B3);
99 aesenc(K2, B0, B1, B2, B3);
100 aesenc(K3, B0, B1, B2, B3);
101 aesenc(K4, B0, B1, B2, B3);
102 aesenc(K5, B0, B1, B2, B3);
103 aesenc(K6, B0, B1, B2, B3);
104 aesenc(K7, B0, B1, B2, B3);
105 aesenc(K8, B0, B1, B2, B3);
106 aesenc(K9, B0, B1, B2, B3);
107 aesenclast(K10, B0, B1, B2, B3);
110 B1.store_le(out + 16 * 2);
111 B2.store_le(out + 16 * 4);
112 B3.store_le(out + 16 * 6);
163BOTAN_FN_ISA_AVX2_VAES
void AES_128::x86_vaes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
182 keyxor(K0, B0, B1, B2, B3);
183 aesdec(K1, B0, B1, B2, B3);
184 aesdec(K2, B0, B1, B2, B3);
185 aesdec(K3, B0, B1, B2, B3);
186 aesdec(K4, B0, B1, B2, B3);
187 aesdec(K5, B0, B1, B2, B3);
188 aesdec(K6, B0, B1, B2, B3);
189 aesdec(K7, B0, B1, B2, B3);
190 aesdec(K8, B0, B1, B2, B3);
191 aesdec(K9, B0, B1, B2, B3);
192 aesdeclast(K10, B0, B1, B2, B3);
194 B0.store_le(out + 16 * 0);
195 B1.store_le(out + 16 * 2);
196 B2.store_le(out + 16 * 4);
197 B3.store_le(out + 16 * 6);
248BOTAN_FN_ISA_AVX2_VAES
void AES_192::x86_vaes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
269 keyxor(K0, B0, B1, B2, B3);
270 aesenc(K1, B0, B1, B2, B3);
271 aesenc(K2, B0, B1, B2, B3);
272 aesenc(K3, B0, B1, B2, B3);
273 aesenc(K4, B0, B1, B2, B3);
274 aesenc(K5, B0, B1, B2, B3);
275 aesenc(K6, B0, B1, B2, B3);
276 aesenc(K7, B0, B1, B2, B3);
277 aesenc(K8, B0, B1, B2, B3);
278 aesenc(K9, B0, B1, B2, B3);
279 aesenc(K10, B0, B1, B2, B3);
280 aesenc(K11, B0, B1, B2, B3);
281 aesenclast(K12, B0, B1, B2, B3);
283 B0.store_le(out + 16 * 0);
284 B1.store_le(out + 16 * 2);
285 B2.store_le(out + 16 * 4);
286 B3.store_le(out + 16 * 6);
341BOTAN_FN_ISA_AVX2_VAES
void AES_192::x86_vaes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
362 keyxor(K0, B0, B1, B2, B3);
363 aesdec(K1, B0, B1, B2, B3);
364 aesdec(K2, B0, B1, B2, B3);
365 aesdec(K3, B0, B1, B2, B3);
366 aesdec(K4, B0, B1, B2, B3);
367 aesdec(K5, B0, B1, B2, B3);
368 aesdec(K6, B0, B1, B2, B3);
369 aesdec(K7, B0, B1, B2, B3);
370 aesdec(K8, B0, B1, B2, B3);
371 aesdec(K9, B0, B1, B2, B3);
372 aesdec(K10, B0, B1, B2, B3);
373 aesdec(K11, B0, B1, B2, B3);
374 aesdeclast(K12, B0, B1, B2, B3);
376 B0.store_le(out + 16 * 0);
377 B1.store_le(out + 16 * 2);
378 B2.store_le(out + 16 * 4);
379 B3.store_le(out + 16 * 6);
431BOTAN_FN_ISA_AVX2_VAES
void AES_256::x86_vaes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
454 keyxor(K0, B0, B1, B2, B3);
455 aesenc(K1, B0, B1, B2, B3);
456 aesenc(K2, B0, B1, B2, B3);
457 aesenc(K3, B0, B1, B2, B3);
458 aesenc(K4, B0, B1, B2, B3);
459 aesenc(K5, B0, B1, B2, B3);
460 aesenc(K6, B0, B1, B2, B3);
461 aesenc(K7, B0, B1, B2, B3);
462 aesenc(K8, B0, B1, B2, B3);
463 aesenc(K9, B0, B1, B2, B3);
464 aesenc(K10, B0, B1, B2, B3);
465 aesenc(K11, B0, B1, B2, B3);
466 aesenc(K12, B0, B1, B2, B3);
467 aesenc(K13, B0, B1, B2, B3);
468 aesenclast(K14, B0, B1, B2, B3);
470 B0.store_le(out + 16 * 0);
471 B1.store_le(out + 16 * 2);
472 B2.store_le(out + 16 * 4);
473 B3.store_le(out + 16 * 6);
532BOTAN_FN_ISA_AVX2_VAES
void AES_256::x86_vaes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
555 keyxor(K0, B0, B1, B2, B3);
556 aesdec(K1, B0, B1, B2, B3);
557 aesdec(K2, B0, B1, B2, B3);
558 aesdec(K3, B0, B1, B2, B3);
559 aesdec(K4, B0, B1, B2, B3);
560 aesdec(K5, B0, B1, B2, B3);
561 aesdec(K6, B0, B1, B2, B3);
562 aesdec(K7, B0, B1, B2, B3);
563 aesdec(K8, B0, B1, B2, B3);
564 aesdec(K9, B0, B1, B2, B3);
565 aesdec(K10, B0, B1, B2, B3);
566 aesdec(K11, B0, B1, B2, B3);
567 aesdec(K12, B0, B1, B2, B3);
568 aesdec(K13, B0, B1, B2, B3);
569 aesdeclast(K14, B0, B1, B2, B3);
571 B0.store_le(out + 16 * 0);
572 B1.store_le(out + 16 * 2);
573 B2.store_le(out + 16 * 4);
574 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