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) 146 const uint32x4_p v = {0,0,0,0};
155 const uint32x4_p v = {1,1,1,1};
171 return (T)vec_revb((uint8x16_p)data);
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;
197 return (uint32x4_p)vec_ld(0, src);
202 const uint8x16_p perm = vec_lvsl(0, src);
203 const uint8x16_p low = vec_ld(0, src);
204 const uint8x16_p high = vec_ld(15, src);
205 return (uint32x4_p)vec_perm(low, high, perm);
224 uintptr_t eff =
reinterpret_cast<uintptr_t
>(src)+off;
227 return (uint32x4_p)vec_ld(off, src);
232 const uint8x16_p perm = vec_lvsl(off, src);
233 const uint8x16_p low = vec_ld(off, src);
234 const uint8x16_p high = vec_ld(15, src);
235 return (uint32x4_p)vec_perm(low, high, perm);
253 #if defined(_ARCH_PWR7) 254 # if defined(__early_xlc__) || defined(__early_xlC__) 255 return (uint32x4_p)vec_xlw4(0, (byte*)src);
256 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 257 return (uint32x4_p)vec_xl(0, (byte*)src);
259 return (uint32x4_p)vec_vsx_ld(0, (byte*)src);
279 inline uint32x4_p
VecLoad(
int off,
const byte src[16])
281 #if defined(_ARCH_PWR7) 282 # if defined(__early_xlc__) || defined(__early_xlC__) 283 return (uint32x4_p)vec_xlw4(off, (byte*)src);
284 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 285 return (uint32x4_p)vec_xl(off, (byte*)src);
287 return (uint32x4_p)vec_vsx_ld(off, (byte*)src);
306 inline uint32x4_p
VecLoad(
const word32 src[4])
308 return VecLoad((
const byte*)src);
324 inline uint32x4_p
VecLoad(
int off,
const word32 src[4])
326 return VecLoad(off, (
const byte*)src);
329 #if defined(_ARCH_PWR7) || defined(CRYPTOPP_DOXYGEN_PROCESSING) 344 inline uint64x2_p
VecLoad(
const word64 src[2])
346 return (uint64x2_p)
VecLoad((
const byte*)src);
363 inline uint64x2_p
VecLoad(
int off,
const word64 src[2])
365 return (uint64x2_p)
VecLoad(off, (
const byte*)src);
383 #if defined(_ARCH_PWR7) 384 # if defined(__early_xlc__) || defined(__early_xlC__) 385 return (uint32x4_p)vec_xlw4(0, (byte*)src);
386 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 387 return (uint32x4_p)vec_xl(0, (byte*)src);
389 return (uint32x4_p)vec_vsx_ld(0, (byte*)src);
393 return (uint32x4_p)vec_ld(0, (byte*)src);
411 #if defined(_ARCH_PWR7) 412 # if defined(__early_xlc__) || defined(__early_xlC__) 413 return (uint32x4_p)vec_xlw4(off, (byte*)src);
414 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 415 return (uint32x4_p)vec_xl(off, (byte*)src);
417 return (uint32x4_p)vec_vsx_ld(off, (byte*)src);
421 return (uint32x4_p)vec_ld(off, (byte*)src);
440 #if defined(_ARCH_PWR7) 441 # if defined(__early_xlc__) || defined(__early_xlC__) 442 # if (CRYPTOPP_BIG_ENDIAN) 443 return (uint32x4_p)vec_xlw4(0, (byte*)src);
445 return (uint32x4_p)
VecReverse(vec_xlw4(0, (byte*)src));
447 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 448 return (uint32x4_p)vec_xl_be(0, (byte*)src);
450 # if (CRYPTOPP_BIG_ENDIAN) 451 return (uint32x4_p)vec_vsx_ld(0, (byte*)src);
453 return (uint32x4_p)
VecReverse(vec_vsx_ld(0, (byte*)src));
457 # if (CRYPTOPP_BIG_ENDIAN) 458 return (uint32x4_p)
VecLoad((
const byte*)src);
479 inline uint32x4_p
VecLoadBE(
int off,
const byte src[16])
481 #if defined(_ARCH_PWR7) 482 # if defined(__early_xlc__) || defined(__early_xlC__) 483 # if (CRYPTOPP_BIG_ENDIAN) 484 return (uint32x4_p)vec_xlw4(off, (byte*)src);
486 return (uint32x4_p)
VecReverse(vec_xlw4(off, (byte*)src));
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);
494 return (uint32x4_p)
VecReverse(vec_vsx_ld(off, (byte*)src));
498 # if (CRYPTOPP_BIG_ENDIAN) 499 return (uint32x4_p)
VecLoad(off, (
const byte*)src);
526 uintptr_t eff =
reinterpret_cast<uintptr_t
>(dest)+0;
529 vec_st((uint8x16_p)data, 0, dest);
534 uint8x16_p perm = (
uint8x16_p)vec_perm(data, data, vec_lvsr(0, dest));
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;
568 vec_st((uint8x16_p)data, off, dest);
573 uint8x16_p perm = (
uint8x16_p)vec_perm(data, data, vec_lvsr(off, dest));
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__) 604 vec_xstw4((uint8x16_p)data, 0, (byte*)dest);
605 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 606 vec_xst((uint8x16_p)data, 0, (byte*)dest);
608 vec_vsx_st((uint8x16_p)data, 0, (byte*)dest);
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__) 637 vec_xst((uint8x16_p)data, off, (byte*)dest);
639 vec_vsx_st((uint8x16_p)data, off, (byte*)dest);
663 VecStore((uint8x16_p)data, 0, (byte*)dest);
682 inline void VecStore(
const T data,
int off, word32 dest[4])
684 VecStore((uint8x16_p)data, off, (byte*)dest);
705 VecStore((uint8x16_p)data, 0, (byte*)dest);
725 inline void VecStore(
const T data,
int off, word64 dest[2])
727 VecStore((uint8x16_p)data, off, (byte*)dest);
748 #if defined(_ARCH_PWR7) 749 # if defined(__early_xlc__) || defined(__early_xlC__) 750 # if (CRYPTOPP_BIG_ENDIAN) 751 vec_xstw4((uint8x16_p)data, 0, (byte*)dest);
753 vec_xstw4((uint8x16_p)
VecReverse(data), 0, (byte*)dest);
755 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__) 756 vec_xst_be((uint8x16_p)data, 0, (byte*)dest);
758 # if (CRYPTOPP_BIG_ENDIAN) 759 vec_vsx_st((uint8x16_p)data, 0, (byte*)dest);
761 vec_vsx_st((uint8x16_p)
VecReverse(data), 0, (byte*)dest);
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);
797 vec_xstw4((uint8x16_p)
VecReverse(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);
805 vec_vsx_st((uint8x16_p)
VecReverse(data), off, (byte*)dest);
809 # if (CRYPTOPP_BIG_ENDIAN) 835 return VecStoreBE((uint8x16_p)data, (byte*)dest);
855 inline void VecStoreBE(
const T data,
int off, word32 dest[4])
857 return VecStoreBE((uint8x16_p)data, off, (byte*)dest);
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);
998 inline uint32x4_p
VecAdd64(
const uint32x4_p& vec1,
const uint32x4_p& vec2)
1001 #if defined(_ARCH_PWR8) 1002 return (uint32x4_p)vec_add((uint64x2_p)vec1, (uint64x2_p)vec2);
1007 const uint8x16_p cmask = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};
1008 const uint32x4_p zero = {0, 0, 0, 0};
1010 uint32x4_p cy = vec_addc(vec1, vec2);
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) 1055 return (T)vec_sld((uint8x16_p)vec, (uint8x16_p)zero, R);
1057 enum { R=(16-C)&0xf };
1058 return (T)vec_sld((uint8x16_p)zero, (uint8x16_p)vec, R);
1084 template <
unsigned int C,
class T>
1100 #if (CRYPTOPP_BIG_ENDIAN) 1101 enum { R=(16-C)&0xf };
1102 return (T)vec_sld((uint8x16_p)zero, (uint8x16_p)vec, R);
1105 return (T)vec_sld((uint8x16_p)vec, (uint8x16_p)zero, R);
1123 template <
unsigned int C,
class T>
1126 #if (CRYPTOPP_BIG_ENDIAN) 1128 return (T)vec_sld((uint8x16_p)vec, (uint8x16_p)vec, R);
1130 enum { R=(16-C)&0xf };
1131 return (T)vec_sld((uint8x16_p)vec, (uint8x16_p)vec, R);
1148 template <
unsigned int C,
class T>
1151 #if (CRYPTOPP_BIG_ENDIAN) 1152 enum { R=(16-C)&0xf };
1153 return (T)vec_sld((uint8x16_p)vec, (uint8x16_p)vec, R);
1156 return (T)vec_sld((uint8x16_p)vec, (uint8x16_p)vec, R);
1168 template<
unsigned int C>
1171 const uint32x4_p m = {C, C, C, C};
1172 return vec_rl(vec, m);
1175 #if defined(_ARCH_PWR8) || defined(CRYPTOPP_DOXYGEN_PROCESSING) 1186 template<
unsigned int C>
1189 const uint64x2_p m = {C, 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>
1224 const uint64x2_p m = {64-C, 64-C};
1225 return vec_rl(vec, m);
1240 return (T)vec_sld((uint8x16_p)vec, (uint8x16_p)vec, 8);
1260 return VecShiftRightOctet<8>(VecShiftLeftOctet<8>(val));
1280 return VecShiftRightOctet<8>(val);
1294 template <
class T1,
class T2>
1297 return 1 == vec_all_eq((uint32x4_p)vec1, (uint32x4_p)vec2);
1311 template <
class T1,
class T2>
1314 return 0 == vec_all_eq((uint32x4_p)vec1, (uint32x4_p)vec2);
1319 #if defined(__CRYPTO__) || defined(CRYPTOPP_DOXYGEN_PROCESSING) 1332 template <
class T1,
class T2>
1335 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__)) 1336 return (T1)__vcipher((uint8x16_p)state, (uint8x16_p)key);
1337 #elif defined(__clang__) 1338 return (T1)__builtin_altivec_crypto_vcipher((uint64x2_p)state, (uint64x2_p)key);
1339 #elif defined(__GNUC__) 1340 return (T1)__builtin_crypto_vcipher((uint64x2_p)state, (uint64x2_p)key);
1357 template <
class T1,
class T2>
1360 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__)) 1361 return (T1)__vcipherlast((uint8x16_p)state, (uint8x16_p)key);
1362 #elif defined(__clang__) 1363 return (T1)__builtin_altivec_crypto_vcipherlast((uint64x2_p)state, (uint64x2_p)key);
1364 #elif defined(__GNUC__) 1365 return (T1)__builtin_crypto_vcipherlast((uint64x2_p)state, (uint64x2_p)key);
1382 template <
class T1,
class T2>
1385 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__)) 1386 return (T1)__vncipher((uint8x16_p)state, (uint8x16_p)key);
1387 #elif defined(__clang__) 1388 return (T1)__builtin_altivec_crypto_vncipher((uint64x2_p)state, (uint64x2_p)key);
1389 #elif defined(__GNUC__) 1390 return (T1)__builtin_crypto_vncipher((uint64x2_p)state, (uint64x2_p)key);
1407 template <
class T1,
class T2>
1410 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__)) 1411 return (T1)__vncipherlast((uint8x16_p)state, (uint8x16_p)key);
1412 #elif defined(__clang__) 1413 return (T1)__builtin_altivec_crypto_vncipherlast((uint64x2_p)state, (uint64x2_p)key);
1414 #elif defined(__GNUC__) 1415 return (T1)__builtin_crypto_vncipherlast((uint64x2_p)state, (uint64x2_p)key);
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.