bn_s_mp_rand_jenkins.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "tommath_private.h"
  2. #ifdef BN_S_MP_RAND_JENKINS_C
  3. /* LibTomMath, multiple-precision integer library -- Tom St Denis */
  4. /* SPDX-License-Identifier: Unlicense */
  5. /* Bob Jenkins' http://burtleburtle.net/bob/rand/smallprng.html */
  6. /* Chosen for speed and a good "mix" */
  7. typedef struct {
  8. uint64_t a;
  9. uint64_t b;
  10. uint64_t c;
  11. uint64_t d;
  12. } ranctx;
  13. static ranctx jenkins_x;
  14. #define rot(x,k) (((x)<<(k))|((x)>>(64-(k))))
  15. static uint64_t s_rand_jenkins_val(void)
  16. {
  17. uint64_t e = jenkins_x.a - rot(jenkins_x.b, 7);
  18. jenkins_x.a = jenkins_x.b ^ rot(jenkins_x.c, 13);
  19. jenkins_x.b = jenkins_x.c + rot(jenkins_x.d, 37);
  20. jenkins_x.c = jenkins_x.d + e;
  21. jenkins_x.d = e + jenkins_x.a;
  22. return jenkins_x.d;
  23. }
  24. void s_mp_rand_jenkins_init(uint64_t seed)
  25. {
  26. uint64_t i;
  27. jenkins_x.a = 0xf1ea5eedULL;
  28. jenkins_x.b = jenkins_x.c = jenkins_x.d = seed;
  29. for (i = 0uLL; i < 20uLL; ++i) {
  30. (void)s_rand_jenkins_val();
  31. }
  32. }
  33. mp_err s_mp_rand_jenkins(void *p, size_t n)
  34. {
  35. char *q = (char *)p;
  36. while (n > 0u) {
  37. int i;
  38. uint64_t x = s_rand_jenkins_val();
  39. for (i = 0; (i < 8) && (n > 0u); ++i, --n) {
  40. *q++ = (char)(x & 0xFFuLL);
  41. x >>= 8;
  42. }
  43. }
  44. return MP_OKAY;
  45. }
  46. #endif