7#include <botan/internal/aes.h>
9#include <botan/internal/isa_extn.h>
10#include <botan/internal/simd_avx2.h>
27 B =
SIMD_8x32(_mm256_aesenc_epi128(B.raw(), K.raw()));
32 B0 =
SIMD_8x32(_mm256_aesenc_epi128(B0.raw(), K.raw()));
33 B1 =
SIMD_8x32(_mm256_aesenc_epi128(B1.raw(), K.raw()));
34 B2 =
SIMD_8x32(_mm256_aesenc_epi128(B2.raw(), K.raw()));
35 B3 =
SIMD_8x32(_mm256_aesenc_epi128(B3.raw(), K.raw()));
39 B =
SIMD_8x32(_mm256_aesenclast_epi128(B.raw(), K.raw()));
44 B0 =
SIMD_8x32(_mm256_aesenclast_epi128(B0.raw(), K.raw()));
45 B1 =
SIMD_8x32(_mm256_aesenclast_epi128(B1.raw(), K.raw()));
46 B2 =
SIMD_8x32(_mm256_aesenclast_epi128(B2.raw(), K.raw()));
47 B3 =
SIMD_8x32(_mm256_aesenclast_epi128(B3.raw(), K.raw()));
51 B =
SIMD_8x32(_mm256_aesdec_epi128(B.raw(), K.raw()));
56 B0 =
SIMD_8x32(_mm256_aesdec_epi128(B0.raw(), K.raw()));
57 B1 =
SIMD_8x32(_mm256_aesdec_epi128(B1.raw(), K.raw()));
58 B2 =
SIMD_8x32(_mm256_aesdec_epi128(B2.raw(), K.raw()));
59 B3 =
SIMD_8x32(_mm256_aesdec_epi128(B3.raw(), K.raw()));
63 B =
SIMD_8x32(_mm256_aesdeclast_epi128(B.raw(), K.raw()));
68 B0 =
SIMD_8x32(_mm256_aesdeclast_epi128(B0.raw(), K.raw()));
69 B1 =
SIMD_8x32(_mm256_aesdeclast_epi128(B1.raw(), K.raw()));
70 B2 =
SIMD_8x32(_mm256_aesdeclast_epi128(B2.raw(), K.raw()));
71 B3 =
SIMD_8x32(_mm256_aesdeclast_epi128(B3.raw(), K.raw()));
81BOTAN_FN_ISA_AVX2_VAES
void AES_128::x86_vaes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
100 keyxor(K0, B0, B1, B2, B3);
101 aesenc(K1, B0, B1, B2, B3);
102 aesenc(K2, B0, B1, B2, B3);
103 aesenc(K3, B0, B1, B2, B3);
104 aesenc(K4, B0, B1, B2, B3);
105 aesenc(K5, B0, B1, B2, B3);
106 aesenc(K6, B0, B1, B2, B3);
107 aesenc(K7, B0, B1, B2, B3);
108 aesenc(K8, B0, B1, B2, B3);
109 aesenc(K9, B0, B1, B2, B3);
110 aesenclast(K10, B0, B1, B2, B3);
113 B1.store_le(out + 16 * 2);
114 B2.store_le(out + 16 * 4);
115 B3.store_le(out + 16 * 6);
166BOTAN_FN_ISA_AVX2_VAES
void AES_128::x86_vaes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
185 keyxor(K0, B0, B1, B2, B3);
186 aesdec(K1, B0, B1, B2, B3);
187 aesdec(K2, B0, B1, B2, B3);
188 aesdec(K3, B0, B1, B2, B3);
189 aesdec(K4, B0, B1, B2, B3);
190 aesdec(K5, B0, B1, B2, B3);
191 aesdec(K6, B0, B1, B2, B3);
192 aesdec(K7, B0, B1, B2, B3);
193 aesdec(K8, B0, B1, B2, B3);
194 aesdec(K9, B0, B1, B2, B3);
195 aesdeclast(K10, B0, B1, B2, B3);
197 B0.store_le(out + 16 * 0);
198 B1.store_le(out + 16 * 2);
199 B2.store_le(out + 16 * 4);
200 B3.store_le(out + 16 * 6);
251BOTAN_FN_ISA_AVX2_VAES
void AES_192::x86_vaes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
272 keyxor(K0, B0, B1, B2, B3);
273 aesenc(K1, B0, B1, B2, B3);
274 aesenc(K2, B0, B1, B2, B3);
275 aesenc(K3, B0, B1, B2, B3);
276 aesenc(K4, B0, B1, B2, B3);
277 aesenc(K5, B0, B1, B2, B3);
278 aesenc(K6, B0, B1, B2, B3);
279 aesenc(K7, B0, B1, B2, B3);
280 aesenc(K8, B0, B1, B2, B3);
281 aesenc(K9, B0, B1, B2, B3);
282 aesenc(K10, B0, B1, B2, B3);
283 aesenc(K11, B0, B1, B2, B3);
284 aesenclast(K12, B0, B1, B2, B3);
286 B0.store_le(out + 16 * 0);
287 B1.store_le(out + 16 * 2);
288 B2.store_le(out + 16 * 4);
289 B3.store_le(out + 16 * 6);
344BOTAN_FN_ISA_AVX2_VAES
void AES_192::x86_vaes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
365 keyxor(K0, B0, B1, B2, B3);
366 aesdec(K1, B0, B1, B2, B3);
367 aesdec(K2, B0, B1, B2, B3);
368 aesdec(K3, B0, B1, B2, B3);
369 aesdec(K4, B0, B1, B2, B3);
370 aesdec(K5, B0, B1, B2, B3);
371 aesdec(K6, B0, B1, B2, B3);
372 aesdec(K7, B0, B1, B2, B3);
373 aesdec(K8, B0, B1, B2, B3);
374 aesdec(K9, B0, B1, B2, B3);
375 aesdec(K10, B0, B1, B2, B3);
376 aesdec(K11, B0, B1, B2, B3);
377 aesdeclast(K12, B0, B1, B2, B3);
379 B0.store_le(out + 16 * 0);
380 B1.store_le(out + 16 * 2);
381 B2.store_le(out + 16 * 4);
382 B3.store_le(out + 16 * 6);
434BOTAN_FN_ISA_AVX2_VAES
void AES_256::x86_vaes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
457 keyxor(K0, B0, B1, B2, B3);
458 aesenc(K1, B0, B1, B2, B3);
459 aesenc(K2, B0, B1, B2, B3);
460 aesenc(K3, B0, B1, B2, B3);
461 aesenc(K4, B0, B1, B2, B3);
462 aesenc(K5, B0, B1, B2, B3);
463 aesenc(K6, B0, B1, B2, B3);
464 aesenc(K7, B0, B1, B2, B3);
465 aesenc(K8, B0, B1, B2, B3);
466 aesenc(K9, B0, B1, B2, B3);
467 aesenc(K10, B0, B1, B2, B3);
468 aesenc(K11, B0, B1, B2, B3);
469 aesenc(K12, B0, B1, B2, B3);
470 aesenc(K13, B0, B1, B2, B3);
471 aesenclast(K14, B0, B1, B2, B3);
473 B0.store_le(out + 16 * 0);
474 B1.store_le(out + 16 * 2);
475 B2.store_le(out + 16 * 4);
476 B3.store_le(out + 16 * 6);
535BOTAN_FN_ISA_AVX2_VAES
void AES_256::x86_vaes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
558 keyxor(K0, B0, B1, B2, B3);
559 aesdec(K1, B0, B1, B2, B3);
560 aesdec(K2, B0, B1, B2, B3);
561 aesdec(K3, B0, B1, B2, B3);
562 aesdec(K4, B0, B1, B2, B3);
563 aesdec(K5, B0, B1, B2, B3);
564 aesdec(K6, B0, B1, B2, B3);
565 aesdec(K7, B0, B1, B2, B3);
566 aesdec(K8, B0, B1, B2, B3);
567 aesdec(K9, B0, B1, B2, B3);
568 aesdec(K10, B0, B1, B2, B3);
569 aesdec(K11, B0, B1, B2, B3);
570 aesdec(K12, B0, B1, B2, B3);
571 aesdec(K13, B0, B1, B2, B3);
572 aesdeclast(K14, B0, B1, B2, B3);
574 B0.store_le(out + 16 * 0);
575 B1.store_le(out + 16 * 2);
576 B2.store_le(out + 16 * 4);
577 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