view libtommath/bn_s_mp_rand_jenkins.c @ 1734:73646de50f13DROPBEAR_2020.80

version 2020.80
author Matt Johnston Fri, 26 Jun 2020 21:45:59 +0800 1051e4eea25a
line wrap: on
line source
```#include "tommath_private.h"
#ifdef BN_S_MP_RAND_JENKINS_C
/* LibTomMath, multiple-precision integer library -- Tom St Denis */

/* Bob Jenkins' http://burtleburtle.net/bob/rand/smallprng.html */
/* Chosen for speed and a good "mix" */
typedef struct {
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)
{
uint64_t i;
jenkins_x.a = 0xf1ea5eedULL;
jenkins_x.b = jenkins_x.c = jenkins_x.d = seed;
for (i = 0uLL; i < 20uLL; ++i) {
(void)s_rand_jenkins_val();
}
}

mp_err s_mp_rand_jenkins(void *p, size_t n)
{
char *q = (char *)p;
while (n > 0u) {
int i;
uint64_t x = s_rand_jenkins_val();
for (i = 0; (i < 8) && (n > 0u); ++i, --n) {
*q++ = (char)(x & 0xFFuLL);
x >>= 8;
}
}
return MP_OKAY;
}

#endif
```