prg.hpp 986 B

123456789101112131415161718192021222324252627282930313233343536
  1. #ifndef __PRG_HPP__
  2. #define __PRG_HPP__
  3. #include "bitutils.hpp"
  4. #include "aes.hpp"
  5. static const struct PRGkey {
  6. AESkey k;
  7. PRGkey(__m128i key = _mm_set_epi64x(314159265, 271828182)) {
  8. AES_128_Key_Expansion(k, key);
  9. }
  10. } prgkey;
  11. // Compute one of the children of node seed; whichchild=0 for
  12. // the left child, 1 for the right child
  13. static inline void prg(__m128i &out, __m128i seed, bool whichchild)
  14. {
  15. __m128i in = set_lsb(seed, whichchild);
  16. __m128i mid;
  17. AES_ECB_encrypt(mid, set_lsb(seed, whichchild), prgkey.k);
  18. out = _mm_xor_si128(mid, in);
  19. }
  20. // Compute both children of node seed
  21. static inline void prgboth(__m128i &left, __m128i &right, __m128i seed)
  22. {
  23. __m128i in0 = set_lsb(seed, 0);
  24. __m128i in1 = set_lsb(seed, 1);
  25. __m128i mid0, mid1;
  26. AES_ECB_encrypt(mid0, set_lsb(seed, 0), prgkey.k);
  27. AES_ECB_encrypt(mid1, set_lsb(seed, 1), prgkey.k);
  28. left = _mm_xor_si128(mid0, in0);
  29. right = _mm_xor_si128(mid1, in1);
  30. }
  31. #endif