66 #ifndef CRYPTOPP_PPC_CRYPTO_H 67 #define CRYPTOPP_PPC_CRYPTO_H 72 #if defined(__ALTIVEC__) 81 #if defined(_AIX) && defined(_ARCH_PWR8) && (__xlC__ >= 0xd01) 96 #if defined(__xlc__) && (__xlc__ < 0x0d01) 97 # define __early_xlc__ 1 99 #if defined(__xlC__) && (__xlC__ < 0x0d01) 100 # define __early_xlC__ 1 105 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 106 # pragma GCC diagnostic push 107 # pragma GCC diagnostic ignored "-Wdeprecated" 112 #if defined(__ALTIVEC__) || defined(CRYPTOPP_DOXYGEN_PROCESSING) 130 #if defined(_ARCH_PWR7) || defined(CRYPTOPP_DOXYGEN_PROCESSING) 173 const uint8x16_p mask = {15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0};
174 return (T)vec_perm(data, data, mask);
194 uintptr_t eff =
reinterpret_cast<uintptr_t
>(src)+0;
224 uintptr_t eff =
reinterpret_cast<uintptr_t
>(src)+off;
253 #if defined(_ARCH_PWR7) 254 # if defined(__early_xlc__) || defined(__early_xlC__) 256 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 281 #if defined(_ARCH_PWR7) 282 # if defined(__early_xlc__) || defined(__early_xlC__) 284 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 287 return (
uint32x4_p)vec_vsx_ld(off, (byte*)src);
308 return VecLoad((
const byte*)src);
326 return VecLoad(off, (
const byte*)src);
329 #if defined(_ARCH_PWR7) || defined(CRYPTOPP_DOXYGEN_PROCESSING) 383 #if defined(_ARCH_PWR7) 384 # if defined(__early_xlc__) || defined(__early_xlC__) 386 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 411 #if defined(_ARCH_PWR7) 412 # if defined(__early_xlc__) || defined(__early_xlC__) 414 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 417 return (
uint32x4_p)vec_vsx_ld(off, (byte*)src);
440 #if defined(_ARCH_PWR7) 441 # if defined(__early_xlc__) || defined(__early_xlC__) 442 # if (CRYPTOPP_BIG_ENDIAN) 447 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 450 # if (CRYPTOPP_BIG_ENDIAN) 457 # if (CRYPTOPP_BIG_ENDIAN) 481 #if defined(_ARCH_PWR7) 482 # if defined(__early_xlc__) || defined(__early_xlC__) 483 # if (CRYPTOPP_BIG_ENDIAN) 488 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 489 return (
uint32x4_p)vec_xl_be(off, (byte*)src);
491 # if (CRYPTOPP_BIG_ENDIAN) 492 return (
uint32x4_p)vec_vsx_ld(off, (byte*)src);
498 # if (CRYPTOPP_BIG_ENDIAN) 526 uintptr_t eff =
reinterpret_cast<uintptr_t
>(dest)+0;
535 vec_ste((
uint8x16_p) perm, 0, (
unsigned char*) dest);
536 vec_ste((
uint16x8_p) perm, 1, (
unsigned short*)dest);
537 vec_ste((
uint32x4_p) perm, 3, (
unsigned int*) dest);
538 vec_ste((
uint32x4_p) perm, 4, (
unsigned int*) dest);
539 vec_ste((
uint32x4_p) perm, 8, (
unsigned int*) dest);
540 vec_ste((
uint32x4_p) perm, 12, (
unsigned int*) dest);
541 vec_ste((
uint16x8_p) perm, 14, (
unsigned short*)dest);
542 vec_ste((
uint8x16_p) perm, 15, (
unsigned char*) dest);
565 uintptr_t eff =
reinterpret_cast<uintptr_t
>(dest)+off;
574 vec_ste((
uint8x16_p) perm, 0, (
unsigned char*) dest);
575 vec_ste((
uint16x8_p) perm, 1, (
unsigned short*)dest);
576 vec_ste((
uint32x4_p) perm, 3, (
unsigned int*) dest);
577 vec_ste((
uint32x4_p) perm, 4, (
unsigned int*) dest);
578 vec_ste((
uint32x4_p) perm, 8, (
unsigned int*) dest);
579 vec_ste((
uint32x4_p) perm, 12, (
unsigned int*) dest);
580 vec_ste((
uint16x8_p) perm, 14, (
unsigned short*)dest);
581 vec_ste((
uint8x16_p) perm, 15, (
unsigned char*) dest);
602 #if defined(_ARCH_PWR7) 603 # if defined(__early_xlc__) || defined(__early_xlC__) 605 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 631 inline void VecStore(
const T data,
int off, byte dest[16])
633 #if defined(_ARCH_PWR7) 634 # if defined(__early_xlc__) || defined(__early_xlC__) 635 vec_xstw4((
uint8x16_p)data, off, (byte*)dest);
636 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 639 vec_vsx_st((
uint8x16_p)data, off, (byte*)dest);
682 inline void VecStore(
const T data,
int off, word32 dest[4])
725 inline void VecStore(
const T data,
int off, word64 dest[2])
748 #if defined(_ARCH_PWR7) 749 # if defined(__early_xlc__) || defined(__early_xlC__) 750 # if (CRYPTOPP_BIG_ENDIAN) 755 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 758 # if (CRYPTOPP_BIG_ENDIAN) 765 # if (CRYPTOPP_BIG_ENDIAN) 792 #if defined(_ARCH_PWR7) 793 # if defined(__early_xlc__) || defined(__early_xlC__) 794 # if (CRYPTOPP_BIG_ENDIAN) 795 vec_xstw4((
uint8x16_p)data, off, (byte*)dest);
799 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 800 vec_xst_be((
uint8x16_p)data, off, (byte*)dest);
802 # if (CRYPTOPP_BIG_ENDIAN) 803 vec_vsx_st((
uint8x16_p)data, off, (byte*)dest);
809 # if (CRYPTOPP_BIG_ENDIAN) 855 inline void VecStoreBE(
const T data,
int off, word32 dest[4])
874 template <
class T1,
class T2>
877 return (T1)vec_perm(vec, vec, (
uint8x16_p)mask);
893 template <
class T1,
class T2>
894 inline T1
VecPermute(
const T1 vec1,
const T1 vec2,
const T2 mask)
896 return (T1)vec_perm(vec1, (T1)vec2, (
uint8x16_p)mask);
910 template <
class T1,
class T2>
911 inline T1
VecAnd(
const T1 vec1,
const T2 vec2)
913 return (T1)vec_and(vec1, (T1)vec2);
927 template <
class T1,
class T2>
928 inline T1
VecOr(
const T1 vec1,
const T2 vec2)
930 return (T1)vec_or(vec1, (T1)vec2);
944 template <
class T1,
class T2>
945 inline T1
VecXor(
const T1 vec1,
const T2 vec2)
947 return (T1)vec_xor(vec1, (T1)vec2);
962 template <
class T1,
class T2>
963 inline T1
VecAdd(
const T1 vec1,
const T2 vec2)
965 return (T1)vec_add(vec1, (T1)vec2);
979 template <
class T1,
class T2>
980 inline T1
VecSub(
const T1 vec1,
const T2 vec2)
982 return (T1)vec_sub(vec1, (T1)vec2);
1001 #if defined(_ARCH_PWR8) 1007 const uint8x16_p cmask = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};
1011 cy = vec_perm(cy, zero, cmask);
1012 return vec_add(vec_add(vec1, vec2), cy);
1037 template <
unsigned int C,
class T>
1053 #if (CRYPTOPP_BIG_ENDIAN) 1057 enum { R=(16-C)&0xf };
1084 template <
unsigned int C,
class T>
1100 #if (CRYPTOPP_BIG_ENDIAN) 1101 enum { R=(16-C)&0xf };
1123 template <
unsigned int C,
class T>
1126 #if (CRYPTOPP_BIG_ENDIAN) 1130 enum { R=(16-C)&0xf };
1148 template <
unsigned int C,
class T>
1151 #if (CRYPTOPP_BIG_ENDIAN) 1152 enum { R=(16-C)&0xf };
1168 template<
unsigned int C>
1172 return vec_rl(vec, m);
1175 #if defined(_ARCH_PWR8) || defined(CRYPTOPP_DOXYGEN_PROCESSING) 1186 template<
unsigned int C>
1190 return vec_rl(vec, m);
1203 template<
unsigned int C>
1206 const uint32x4_p m = {32-C, 32-C, 32-C, 32-C};
1207 return vec_rl(vec, m);
1210 #if defined(_ARCH_PWR8) || defined(CRYPTOPP_DOXYGEN_PROCESSING) 1221 template<
unsigned int C>
1225 return vec_rl(vec, m);
1260 return VecShiftRightOctet<8>(VecShiftLeftOctet<8>(val));
1280 return VecShiftRightOctet<8>(val);
1294 template <
class T1,
class T2>
1311 template <
class T1,
class T2>
1319 #if defined(__CRYPTO__) || defined(CRYPTOPP_DOXYGEN_PROCESSING) 1332 template <
class T1,
class T2>
1335 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__)) 1337 #elif defined(__clang__) 1339 #elif defined(__GNUC__) 1357 template <
class T1,
class T2>
1360 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__)) 1362 #elif defined(__clang__) 1364 #elif defined(__GNUC__) 1382 template <
class T1,
class T2>
1385 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__)) 1387 #elif defined(__clang__) 1389 #elif defined(__GNUC__) 1407 template <
class T1,
class T2>
1410 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__)) 1412 #elif defined(__clang__) 1414 #elif defined(__GNUC__) 1432 template <
int func,
int fmask,
class T>
1435 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__)) 1436 return (T)__vshasigmaw((
uint32x4_p)vec, func, fmask);
1437 #elif defined(__clang__) 1438 return (T)__builtin_altivec_crypto_vshasigmaw((
uint32x4_p)vec, func, fmask);
1439 #elif defined(__GNUC__) 1440 return (T)__builtin_crypto_vshasigmaw((
uint32x4_p)vec, func, fmask);
1457 template <
int func,
int fmask,
class T>
1460 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__)) 1461 return (T)__vshasigmad((
uint64x2_p)vec, func, fmask);
1462 #elif defined(__clang__) 1463 return (T)__builtin_altivec_crypto_vshasigmad((
uint64x2_p)vec, func, fmask);
1464 #elif defined(__GNUC__) 1465 return (T)__builtin_crypto_vshasigmad((
uint64x2_p)vec, func, fmask);
1471 #endif // __CRYPTO__ 1477 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE 1478 # pragma GCC diagnostic pop 1481 #endif // CRYPTOPP_PPC_CRYPTO_H T1 VecDecryptLast(const T1 state, const T2 key)
Final round of AES decryption.
Utility functions for the Crypto++ library.
T VecSHA512(const T vec)
SHA512 Sigma functions.
T VecShiftRightOctet(const T vec)
Shift a vector right.
uint32x4_p VecLoadAligned(const byte src[16])
Loads a vector from an aligned byte array.
T VecReverse(const T data)
Reverse bytes in a vector.
T VecGetLow(const T val)
Extract a dword from a vector.
T1 VecSub(const T1 vec1, const T2 vec2)
Subtract two vectors.
uint32x4_p VecAdd64(const uint32x4_p &vec1, const uint32x4_p &vec2)
Add two vectors.
Library configuration file.
T1 VecAdd(const T1 vec1, const T2 vec2)
Add two vectors.
T VecGetHigh(const T val)
Extract a dword from a vector.
uint32x4_p VecLoad_ALTIVEC(const byte src[16])
Loads a vector from a byte array.
T1 VecPermute(const T1 vec, const T2 mask)
Permutes a vector.
uint32x4_p VecOne()
The 1 vector.
T VecSwapWords(const T vec)
Exchange high and low double words.
__vector unsigned int uint32x4_p
Vector of 32-bit elements.
bool VecNotEqual(const T1 vec1, const T2 vec2)
Compare two vectors.
T VecRotateLeftOctet(const T vec)
Rotate a vector left.
void VecStoreBE(const T data, byte dest[16])
Stores a vector to a byte array.
void VecStore(const T data, byte dest[16])
Stores a vector to a byte array.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
void VecStore_ALTIVEC(const T data, byte dest[16])
Stores a vector to a byte array.
T VecSHA256(const T vec)
SHA256 Sigma functions.
T1 VecXor(const T1 vec1, const T2 vec2)
XOR two vectors.
bool VecEqual(const T1 vec1, const T2 vec2)
Compare two vectors.
uint32x4_p VecZero()
The 0 vector.
__vector unsigned short uint16x8_p
Vector of 16-bit elements.
uint32x4_p VecRotateLeft(const uint32x4_p vec)
Rotate a packed vector left.
uint32x4_p VecRotateRight(const uint32x4_p vec)
Rotate a packed vector right.
__vector unsigned long long uint64x2_p
Vector of 64-bit elements.
uint32x4_p VecLoadBE(const byte src[16])
Loads a vector from a byte array.
T1 VecOr(const T1 vec1, const T2 vec2)
OR two vectors.
T1 VecEncryptLast(const T1 state, const T2 key)
Final round of AES encryption.
Crypto++ library namespace.
T1 VecDecrypt(const T1 state, const T2 key)
One round of AES decryption.
uint32x4_p VecLoad(const byte src[16])
Loads a vector from a byte array.
T VecRotateRightOctet(const T vec)
Rotate a vector right.
__vector unsigned char uint8x16_p
Vector of 8-bit elements.
T VecShiftLeftOctet(const T vec)
Shift a vector left.
T1 VecAnd(const T1 vec1, const T2 vec2)
AND two vectors.
T1 VecEncrypt(const T1 state, const T2 key)
One round of AES encryption.