prg.hpp 1013 B

1234567891011121314151617181920212223242526272829303132333435363738
  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. size_t &aes_ops)
  15. {
  16. __m128i in = set_lsb(seed, whichchild);
  17. __m128i mid;
  18. AES_ECB_encrypt(mid, set_lsb(seed, whichchild), prgkey.k, aes_ops);
  19. out = mid ^ in;
  20. }
  21. // Compute both children of node seed
  22. static inline void prgboth(__m128i &left, __m128i &right, __m128i seed,
  23. size_t &aes_ops)
  24. {
  25. __m128i in0 = set_lsb(seed, 0);
  26. __m128i in1 = set_lsb(seed, 1);
  27. __m128i mid0, mid1;
  28. AES_ECB_encrypt(mid0, set_lsb(seed, 0), prgkey.k, aes_ops);
  29. AES_ECB_encrypt(mid1, set_lsb(seed, 1), prgkey.k, aes_ops);
  30. left = mid0 ^ in0;
  31. right = mid1 ^ in1;
  32. }
  33. #endif