|
@@ -15,14 +15,22 @@ static const struct PRGkey {
|
|
|
// the left child, 1 for the right child
|
|
|
static inline void prg(__m128i &out, __m128i seed, bool whichchild)
|
|
|
{
|
|
|
- AES_ECB_encrypt(out, set_lsb(seed, whichchild), prgkey.k);
|
|
|
+ __m128i in = set_lsb(seed, whichchild);
|
|
|
+ __m128i mid;
|
|
|
+ AES_ECB_encrypt(mid, set_lsb(seed, whichchild), prgkey.k);
|
|
|
+ out = _mm_xor_si128(mid, in);
|
|
|
}
|
|
|
|
|
|
// Compute both children of node seed
|
|
|
static inline void prgboth(__m128i &left, __m128i &right, __m128i seed)
|
|
|
{
|
|
|
- AES_ECB_encrypt(left, set_lsb(seed, 0), prgkey.k);
|
|
|
- AES_ECB_encrypt(right, set_lsb(seed, 1), prgkey.k);
|
|
|
+ __m128i in0 = set_lsb(seed, 0);
|
|
|
+ __m128i in1 = set_lsb(seed, 1);
|
|
|
+ __m128i mid0, mid1;
|
|
|
+ AES_ECB_encrypt(mid0, set_lsb(seed, 0), prgkey.k);
|
|
|
+ AES_ECB_encrypt(mid1, set_lsb(seed, 1), prgkey.k);
|
|
|
+ left = _mm_xor_si128(mid0, in0);
|
|
|
+ right = _mm_xor_si128(mid1, in1);
|
|
|
}
|
|
|
|
|
|
#endif
|