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