8#include <botan/internal/aes.h>
10#include <botan/internal/isa_extn.h>
11#include <botan/internal/loadstor.h>
12#include <botan/internal/simd_4x32.h>
23 __m128i key_with_rcon = _mm_aeskeygenassist_si128(key_getting_rcon.raw(), RC);
24 key_with_rcon = _mm_shuffle_epi32(key_with_rcon, _MM_SHUFFLE(3, 3, 3, 3));
25 key ^= key.shift_elems_left<1>();
26 key ^= key.shift_elems_left<1>();
27 key ^= key.shift_elems_left<1>();
33void aes_192_key_expansion(
35 const SIMD_4x32 rcon =
SIMD_4x32(_mm_shuffle_epi32(key2_with_rcon.raw(), _MM_SHUFFLE(1, 1, 1, 1)));
36 K1 ^=
K1.shift_elems_left<1>();
37 K1 ^=
K1.shift_elems_left<1>();
38 K1 ^=
K1.shift_elems_left<1>();
41 K1.store_le(&out[offset]);
47 K2 ^=
K2.shift_elems_left<1>();
48 K2 ^=
SIMD_4x32(_mm_shuffle_epi32(
K1.raw(), _MM_SHUFFLE(3, 3, 3, 3)));
50 out[offset + 4] =
K2.extract_word<0>();
51 out[offset + 5] =
K2.extract_word<1>();
58 __m128i key_with_rcon = _mm_aeskeygenassist_si128(key2.raw(), 0x00);
59 key_with_rcon = _mm_shuffle_epi32(key_with_rcon, _MM_SHUFFLE(2, 2, 2, 2));
61 key ^= key.shift_elems_left<1>();
62 key ^= key.shift_elems_left<1>();
63 key ^= key.shift_elems_left<1>();
77 B =
SIMD_4x32(_mm_aesenc_si128(B.raw(), K.raw()));
82 B0 =
SIMD_4x32(_mm_aesenc_si128(B0.raw(), K.raw()));
83 B1 =
SIMD_4x32(_mm_aesenc_si128(B1.raw(), K.raw()));
84 B2 =
SIMD_4x32(_mm_aesenc_si128(B2.raw(), K.raw()));
85 B3 =
SIMD_4x32(_mm_aesenc_si128(B3.raw(), K.raw()));
89 B =
SIMD_4x32(_mm_aesenclast_si128(B.raw(), K.raw()));
94 B0 =
SIMD_4x32(_mm_aesenclast_si128(B0.raw(), K.raw()));
95 B1 =
SIMD_4x32(_mm_aesenclast_si128(B1.raw(), K.raw()));
96 B2 =
SIMD_4x32(_mm_aesenclast_si128(B2.raw(), K.raw()));
97 B3 =
SIMD_4x32(_mm_aesenclast_si128(B3.raw(), K.raw()));
101 B =
SIMD_4x32(_mm_aesdec_si128(B.raw(), K.raw()));
106 B0 =
SIMD_4x32(_mm_aesdec_si128(B0.raw(), K.raw()));
107 B1 =
SIMD_4x32(_mm_aesdec_si128(B1.raw(), K.raw()));
108 B2 =
SIMD_4x32(_mm_aesdec_si128(B2.raw(), K.raw()));
109 B3 =
SIMD_4x32(_mm_aesdec_si128(B3.raw(), K.raw()));
113 B =
SIMD_4x32(_mm_aesdeclast_si128(B.raw(), K.raw()));
118 B0 =
SIMD_4x32(_mm_aesdeclast_si128(B0.raw(), K.raw()));
119 B1 =
SIMD_4x32(_mm_aesdeclast_si128(B1.raw(), K.raw()));
120 B2 =
SIMD_4x32(_mm_aesdeclast_si128(B2.raw(), K.raw()));
121 B3 =
SIMD_4x32(_mm_aesdeclast_si128(B3.raw(), K.raw()));
125 return SIMD_4x32(_mm_aesimc_si128(B.raw()));
135BOTAN_FN_ISA_AESNI
void AES_128::hw_aes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
154 keyxor(K0, B0, B1, B2, B3);
155 aesenc(K1, B0, B1, B2, B3);
156 aesenc(K2, B0, B1, B2, B3);
157 aesenc(K3, B0, B1, B2, B3);
158 aesenc(K4, B0, B1, B2, B3);
159 aesenc(K5, B0, B1, B2, B3);
160 aesenc(K6, B0, B1, B2, B3);
161 aesenc(K7, B0, B1, B2, B3);
162 aesenc(K8, B0, B1, B2, B3);
163 aesenc(K9, B0, B1, B2, B3);
164 aesenclast(K10, B0, B1, B2, B3);
166 B0.store_le(out + 16 * 0);
167 B1.store_le(out + 16 * 1);
168 B2.store_le(out + 16 * 2);
169 B3.store_le(out + 16 * 3);
176 for(
size_t i = 0; i != blocks; ++i) {
191 B0.store_le(out + 16 * i);
198BOTAN_FN_ISA_AESNI
void AES_128::hw_aes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
217 keyxor(K0, B0, B1, B2, B3);
218 aesdec(K1, B0, B1, B2, B3);
219 aesdec(K2, B0, B1, B2, B3);
220 aesdec(K3, B0, B1, B2, B3);
221 aesdec(K4, B0, B1, B2, B3);
222 aesdec(K5, B0, B1, B2, B3);
223 aesdec(K6, B0, B1, B2, B3);
224 aesdec(K7, B0, B1, B2, B3);
225 aesdec(K8, B0, B1, B2, B3);
226 aesdec(K9, B0, B1, B2, B3);
227 aesdeclast(K10, B0, B1, B2, B3);
229 B0.store_le(out + 16 * 0);
230 B1.store_le(out + 16 * 1);
231 B2.store_le(out + 16 * 2);
232 B3.store_le(out + 16 * 3);
239 for(
size_t i = 0; i != blocks; ++i) {
254 B0.store_le(out + 16 * i);
261BOTAN_FN_ISA_AESNI
void AES_128::aesni_key_schedule(
const uint8_t key[],
size_t ) {
266 const SIMD_4x32
K1 = aes_128_key_expansion<0x01>(K0, K0);
267 const SIMD_4x32
K2 = aes_128_key_expansion<0x02>(K1, K1);
268 const SIMD_4x32
K3 = aes_128_key_expansion<0x04>(K2, K2);
269 const SIMD_4x32
K4 = aes_128_key_expansion<0x08>(K3, K3);
270 const SIMD_4x32 K5 = aes_128_key_expansion<0x10>(K4, K4);
271 const SIMD_4x32 K6 = aes_128_key_expansion<0x20>(K5, K5);
272 const SIMD_4x32 K7 = aes_128_key_expansion<0x40>(K6, K6);
273 const SIMD_4x32 K8 = aes_128_key_expansion<0x80>(K7, K7);
274 const SIMD_4x32 K9 = aes_128_key_expansion<0x1B>(K8, K8);
275 const SIMD_4x32 K10 = aes_128_key_expansion<0x36>(K9, K9);
277 K0.store_le(&m_EK[4 * 0]);
278 K1.store_le(&m_EK[4 * 1]);
279 K2.store_le(&m_EK[4 * 2]);
280 K3.store_le(&m_EK[4 * 3]);
281 K4.store_le(&m_EK[4 * 4]);
282 K5.store_le(&m_EK[4 * 5]);
283 K6.store_le(&m_EK[4 * 6]);
284 K7.store_le(&m_EK[4 * 7]);
285 K8.store_le(&m_EK[4 * 8]);
286 K9.store_le(&m_EK[4 * 9]);
287 K10.store_le(&m_EK[4 * 10]);
290 K10.store_le(&m_DK[4 * 0]);
291 aesimc(K9).store_le(&m_DK[4 * 1]);
292 aesimc(K8).store_le(&m_DK[4 * 2]);
293 aesimc(K7).store_le(&m_DK[4 * 3]);
294 aesimc(K6).store_le(&m_DK[4 * 4]);
295 aesimc(K5).store_le(&m_DK[4 * 5]);
296 aesimc(K4).store_le(&m_DK[4 * 6]);
297 aesimc(K3).store_le(&m_DK[4 * 7]);
298 aesimc(K2).store_le(&m_DK[4 * 8]);
299 aesimc(K1).store_le(&m_DK[4 * 9]);
300 K0.store_le(&m_DK[4 * 10]);
306BOTAN_FN_ISA_AESNI
void AES_192::hw_aes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
327 keyxor(K0, B0, B1, B2, B3);
328 aesenc(K1, B0, B1, B2, B3);
329 aesenc(K2, B0, B1, B2, B3);
330 aesenc(K3, B0, B1, B2, B3);
331 aesenc(K4, B0, B1, B2, B3);
332 aesenc(K5, B0, B1, B2, B3);
333 aesenc(K6, B0, B1, B2, B3);
334 aesenc(K7, B0, B1, B2, B3);
335 aesenc(K8, B0, B1, B2, B3);
336 aesenc(K9, B0, B1, B2, B3);
337 aesenc(K10, B0, B1, B2, B3);
338 aesenc(K11, B0, B1, B2, B3);
339 aesenclast(K12, B0, B1, B2, B3);
341 B0.store_le(out + 16 * 0);
342 B1.store_le(out + 16 * 1);
343 B2.store_le(out + 16 * 2);
344 B3.store_le(out + 16 * 3);
351 for(
size_t i = 0; i != blocks; ++i) {
369 B0.store_le(out + 16 * i);
376BOTAN_FN_ISA_AESNI
void AES_192::hw_aes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
397 keyxor(K0, B0, B1, B2, B3);
398 aesdec(K1, B0, B1, B2, B3);
399 aesdec(K2, B0, B1, B2, B3);
400 aesdec(K3, B0, B1, B2, B3);
401 aesdec(K4, B0, B1, B2, B3);
402 aesdec(K5, B0, B1, B2, B3);
403 aesdec(K6, B0, B1, B2, B3);
404 aesdec(K7, B0, B1, B2, B3);
405 aesdec(K8, B0, B1, B2, B3);
406 aesdec(K9, B0, B1, B2, B3);
407 aesdec(K10, B0, B1, B2, B3);
408 aesdec(K11, B0, B1, B2, B3);
409 aesdeclast(K12, B0, B1, B2, B3);
411 B0.store_le(out + 16 * 0);
412 B1.store_le(out + 16 * 1);
413 B2.store_le(out + 16 * 2);
414 B3.store_le(out + 16 * 3);
421 for(
size_t i = 0; i != blocks; ++i) {
439 B0.store_le(out + 16 * i);
446BOTAN_FN_ISA_AESNI
void AES_192::aesni_key_schedule(
const uint8_t key[],
size_t ) {
455 aes_192_key_expansion(K0, K1, SIMD_4x32(_mm_aeskeygenassist_si128(
K1.raw(), 0x01)), m_EK, 6);
456 aes_192_key_expansion(K0, K1, SIMD_4x32(_mm_aeskeygenassist_si128(
K1.raw(), 0x02)), m_EK, 12);
457 aes_192_key_expansion(K0, K1, SIMD_4x32(_mm_aeskeygenassist_si128(
K1.raw(), 0x04)), m_EK, 18);
458 aes_192_key_expansion(K0, K1, SIMD_4x32(_mm_aeskeygenassist_si128(
K1.raw(), 0x08)), m_EK, 24);
459 aes_192_key_expansion(K0, K1, SIMD_4x32(_mm_aeskeygenassist_si128(
K1.raw(), 0x10)), m_EK, 30);
460 aes_192_key_expansion(K0, K1, SIMD_4x32(_mm_aeskeygenassist_si128(
K1.raw(), 0x20)), m_EK, 36);
461 aes_192_key_expansion(K0, K1, SIMD_4x32(_mm_aeskeygenassist_si128(
K1.raw(), 0x40)), m_EK, 42);
462 aes_192_key_expansion(K0, K1, SIMD_4x32(_mm_aeskeygenassist_si128(
K1.raw(), 0x80)), m_EK, 48);
483BOTAN_FN_ISA_AESNI
void AES_256::hw_aes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
506 keyxor(K0, B0, B1, B2, B3);
507 aesenc(K1, B0, B1, B2, B3);
508 aesenc(K2, B0, B1, B2, B3);
509 aesenc(K3, B0, B1, B2, B3);
510 aesenc(K4, B0, B1, B2, B3);
511 aesenc(K5, B0, B1, B2, B3);
512 aesenc(K6, B0, B1, B2, B3);
513 aesenc(K7, B0, B1, B2, B3);
514 aesenc(K8, B0, B1, B2, B3);
515 aesenc(K9, B0, B1, B2, B3);
516 aesenc(K10, B0, B1, B2, B3);
517 aesenc(K11, B0, B1, B2, B3);
518 aesenc(K12, B0, B1, B2, B3);
519 aesenc(K13, B0, B1, B2, B3);
520 aesenclast(K14, B0, B1, B2, B3);
522 B0.store_le(out + 16 * 0);
523 B1.store_le(out + 16 * 1);
524 B2.store_le(out + 16 * 2);
525 B3.store_le(out + 16 * 3);
532 for(
size_t i = 0; i != blocks; ++i) {
552 B0.store_le(out + 16 * i);
559BOTAN_FN_ISA_AESNI
void AES_256::hw_aes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
582 keyxor(K0, B0, B1, B2, B3);
583 aesdec(K1, B0, B1, B2, B3);
584 aesdec(K2, B0, B1, B2, B3);
585 aesdec(K3, B0, B1, B2, B3);
586 aesdec(K4, B0, B1, B2, B3);
587 aesdec(K5, B0, B1, B2, B3);
588 aesdec(K6, B0, B1, B2, B3);
589 aesdec(K7, B0, B1, B2, B3);
590 aesdec(K8, B0, B1, B2, B3);
591 aesdec(K9, B0, B1, B2, B3);
592 aesdec(K10, B0, B1, B2, B3);
593 aesdec(K11, B0, B1, B2, B3);
594 aesdec(K12, B0, B1, B2, B3);
595 aesdec(K13, B0, B1, B2, B3);
596 aesdeclast(K14, B0, B1, B2, B3);
598 B0.store_le(out + 16 * 0);
599 B1.store_le(out + 16 * 1);
600 B2.store_le(out + 16 * 2);
601 B3.store_le(out + 16 * 3);
608 for(
size_t i = 0; i != blocks; ++i) {
628 B0.store_le(out + 16 * i);
635BOTAN_FN_ISA_AESNI
void AES_256::aesni_key_schedule(
const uint8_t key[],
size_t ) {
642 const SIMD_4x32
K2 = aes_128_key_expansion<0x01>(K0, K1);
643 const SIMD_4x32
K3 = aes_256_key_expansion(K1, K2);
645 const SIMD_4x32
K4 = aes_128_key_expansion<0x02>(K2, K3);
646 const SIMD_4x32 K5 = aes_256_key_expansion(K3, K4);
648 const SIMD_4x32 K6 = aes_128_key_expansion<0x04>(K4, K5);
649 const SIMD_4x32 K7 = aes_256_key_expansion(K5, K6);
651 const SIMD_4x32 K8 = aes_128_key_expansion<0x08>(K6, K7);
652 const SIMD_4x32 K9 = aes_256_key_expansion(K7, K8);
654 const SIMD_4x32 K10 = aes_128_key_expansion<0x10>(K8, K9);
655 const SIMD_4x32 K11 = aes_256_key_expansion(K9, K10);
657 const SIMD_4x32 K12 = aes_128_key_expansion<0x20>(K10, K11);
658 const SIMD_4x32 K13 = aes_256_key_expansion(K11, K12);
660 const SIMD_4x32 K14 = aes_128_key_expansion<0x40>(K12, K13);
662 K0.store_le(&m_EK[4 * 0]);
663 K1.store_le(&m_EK[4 * 1]);
664 K2.store_le(&m_EK[4 * 2]);
665 K3.store_le(&m_EK[4 * 3]);
666 K4.store_le(&m_EK[4 * 4]);
667 K5.store_le(&m_EK[4 * 5]);
668 K6.store_le(&m_EK[4 * 6]);
669 K7.store_le(&m_EK[4 * 7]);
670 K8.store_le(&m_EK[4 * 8]);
671 K9.store_le(&m_EK[4 * 9]);
672 K10.store_le(&m_EK[4 * 10]);
673 K11.store_le(&m_EK[4 * 11]);
674 K12.store_le(&m_EK[4 * 12]);
675 K13.store_le(&m_EK[4 * 13]);
676 K14.store_le(&m_EK[4 * 14]);
678 K14.store_le(&m_DK[4 * 0]);
679 aesimc(K13).store_le(&m_DK[4 * 1]);
680 aesimc(K12).store_le(&m_DK[4 * 2]);
681 aesimc(K11).store_le(&m_DK[4 * 3]);
682 aesimc(K10).store_le(&m_DK[4 * 4]);
683 aesimc(K9).store_le(&m_DK[4 * 5]);
684 aesimc(K8).store_le(&m_DK[4 * 6]);
685 aesimc(K7).store_le(&m_DK[4 * 7]);
686 aesimc(K6).store_le(&m_DK[4 * 8]);
687 aesimc(K5).store_le(&m_DK[4 * 9]);
688 aesimc(K4).store_le(&m_DK[4 * 10]);
689 aesimc(K3).store_le(&m_DK[4 * 11]);
690 aesimc(K2).store_le(&m_DK[4 * 12]);
691 aesimc(K1).store_le(&m_DK[4 * 13]);
692 K0.store_le(&m_DK[4 * 14]);
void BOTAN_FN_ISA_SIMD_4X32 store_le(uint32_t out[4]) const noexcept
static SIMD_4x32 BOTAN_FN_ISA_SIMD_4X32 load_le(const void *in) noexcept
SIMD_4x32 BOTAN_FN_ISA_SIMD_4X32 shift_elems_right() const noexcept
#define BOTAN_FORCE_INLINE
constexpr auto load_le(ParamTs &&... params)
std::vector< T, secure_allocator< T > > secure_vector