| 1234567891011121314151617181920212223242526272829303132333435363738 | 
							- #ifndef __PRG_HPP__
 
- #define __PRG_HPP__
 
- #include "bitutils.hpp"
 
- #include "aes.hpp"
 
- static const struct PRGkey {
 
-     AESkey k;
 
-     PRGkey(__m128i key = _mm_set_epi64x(314159265, 271828182)) {
 
-         AES_128_Key_Expansion(k, key);
 
-     }
 
- } prgkey;
 
- // Compute one of the children of node seed; whichchild=0 for
 
- // the left child, 1 for the right child
 
- static inline void prg(__m128i &out, __m128i seed, bool whichchild,
 
-     size_t &aes_ops)
 
- {
 
-     __m128i in = set_lsb(seed, whichchild);
 
-     __m128i mid;
 
-     AES_ECB_encrypt(mid, set_lsb(seed, whichchild), prgkey.k, aes_ops);
 
-     out = mid ^ in;
 
- }
 
- // Compute both children of node seed
 
- static inline void prgboth(__m128i &left, __m128i &right, __m128i seed,
 
-     size_t &aes_ops)
 
- {
 
-     __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_ops);
 
-     AES_ECB_encrypt(mid1, set_lsb(seed, 1), prgkey.k, aes_ops);
 
-     left = mid0 ^ in0;
 
-     right = mid1 ^ in1;
 
- }
 
- #endif
 
 
  |