2019-05-12 09:33:17 +00:00
|
|
|
#include "tommath_private.h"
|
2019-10-19 14:24:39 +00:00
|
|
|
#ifdef S_MP_RAND_JENKINS_C
|
2019-05-12 09:33:17 +00:00
|
|
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
|
|
|
/* SPDX-License-Identifier: Unlicense */
|
|
|
|
|
|
|
|
/* Bob Jenkins' http://burtleburtle.net/bob/rand/smallprng.html */
|
|
|
|
/* Chosen for speed and a good "mix" */
|
2019-05-14 16:44:01 +00:00
|
|
|
typedef struct {
|
2019-05-12 09:33:17 +00:00
|
|
|
uint64_t a;
|
|
|
|
uint64_t b;
|
|
|
|
uint64_t c;
|
|
|
|
uint64_t d;
|
|
|
|
} ranctx;
|
|
|
|
|
|
|
|
static ranctx jenkins_x;
|
|
|
|
|
|
|
|
#define rot(x,k) (((x)<<(k))|((x)>>(64-(k))))
|
|
|
|
static uint64_t s_rand_jenkins_val(void)
|
|
|
|
{
|
|
|
|
uint64_t e = jenkins_x.a - rot(jenkins_x.b, 7);
|
|
|
|
jenkins_x.a = jenkins_x.b ^ rot(jenkins_x.c, 13);
|
|
|
|
jenkins_x.b = jenkins_x.c + rot(jenkins_x.d, 37);
|
|
|
|
jenkins_x.c = jenkins_x.d + e;
|
|
|
|
jenkins_x.d = e + jenkins_x.a;
|
|
|
|
return jenkins_x.d;
|
|
|
|
}
|
|
|
|
|
|
|
|
void s_mp_rand_jenkins_init(uint64_t seed)
|
|
|
|
{
|
2019-11-09 19:23:03 +00:00
|
|
|
int i;
|
2019-11-12 14:30:34 +00:00
|
|
|
jenkins_x.a = 0xF1EA5EEDuL;
|
2019-05-12 09:33:17 +00:00
|
|
|
jenkins_x.b = jenkins_x.c = jenkins_x.d = seed;
|
2019-11-09 19:23:03 +00:00
|
|
|
for (i = 0; i < 20; ++i) {
|
2019-05-12 09:33:17 +00:00
|
|
|
(void)s_rand_jenkins_val();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-12 22:22:18 +00:00
|
|
|
mp_err s_mp_rand_jenkins(void *p, size_t n)
|
2019-05-12 09:33:17 +00:00
|
|
|
{
|
|
|
|
char *q = (char *)p;
|
2019-05-13 15:51:07 +00:00
|
|
|
while (n > 0u) {
|
2019-05-12 09:33:17 +00:00
|
|
|
int i;
|
|
|
|
uint64_t x = s_rand_jenkins_val();
|
2019-05-13 15:51:07 +00:00
|
|
|
for (i = 0; (i < 8) && (n > 0u); ++i, --n) {
|
2019-11-12 14:30:34 +00:00
|
|
|
*q++ = (char)(x & 0xFFu);
|
2019-05-12 09:33:17 +00:00
|
|
|
x >>= 8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return MP_OKAY;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|