12#include <botan/internal/aes.h>
14#include <botan/internal/isa_extn.h>
31static_assert(std::endian::native == std::endian::big || std::endian::native == std::endian::little);
34 if constexpr(std::endian::native == std::endian::little) {
35 const Altivec8x16 mask = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
37 return vec_perm(src, zero, mask);
48 return reinterpret_cast<Altivec64x2>(reverse_vec(vec_vsx_ld(0, src)));
52 vec_vsx_st(reverse_vec(
reinterpret_cast<Altivec8x16>(src)), 0, dest);
57 store_block(B1, out + 16);
58 store_block(B2, out + 16 * 2);
59 store_block(B3, out + 16 * 3);
75 B = __builtin_crypto_vcipher(B, K);
84 B = __builtin_crypto_vcipherlast(B, K);
93 B = __builtin_crypto_vncipher(B, K);
102 B = __builtin_crypto_vncipherlast(B, K);
116 aes_vcipherlast(B0, K);
117 aes_vcipherlast(B1, K);
118 aes_vcipherlast(B2, K);
119 aes_vcipherlast(B3, K);
132 aes_vncipherlast(B0, K);
133 aes_vncipherlast(B1, K);
134 aes_vncipherlast(B2, K);
135 aes_vncipherlast(B3, K);
140BOTAN_FN_ISA_AES
void AES_128::hw_aes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
159 xor_blocks(B0, B1, B2, B3, K0);
160 aes_vcipher(B0, B1, B2, B3, K1);
161 aes_vcipher(B0, B1, B2, B3, K2);
162 aes_vcipher(B0, B1, B2, B3, K3);
163 aes_vcipher(B0, B1, B2, B3, K4);
164 aes_vcipher(B0, B1, B2, B3, K5);
165 aes_vcipher(B0, B1, B2, B3, K6);
166 aes_vcipher(B0, B1, B2, B3, K7);
167 aes_vcipher(B0, B1, B2, B3, K8);
168 aes_vcipher(B0, B1, B2, B3, K9);
169 aes_vcipherlast(B0, B1, B2, B3, K10);
171 store_blocks(B0, B1, B2, B3, out);
178 for(
size_t i = 0; i != blocks; ++i) {
191 aes_vcipherlast(B, K10);
200BOTAN_FN_ISA_AES
void AES_128::hw_aes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
219 xor_blocks(B0, B1, B2, B3, K0);
220 aes_vncipher(B0, B1, B2, B3, K1);
221 aes_vncipher(B0, B1, B2, B3, K2);
222 aes_vncipher(B0, B1, B2, B3, K3);
223 aes_vncipher(B0, B1, B2, B3, K4);
224 aes_vncipher(B0, B1, B2, B3, K5);
225 aes_vncipher(B0, B1, B2, B3, K6);
226 aes_vncipher(B0, B1, B2, B3, K7);
227 aes_vncipher(B0, B1, B2, B3, K8);
228 aes_vncipher(B0, B1, B2, B3, K9);
229 aes_vncipherlast(B0, B1, B2, B3, K10);
231 store_blocks(B0, B1, B2, B3, out);
238 for(
size_t i = 0; i != blocks; ++i) {
251 aes_vncipherlast(B, K10);
260BOTAN_FN_ISA_AES
void AES_192::hw_aes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
281 xor_blocks(B0, B1, B2, B3, K0);
282 aes_vcipher(B0, B1, B2, B3, K1);
283 aes_vcipher(B0, B1, B2, B3, K2);
284 aes_vcipher(B0, B1, B2, B3, K3);
285 aes_vcipher(B0, B1, B2, B3, K4);
286 aes_vcipher(B0, B1, B2, B3, K5);
287 aes_vcipher(B0, B1, B2, B3, K6);
288 aes_vcipher(B0, B1, B2, B3, K7);
289 aes_vcipher(B0, B1, B2, B3, K8);
290 aes_vcipher(B0, B1, B2, B3, K9);
291 aes_vcipher(B0, B1, B2, B3, K10);
292 aes_vcipher(B0, B1, B2, B3, K11);
293 aes_vcipherlast(B0, B1, B2, B3, K12);
295 store_blocks(B0, B1, B2, B3, out);
302 for(
size_t i = 0; i != blocks; ++i) {
317 aes_vcipherlast(B, K12);
326BOTAN_FN_ISA_AES
void AES_192::hw_aes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
347 xor_blocks(B0, B1, B2, B3, K0);
348 aes_vncipher(B0, B1, B2, B3, K1);
349 aes_vncipher(B0, B1, B2, B3, K2);
350 aes_vncipher(B0, B1, B2, B3, K3);
351 aes_vncipher(B0, B1, B2, B3, K4);
352 aes_vncipher(B0, B1, B2, B3, K5);
353 aes_vncipher(B0, B1, B2, B3, K6);
354 aes_vncipher(B0, B1, B2, B3, K7);
355 aes_vncipher(B0, B1, B2, B3, K8);
356 aes_vncipher(B0, B1, B2, B3, K9);
357 aes_vncipher(B0, B1, B2, B3, K10);
358 aes_vncipher(B0, B1, B2, B3, K11);
359 aes_vncipherlast(B0, B1, B2, B3, K12);
361 store_blocks(B0, B1, B2, B3, out);
368 for(
size_t i = 0; i != blocks; ++i) {
381 aes_vncipher(B, K10);
382 aes_vncipher(B, K11);
383 aes_vncipherlast(B, K12);
392BOTAN_FN_ISA_AES
void AES_256::hw_aes_encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
415 xor_blocks(B0, B1, B2, B3, K0);
416 aes_vcipher(B0, B1, B2, B3, K1);
417 aes_vcipher(B0, B1, B2, B3, K2);
418 aes_vcipher(B0, B1, B2, B3, K3);
419 aes_vcipher(B0, B1, B2, B3, K4);
420 aes_vcipher(B0, B1, B2, B3, K5);
421 aes_vcipher(B0, B1, B2, B3, K6);
422 aes_vcipher(B0, B1, B2, B3, K7);
423 aes_vcipher(B0, B1, B2, B3, K8);
424 aes_vcipher(B0, B1, B2, B3, K9);
425 aes_vcipher(B0, B1, B2, B3, K10);
426 aes_vcipher(B0, B1, B2, B3, K11);
427 aes_vcipher(B0, B1, B2, B3, K12);
428 aes_vcipher(B0, B1, B2, B3, K13);
429 aes_vcipherlast(B0, B1, B2, B3, K14);
431 store_blocks(B0, B1, B2, B3, out);
438 for(
size_t i = 0; i != blocks; ++i) {
455 aes_vcipherlast(B, K14);
464BOTAN_FN_ISA_AES
void AES_256::hw_aes_decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const {
487 xor_blocks(B0, B1, B2, B3, K0);
488 aes_vncipher(B0, B1, B2, B3, K1);
489 aes_vncipher(B0, B1, B2, B3, K2);
490 aes_vncipher(B0, B1, B2, B3, K3);
491 aes_vncipher(B0, B1, B2, B3, K4);
492 aes_vncipher(B0, B1, B2, B3, K5);
493 aes_vncipher(B0, B1, B2, B3, K6);
494 aes_vncipher(B0, B1, B2, B3, K7);
495 aes_vncipher(B0, B1, B2, B3, K8);
496 aes_vncipher(B0, B1, B2, B3, K9);
497 aes_vncipher(B0, B1, B2, B3, K10);
498 aes_vncipher(B0, B1, B2, B3, K11);
499 aes_vncipher(B0, B1, B2, B3, K12);
500 aes_vncipher(B0, B1, B2, B3, K13);
501 aes_vncipherlast(B0, B1, B2, B3, K14);
503 store_blocks(B0, B1, B2, B3, out);
510 for(
size_t i = 0; i != blocks; ++i) {
523 aes_vncipher(B, K10);
524 aes_vncipher(B, K11);
525 aes_vncipher(B, K12);
526 aes_vncipher(B, K13);
527 aes_vncipherlast(B, K14);
#define BOTAN_FORCE_INLINE
std::unique_ptr< Private_Key > load_key(DataSource &source, const std::function< std::string()> &get_pass)
__vector unsigned long long Altivec64x2
__vector unsigned char Altivec8x16
__vector unsigned int Altivec32x4