summaryrefslogtreecommitdiff
path: root/rijndael_simd.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2020-04-10 11:51:19 -0400
committerJeffrey Walton <noloader@gmail.com>2020-04-10 11:51:19 -0400
commit00c5ff73f2d425e3c7ba2245fa0683231e0bf03f (patch)
treea47ba0839f07e0038e45ccbb016b66c69f3dda9d /rijndael_simd.cpp
parentb156cb17c7120332327193a0dff1b0657c667249 (diff)
downloadcryptopp-git-00c5ff73f2d425e3c7ba2245fa0683231e0bf03f.tar.gz
Fix Rijndael on PowerPC using Clang
Clang uses an indexed mode, which caused an out of bounds write at vec_xst(16, rkey).
Diffstat (limited to 'rijndael_simd.cpp')
-rw-r--r--rijndael_simd.cpp12
1 files changed, 3 insertions, 9 deletions
diff --git a/rijndael_simd.cpp b/rijndael_simd.cpp
index a08f17c0..aff998e8 100644
--- a/rijndael_simd.cpp
+++ b/rijndael_simd.cpp
@@ -705,22 +705,16 @@ void Rijndael_UncheckedSetKey_POWER8(const byte* userKey, size_t keyLen, word32*
#if (CRYPTOPP_LITTLE_ENDIAN)
rkey = rk;
const uint8x16_p mask = {12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3};
- const uint32x4_p zero = {0,0,0,0};
unsigned int i=0;
for (i=0; i<rounds; i+=2, rkey+=8)
{
- const uint32x4_p d1 = vec_xl( 0, rkey);
- const uint32x4_p d2 = vec_xl(16, rkey);
- vec_xst(VecPermute(d1, zero, mask), 0, rkey);
- vec_xst(VecPermute(d2, zero, mask), 16, rkey);
+ VecStore(VecPermute(VecLoad(rkey+0), mask), rkey+0);
+ VecStore(VecPermute(VecLoad(rkey+4), mask), rkey+4);
}
for ( ; i<rounds+1; i++, rkey+=4)
- {
- const uint32x4_p d = vec_xl( 0, rkey);
- vec_xst(VecPermute(d, zero, mask), 0, rkey);
- }
+ VecStore(VecPermute(VecLoad(rkey), mask), rkey);
#endif
}