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__)
636inline 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);
687inline void VecStore(
const T data,
int off, word32 dest[4])
730inline 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)
881template <
class T1,
class T2>
882inline T1
VecAnd(
const T1 vec1,
const T2 vec2)
884 return (T1)vec_and(vec1, (T1)vec2);
898template <
class T1,
class T2>
899inline T1
VecOr(
const T1 vec1,
const T2 vec2)
901 return (T1)vec_or(vec1, (T1)vec2);
915template <
class T1,
class T2>
916inline T1
VecXor(
const T1 vec1,
const T2 vec2)
918 return (T1)vec_xor(vec1, (T1)vec2);
938template <
class T1,
class T2>
939inline T1
VecAdd(
const T1 vec1,
const T2 vec2)
941 return (T1)vec_add(vec1, (T1)vec2);
955template <
class T1,
class T2>
956inline 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);
1009template <
class T1,
class T2>
1012 return (T1)vec_perm(vec, vec, (
uint8x16_p)mask);
1028template <
class T1,
class T2>
1031 return (T1)vec_perm(vec1, (T1)vec2, (
uint8x16_p)mask);
1055template <
unsigned int C,
class T>
1071#if (CRYPTOPP_BIG_ENDIAN)
1075 enum { R=(16-C)&0xf };
1102template <
unsigned int C,
class T>
1118#if (CRYPTOPP_BIG_ENDIAN)
1119 enum { R=(16-C)&0xf };
1141template <
unsigned int C,
class T>
1144#if (CRYPTOPP_BIG_ENDIAN)
1148 enum { R=(16-C)&0xf };
1166template <
unsigned int C,
class T>
1169#if (CRYPTOPP_BIG_ENDIAN)
1170 enum { R=(16-C)&0xf };
1186template<
unsigned int C>
1190 return vec_rl(vec, m);
1201template<
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)
1247template<
unsigned int C>
1251 return vec_rl(vec, m);
1263template<
unsigned int C>
1267 return vec_sl(vec, m);
1280template<
unsigned int C>
1283 const uint32x4_p m = {32-C, 32-C, 32-C, 32-C};
1284 return vec_rl(vec, m);
1295template<
unsigned int C>
1299 return vec_sr(vec, m);
1302#if defined(_ARCH_PWR8) || defined(CRYPTOPP_DOXYGEN_PROCESSING)
1313template<
unsigned int C>
1317 return vec_rl(vec, m);
1329template<
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);
1406template <
class T1,
class T2>
1423template <
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)
1592template <
class T1,
class T2>
1595#if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1597#elif defined(__clang__)
1599#elif defined(__GNUC__)
1617template <
class T1,
class T2>
1620#if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1622#elif defined(__clang__)
1624#elif defined(__GNUC__)
1642template <
class T1,
class T2>
1645#if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1647#elif defined(__clang__)
1649#elif defined(__GNUC__)
1667template <
class T1,
class T2>
1670#if defined(__ibmxl__) || (defined(_AIX) && defined(__xlC__))
1672#elif defined(__clang__)
1674#elif defined(__GNUC__)
1697template <
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);
1722template <
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);
1744#if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE
1745# pragma GCC diagnostic pop
Library configuration file.
Utility functions for the Crypto++ library.
Crypto++ library namespace.
uint32x4_p VecZero()
The 0 vector.
uint32x4_p VecRotateRight(const uint32x4_p vec)
Rotate a packed vector right.
T1 VecOr(const T1 vec1, const T2 vec2)
OR two vectors.
uint64x2_p VecPolyMultiply11LE(const uint64x2_p &a, const uint64x2_p &b)
Polynomial multiplication.
uint32x4_p VecLoadBE(const byte src[16])
Loads a vector from a byte array.
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.
T VecRotateRightOctet(const T vec)
Rotate a vector right.
T VecShiftRightOctet(const T vec)
Shift a vector right.
uint64x2_p VecPolyMultiply00LE(const uint64x2_p &a, const uint64x2_p &b)
Polynomial multiplication.
__vector unsigned int uint32x4_p
Vector of 32-bit elements.
void VecStoreBE(const T data, byte dest[16])
Stores a vector to a byte array.
T VecShiftLeftOctet(const T vec)
Shift a vector left.
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.
T VecMergeHigh(const T vec1, const T vec2)
Merge two vectors.
T VecSHA256(const T vec)
SHA256 Sigma functions.
__vector unsigned char uint8x16_p
Vector of 8-bit elements.
bool VecNotEqual(const T1 vec1, const T2 vec2)
Compare two vectors.
T1 VecXor(const T1 vec1, const T2 vec2)
XOR two vectors.
uint64x2_p VecPolyMultiply10LE(const uint64x2_p &a, const uint64x2_p &b)
Polynomial multiplication.
__vector unsigned long long uint64x2_p
Vector of 64-bit elements.
T1 VecSub(const T1 vec1, const T2 vec2)
Subtract two vectors.
bool VecEqual(const T1 vec1, const T2 vec2)
Compare two vectors.
T1 VecEncryptLast(const T1 state, const T2 key)
Final round of AES encryption.
T VecMergeLow(const T vec1, const T vec2)
Merge two vectors.
T1 VecEncrypt(const T1 state, const T2 key)
One round of AES encryption.
T1 VecDecryptLast(const T1 state, const T2 key)
Final round of AES decryption.
uint32x4_p VecPolyMultiply(const uint32x4_p &a, const uint32x4_p &b)
Polynomial multiplication.
T1 VecAdd(const T1 vec1, const T2 vec2)
Add two vectors.
uint32x4_p VecRotateLeft(const uint32x4_p vec)
Rotate a packed vector left.
T VecRotateLeftOctet(const T vec)
Rotate a vector left.
T VecSHA512(const T vec)
SHA512 Sigma functions.
T1 VecAnd(const T1 vec1, const T2 vec2)
AND two vectors.
uint32x4_p VecShiftRight(const uint32x4_p vec)
Shift a packed vector right.
T VecGetHigh(const T val)
Extract a dword from a vector.
T1 VecDecrypt(const T1 state, const T2 key)
One round of AES decryption.
void VecStore(const T data, byte dest[16])
Stores a vector to a byte array.
T VecReverse(const T data)
Reverse bytes in a vector.
uint32x4_p VecShiftLeft(const uint32x4_p vec)
Shift a packed vector left.
uint32x4_p VecOne()
The 1 vector.
T VecGetLow(const T val)
Extract a dword from a vector.
uint32x4_p VecAdd64(const uint32x4_p &vec1, const uint32x4_p &vec2)
Add two vectors.
T VecSwapWords(const T vec)
Exchange high and low double words.
__vector unsigned short uint16x8_p
Vector of 16-bit elements.
uint32x4_p VecLoad(const byte src[16])
Loads a vector from a byte array.
uint64x2_p VecPolyMultiply01LE(const uint64x2_p &a, const uint64x2_p &b)
Polynomial multiplication.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.