diff options
| author | Jeffrey Walton <noloader@gmail.com> | 2017-09-22 08:58:50 -0400 |
|---|---|---|
| committer | Jeffrey Walton <noloader@gmail.com> | 2017-09-22 08:58:50 -0400 |
| commit | 3bd01f73bae3ded9bc5b01681151bcfaf252d7cf (patch) | |
| tree | 2bbd5b708af9eb10f1727dd8f9a03d4846226a6f /ppc-simd.cpp | |
| parent | 375d5e18b30cb4f53b3315ea95f092e001ed50b4 (diff) | |
| download | cryptopp-git-3bd01f73bae3ded9bc5b01681151bcfaf252d7cf.tar.gz | |
Add Power8 SHA256 and SHA512 support (GH #513)
Diffstat (limited to 'ppc-simd.cpp')
| -rw-r--r-- | ppc-simd.cpp | 89 |
1 files changed, 26 insertions, 63 deletions
diff --git a/ppc-simd.cpp b/ppc-simd.cpp index 7fc18503..cabe8e7c 100644 --- a/ppc-simd.cpp +++ b/ppc-simd.cpp @@ -23,22 +23,9 @@ # undef CRYPTOPP_POWER8_CRYPTO_AVAILABLE
#endif
-#if defined(CRYPTOPP_ALTIVEC_AVAILABLE)
-# include <altivec.h>
-# undef vector
-# undef pixel
-# undef bool
-#endif
-
-#if defined(CRYPTOPP_ALTIVEC_AVAILABLE)
-# if defined(CRYPTOPP_XLC_VERSION)
- // #include <builtins.h>
- typedef __vector unsigned char uint8x16_p8;
- typedef __vector unsigned long long uint64x2_p8;
-#elif defined(CRYPTOPP_GCC_VERSION)
- typedef __vector unsigned char uint8x16_p8;
- typedef __vector unsigned long long uint64x2_p8;
- #endif
+// TODO.. Change to CRYPTOPP_POWER8_CRYPTO_AVAILABLE
+#if (CRYPTOPP_POWER8_AES_AVAILABLE)
+# include "ppc-crypto.h"
#endif
#ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY
@@ -94,14 +81,14 @@ bool CPU_ProbeAltivec() const byte b2[16] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
CRYPTOPP_ALIGN_DATA(16) byte b3[16];
#if defined(CRYPTOPP_XLC_VERSION)
- const uint8x16_p8 v1 = vec_ld(0, (const byte*)b1);
- const uint8x16_p8 v2 = vec_ld(0, (const byte*)b2);
- const uint8x16_p8 v3 = vec_xor(v1, v2);
+ const uint8x16_p8 v1 = VectorLoad(0, b1);
+ const uint8x16_p8 v2 = VectorLoad(0, b2);
+ const uint8x16_p8 v3 = VectorXor(v1, v2);
vec_st(v3, 0, (byte*)b3);
#elif defined(CRYPTOPP_GCC_VERSION)
- const uint64x2_p8 v1 = (uint64x2_p8)vec_ld(0, (const byte*)b1);
- const uint64x2_p8 v2 = (uint64x2_p8)vec_ld(0, (const byte*)b2);
- const uint64x2_p8 v3 = (uint64x2_p8)vec_xor(v1, v2);
+ const uint64x2_p8 v1 = (uint64x2_p8)VectorLoad(0, b1);
+ const uint64x2_p8 v2 = (uint64x2_p8)VectorLoad(0, b2);
+ const uint64x2_p8 v3 = (uint64x2_p8)VectorXor(v1, v2);
vec_st((uint8x16_p8)v3, 0, (byte*)b3);
#endif
result = (0 == std::memcmp(b2, b3, 16));
@@ -121,7 +108,7 @@ bool CPU_ProbePower7() {
#if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES)
return false;
-#elif (CRYPTOPP_POWER7_AVAILABLE)
+#elif (CRYPTOPP_POWER7_AVAILABLE) && 0
# if defined(CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY)
// longjmp and clobber warnings. Volatile is required.
@@ -140,17 +127,7 @@ bool CPU_ProbePower7() result = false;
else
{
- CRYPTOPP_ALIGN_DATA(16) // Non-const due to XL C/C++
- byte b1[19] = {-1, -1, -1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
- CRYPTOPP_ALIGN_DATA(16) byte b2[16];
-#if defined(CRYPTOPP_XLC_VERSION)
- const uint8x16_p8 v1 = vec_xl(0, (const byte*)b1+3);
- vec_xst(v1, 0, (byte*)b2);
-#elif defined(CRYPTOPP_GCC_VERSION)
- const uint8x16_p8 v1 = vec_vsx_ld(0, b1+3);
- vec_vsx_st(v1, 0, (byte*)b2);
-#endif
- result = (0 == std::memcmp(b1+3, b2, 16));
+ // TODO
}
sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
@@ -186,17 +163,11 @@ bool CPU_ProbePower8() result = false;
else
{
- CRYPTOPP_ALIGN_DATA(16) // Non-const due to XL C/C++
- byte b1[19] = {255, 255, 255, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
- CRYPTOPP_ALIGN_DATA(16) byte b2[16];
-#if defined(CRYPTOPP_XLC_VERSION)
- const uint8x16_p8 v1 = vec_xl(0, reinterpret_cast<byte*>(b1)+3);
- vec_xst(v1, 0, reinterpret_cast<byte*>(b2));
-#elif defined(CRYPTOPP_GCC_VERSION)
- const uint8x16_p8 v1 = vec_vsx_ld(0, b1+3);
- vec_vsx_st(v1, 0, b2);
-#endif
- result = (0 == std::memcmp(b1+3, b2, 16));
+ byte b1[19] = {255, 255, 255, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, b2[17];
+ const uint8x16_p8 v1 = (uint8x16_p8)VectorLoad(0, b1+3);
+ VectorStore(v1, b2+1);
+
+ result = (0 == std::memcmp(b1+3, b2+1, 16));
}
sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
@@ -231,24 +202,16 @@ bool CPU_ProbeAES() result = false;
else
{
- CRYPTOPP_ALIGN_DATA(16) // Non-const due to XL C/C++
byte key[16] = {0xA0, 0xFA, 0xFE, 0x17, 0x88, 0x54, 0x2c, 0xb1, 0x23, 0xa3, 0x39, 0x39, 0x2a, 0x6c, 0x76, 0x05};
- CRYPTOPP_ALIGN_DATA(16) // Non-const due to XL C/C++
byte state[16] = {0x19, 0x3d, 0xe3, 0xb3, 0xa0, 0xf4, 0xe2, 0x2b, 0x9a, 0xc6, 0x8d, 0x2a, 0xe9, 0xf8, 0x48, 0x08};
- CRYPTOPP_ALIGN_DATA(16) byte r[16] = {255}, z[16] = {};
-#if defined(CRYPTOPP_XLC_VERSION)
- uint8x16_p8 k = vec_xl(0, reinterpret_cast<byte*>(key));
- uint8x16_p8 s = vec_xl(0, reinterpret_cast<byte*>(state));
- s = __vncipher(s, k);
- s = __vncipherlast(s, k);
- vec_xst(s, 0, reinterpret_cast<byte*>(r));
-#elif defined(CRYPTOPP_GCC_VERSION)
- uint64x2_p8 k = (uint64x2_p8)vec_xl(0, key);
- uint64x2_p8 s = (uint64x2_p8)vec_xl(0, state);
- s = __builtin_crypto_vncipher(s, k);
- s = __builtin_crypto_vncipherlast(s, k);
- vec_xst((uint8x16_p8)s, 0, r);
-#endif
+ byte r[16] = {255}, z[16] = {};
+
+ uint8x16_p8 k = (uint8x16_p8)VectorLoad(0, key);
+ uint8x16_p8 s = (uint8x16_p8)VectorLoad(0, state);
+ s = VectorEncrypt(s, k);
+ s = VectorEncryptLast(s, k);
+ VectorStore(s, r);
+
result = (0 != std::memcmp(r, z, 16));
}
@@ -261,7 +224,7 @@ bool CPU_ProbeAES() #endif // CRYPTOPP_ALTIVEC_AVAILABLE
}
-bool CPU_ProbeSHA1()
+bool CPU_ProbeSHA256()
{
#if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES)
return false;
@@ -296,7 +259,7 @@ bool CPU_ProbeSHA1() #endif // CRYPTOPP_ALTIVEC_AVAILABLE
}
-bool CPU_ProbeSHA2()
+bool CPU_ProbeSHA512()
{
#if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES)
return false;
|
