Crypto++
8.2
Free C++ class library of cryptographic schemes
|
Go to the documentation of this file.
67 #ifndef CRYPTOPP_PPC_CRYPTO_H
68 #define CRYPTOPP_PPC_CRYPTO_H
73 #if defined(__ALTIVEC__)
82 #if defined(_AIX) && defined(_ARCH_PWR8) && (__xlC__ >= 0xd01)
97 #if defined(__xlc__) && (__xlc__ < 0x0d01)
98 # define __early_xlc__ 1
100 #if defined(__xlC__) && (__xlC__ < 0x0d01)
101 # define __early_xlC__ 1
106 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE
107 # pragma GCC diagnostic push
108 # pragma GCC diagnostic ignored "-Wdeprecated"
113 #if defined(__ALTIVEC__) || defined(CRYPTOPP_DOXYGEN_PROCESSING)
131 #if defined(_ARCH_PWR8) || defined(CRYPTOPP_DOXYGEN_PROCESSING)
174 const uint8x16_p mask = {15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0};
175 return (T)vec_perm(data, data, mask);
196 uintptr_t eff =
reinterpret_cast<uintptr_t
>(src)+0;
226 uintptr_t eff =
reinterpret_cast<uintptr_t
>(src)+off;
255 #if defined(_ARCH_PWR8)
256 # if defined(__early_xlc__) || defined(__early_xlC__)
258 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__)
283 #if defined(_ARCH_PWR8)
284 # if defined(__early_xlc__) || defined(__early_xlC__)
286 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__)
289 return (
uint32x4_p)vec_vsx_ld(off, (
byte*)src);
310 return VecLoad((
const byte*)src);
328 return VecLoad(off, (
const byte*)src);
331 #if defined(_ARCH_PWR8) || defined(CRYPTOPP_DOXYGEN_PROCESSING)
385 #if defined(_ARCH_PWR8)
386 # if defined(__early_xlc__) || defined(__early_xlC__)
388 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__)
413 #if defined(_ARCH_PWR8)
414 # if defined(__early_xlc__) || defined(__early_xlC__)
416 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__)
419 return (
uint32x4_p)vec_vsx_ld(off, (
byte*)src);
442 #if defined(_ARCH_PWR8)
443 # if defined(__early_xlc__) || defined(__early_xlC__)
444 # if (CRYPTOPP_BIG_ENDIAN)
449 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__)
452 # if (CRYPTOPP_BIG_ENDIAN)
459 # if (CRYPTOPP_BIG_ENDIAN)
483 #if defined(_ARCH_PWR8)
484 # if defined(__early_xlc__) || defined(__early_xlC__)
485 # if (CRYPTOPP_BIG_ENDIAN)
490 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__)
491 return (
uint32x4_p)vec_xl_be(off, (
byte*)src);
493 # if (CRYPTOPP_BIG_ENDIAN)
494 return (
uint32x4_p)vec_vsx_ld(off, (
byte*)src);
500 # if (CRYPTOPP_BIG_ENDIAN)
531 uintptr_t eff =
reinterpret_cast<uintptr_t
>(dest)+0;
540 vec_ste((
uint8x16_p) perm, 0, (
unsigned char*) dest);
541 vec_ste((
uint16x8_p) perm, 1, (
unsigned short*)dest);
542 vec_ste((
uint32x4_p) perm, 3, (
unsigned int*) dest);
543 vec_ste((
uint32x4_p) perm, 4, (
unsigned int*) dest);
544 vec_ste((
uint32x4_p) perm, 8, (
unsigned int*) dest);
545 vec_ste((
uint32x4_p) perm, 12, (
unsigned int*) dest);
546 vec_ste((
uint16x8_p) perm, 14, (
unsigned short*)dest);
547 vec_ste((
uint8x16_p) perm, 15, (
unsigned char*) dest);
570 uintptr_t eff =
reinterpret_cast<uintptr_t
>(dest)+off;
579 vec_ste((
uint8x16_p) perm, 0, (
unsigned char*) dest);
580 vec_ste((
uint16x8_p) perm, 1, (
unsigned short*)dest);
581 vec_ste((
uint32x4_p) perm, 3, (
unsigned int*) dest);
582 vec_ste((
uint32x4_p) perm, 4, (
unsigned int*) dest);
583 vec_ste((
uint32x4_p) perm, 8, (
unsigned int*) dest);
584 vec_ste((
uint32x4_p) perm, 12, (
unsigned int*) dest);
585 vec_ste((
uint16x8_p) perm, 14, (
unsigned short*)dest);
586 vec_ste((
uint8x16_p) perm, 15, (
unsigned char*) dest);
607 #if defined(_ARCH_PWR8)
608 # if defined(__early_xlc__) || defined(__early_xlC__)
610 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__)
636 inline void VecStore(
const T data,
int off,
byte dest[16])
638 #if defined(_ARCH_PWR8)
639 # if defined(__early_xlc__) || defined(__early_xlC__)
640 vec_xstw4((
uint8x16_p)data, off, (
byte*)dest);
641 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__)
644 vec_vsx_st((
uint8x16_p)data, off, (
byte*)dest);
687 inline void VecStore(
const T data,
int off, word32 dest[4])
730 inline void VecStore(
const T data,
int off, word64 dest[2])
753 #if defined(_ARCH_PWR8)
754 # if defined(__early_xlc__) || defined(__early_xlC__)
755 # if (CRYPTOPP_BIG_ENDIAN)
760 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__)
763 # if (CRYPTOPP_BIG_ENDIAN)
770 # if (CRYPTOPP_BIG_ENDIAN)
797 #if defined(_ARCH_PWR8)
798 # if defined(__early_xlc__) || defined(__early_xlC__)
799 # if (CRYPTOPP_BIG_ENDIAN)
800 vec_xstw4((
uint8x16_p)data, off, (
byte*)dest);
804 # elif defined(__xlc__) || defined(__xlC__) || defined(__clang__)
805 vec_xst_be((
uint8x16_p)data, off, (
byte*)dest);
807 # if (CRYPTOPP_BIG_ENDIAN)
808 vec_vsx_st((
uint8x16_p)data, off, (
byte*)dest);
814 # if (CRYPTOPP_BIG_ENDIAN)
860 inline void VecStoreBE(
const T data,
int off, word32 dest[4])
881 template <
class T1,
class T2>
882 inline T1
VecAnd(
const T1 vec1,
const T2 vec2)
884 return (T1)vec_and(vec1, (T1)vec2);
898 template <
class T1,
class T2>
899 inline T1
VecOr(
const T1 vec1,
const T2 vec2)
901 return (T1)vec_or(vec1, (T1)vec2);
915 template <
class T1,
class T2>
916 inline T1
VecXor(
const T1 vec1,
const T2 vec2)
918 return (T1)vec_xor(vec1, (T1)vec2);
938 template <
class T1,
class T2>
939 inline T1
VecAdd(
const T1 vec1,
const T2 vec2)
941 return (T1)vec_add(vec1, (T1)vec2);
955 template <
class T1,
class T2>
956 inline T1
VecSub(
const T1 vec1,
const T2 vec2)
958 return (T1)vec_sub(vec1, (T1)vec2);
977 #if defined(_ARCH_PWR8)
983 const uint8x16_p cmask = {4,5,6,7, 16,16,16,16, 12,13,14,15, 16,16,16,16};
987 cy = vec_perm(cy, zero, cmask);
988 return vec_add(vec_add(vec1, vec2), cy);
1009 template <
class T1,
class T2>
1012 return (T1)vec_perm(vec, vec, (
uint8x16_p)mask);
1028 template <
class T1,
class T2>
1029 inline T1
VecPermute(
const T1 vec1,
const T1 vec2,
const T2 mask)
1031 return (T1)vec_perm(vec1, (T1)vec2, (
uint8x16_p)mask);
1055 template <
unsigned int C,
class T>
1071 #if (CRYPTOPP_BIG_ENDIAN)
1075 enum { R=(16-C)&0xf };
1102 template <
unsigned int C,
class T>
1118 #if (CRYPTOPP_BIG_ENDIAN)
1119 enum { R=(16-C)&0xf };
1141 template <
unsigned int C,
class T>
1144 #if (CRYPTOPP_BIG_ENDIAN)
1148 enum { R=(16-C)&0xf };
1166 template <
unsigned int C,
class T>
1169 #if (CRYPTOPP_BIG_ENDIAN)
1170 enum { R=(16-C)&0xf };
1186 template<
unsigned int C>
1190 return vec_rl(vec, m);
1201 template<
unsigned int C>
1205 return vec_sl(vec, m);
1219 return vec_mergeh(vec1, vec2);
1233 return vec_mergel(vec1, vec2);
1236 #if defined(_ARCH_PWR8) || defined(CRYPTOPP_DOXYGEN_PROCESSING)
1247 template<
unsigned int C>
1251 return vec_rl(vec, m);
1263 template<
unsigned int C>
1267 return vec_sl(vec, m);
1280 template<
unsigned int C>
1283 const uint32x4_p m = {32-C, 32-C, 32-C, 32-C};
1284 return vec_rl(vec, m);
1295 template<
unsigned int C>
1299 return vec_sr(vec, m);
1302 #if defined(_ARCH_PWR8) || defined(CRYPTOPP_DOXYGEN_PROCESSING)
1313 template<
unsigned int C>
1317 return vec_rl(vec, m);
1329 template<
unsigned int C>
1333 return vec_sr(vec, m);
1365 #if (CRYPTOPP_BIG_ENDIAN) && (_ARCH_PWR8)
1369 return VecShiftRightOctet<8>(VecShiftLeftOctet<8>(val));
1387 #if (CRYPTOPP_BIG_ENDIAN) && (_ARCH_PWR8)
1391 return VecShiftRightOctet<8>(val);
1406 template <
class T1,
class T2>
1423 template <
class T1,
class T2>
1433 #if defined(__CRYPTO__) || defined(CRYPTOPP_DOXYGEN_PROCESSING)
1454 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1455 return __vpmsumw (a, b);
1456 #elif defined(__clang__)
1457 return __builtin_altivec_crypto_vpmsumw (a, b);
1459 return __builtin_crypto_vpmsumw (a, b);
1479 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1480 return __vpmsumd (a, b);
1481 #elif defined(__clang__)
1482 return __builtin_altivec_crypto_vpmsumd (a, b);
1484 return __builtin_crypto_vpmsumd (a, b);
1503 #if (CRYPTOPP_BIG_ENDIAN)
1525 #if (CRYPTOPP_BIG_ENDIAN)
1547 #if (CRYPTOPP_BIG_ENDIAN)
1569 #if (CRYPTOPP_BIG_ENDIAN)
1592 template <
class T1,
class T2>
1595 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1597 #elif defined(__clang__)
1599 #elif defined(__GNUC__)
1617 template <
class T1,
class T2>
1620 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1622 #elif defined(__clang__)
1624 #elif defined(__GNUC__)
1642 template <
class T1,
class T2>
1645 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1647 #elif defined(__clang__)
1649 #elif defined(__GNUC__)
1667 template <
class T1,
class T2>
1670 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1672 #elif defined(__clang__)
1674 #elif defined(__GNUC__)
1697 template <
int func,
int fmask,
class T>
1700 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1701 return (T)__vshasigmaw((
uint32x4_p)vec, func, fmask);
1702 #elif defined(__clang__)
1703 return (T)__builtin_altivec_crypto_vshasigmaw((
uint32x4_p)vec, func, fmask);
1704 #elif defined(__GNUC__)
1705 return (T)__builtin_crypto_vshasigmaw((
uint32x4_p)vec, func, fmask);
1722 template <
int func,
int fmask,
class T>
1725 #if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1726 return (T)__vshasigmad((
uint64x2_p)vec, func, fmask);
1727 #elif defined(__clang__)
1728 return (T)__builtin_altivec_crypto_vshasigmad((
uint64x2_p)vec, func, fmask);
1729 #elif defined(__GNUC__)
1730 return (T)__builtin_crypto_vshasigmad((
uint64x2_p)vec, func, fmask);
1738 #endif // __CRYPTO__
1744 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE
1745 # pragma GCC diagnostic pop
1748 #endif // CRYPTOPP_PPC_CRYPTO_H
T1 VecAnd(const T1 vec1, const T2 vec2)
AND two vectors.
uint32x4_p VecRotateLeft(const uint32x4_p vec)
Rotate a packed vector left.
uint32x4_p VecPolyMultiply(const uint32x4_p &a, const uint32x4_p &b)
Polynomial multiplication.
__vector unsigned long long uint64x2_p
Vector of 64-bit elements.
__vector unsigned char uint8x16_p
Vector of 8-bit elements.
uint64x2_p VecPolyMultiply10LE(const uint64x2_p &a, const uint64x2_p &b)
Polynomial multiplication.
void VecStoreBE(const T data, byte dest[16])
Stores a vector to a byte array.
T1 VecSub(const T1 vec1, const T2 vec2)
Subtract two vectors.
T VecGetHigh(const T val)
Extract a dword from a vector.
void VecStore_ALTIVEC(const T data, byte dest[16])
Stores a vector to a byte array.
uint32x4_p VecLoadAligned(const byte src[16])
Loads a vector from an aligned byte array.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
void VecStore(const T data, byte dest[16])
Stores a vector to a byte array.
T1 VecDecryptLast(const T1 state, const T2 key)
Final round of AES decryption.
uint64x2_p VecPolyMultiply01LE(const uint64x2_p &a, const uint64x2_p &b)
Polynomial multiplication.
T VecRotateRightOctet(const T vec)
Rotate a vector right.
__vector unsigned int uint32x4_p
Vector of 32-bit elements.
uint32x4_p VecZero()
The 0 vector.
__vector unsigned short uint16x8_p
Vector of 16-bit elements.
T VecGetLow(const T val)
Extract a dword from a vector.
T VecMergeLow(const T vec1, const T vec2)
Merge two vectors.
T VecShiftRightOctet(const T vec)
Shift a vector right.
Utility functions for the Crypto++ library.
T VecSwapWords(const T vec)
Exchange high and low double words.
T VecMergeHigh(const T vec1, const T vec2)
Merge two vectors.
uint32x4_p VecLoad_ALTIVEC(const byte src[16])
Loads a vector from a byte array.
uint32x4_p VecLoad(const byte src[16])
Loads a vector from a byte array.
uint32x4_p VecLoadBE(const byte src[16])
Loads a vector from a byte array.
uint32x4_p VecAdd64(const uint32x4_p &vec1, const uint32x4_p &vec2)
Add two vectors.
T1 VecOr(const T1 vec1, const T2 vec2)
OR two vectors.
uint32x4_p VecRotateRight(const uint32x4_p vec)
Rotate a packed vector right.
uint32x4_p VecShiftLeft(const uint32x4_p vec)
Shift a packed vector left.
T VecReverse(const T data)
Reverse bytes in a vector.
T1 VecXor(const T1 vec1, const T2 vec2)
XOR two vectors.
bool VecEqual(const T1 vec1, const T2 vec2)
Compare two vectors.
T VecRotateLeftOctet(const T vec)
Rotate a vector left.
uint32x4_p VecShiftRight(const uint32x4_p vec)
Shift a packed vector right.
T1 VecEncryptLast(const T1 state, const T2 key)
Final round of AES encryption.
Crypto++ library namespace.
uint32x4_p VecOne()
The 1 vector.
Library configuration file.
T VecSHA256(const T vec)
SHA256 Sigma functions.
T1 VecPermute(const T1 vec, const T2 mask)
Permutes a vector.
uint64x2_p VecPolyMultiply00LE(const uint64x2_p &a, const uint64x2_p &b)
Polynomial multiplication.
bool VecNotEqual(const T1 vec1, const T2 vec2)
Compare two vectors.
T1 VecDecrypt(const T1 state, const T2 key)
One round of AES decryption.
T1 VecAdd(const T1 vec1, const T2 vec2)
Add two vectors.
T VecShiftLeftOctet(const T vec)
Shift a vector left.
T VecSHA512(const T vec)
SHA512 Sigma functions.
T1 VecEncrypt(const T1 state, const T2 key)
One round of AES encryption.
uint64x2_p VecPolyMultiply11LE(const uint64x2_p &a, const uint64x2_p &b)
Polynomial multiplication.