Line data Source code
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 :
6 : /* Bob Jenkins' http://burtleburtle.net/bob/rand/smallprng.html */
7 : /* Chosen for speed and a good "mix" */
8 : typedef struct {
9 : uint64_t a;
10 : uint64_t b;
11 : uint64_t c;
12 : uint64_t d;
13 : } ranctx;
14 :
15 : static ranctx jenkins_x;
16 :
17 : #define rot(x,k) (((x)<<(k))|((x)>>(64-(k))))
18 0 : static uint64_t s_rand_jenkins_val(void)
19 : {
20 0 : uint64_t e = jenkins_x.a - rot(jenkins_x.b, 7);
21 0 : jenkins_x.a = jenkins_x.b ^ rot(jenkins_x.c, 13);
22 0 : jenkins_x.b = jenkins_x.c + rot(jenkins_x.d, 37);
23 0 : jenkins_x.c = jenkins_x.d + e;
24 0 : jenkins_x.d = e + jenkins_x.a;
25 0 : return jenkins_x.d;
26 : }
27 :
28 0 : void s_mp_rand_jenkins_init(uint64_t seed)
29 : {
30 : uint64_t i;
31 0 : jenkins_x.a = 0xf1ea5eedULL;
32 0 : jenkins_x.b = jenkins_x.c = jenkins_x.d = seed;
33 0 : for (i = 0uLL; i < 20uLL; ++i) {
34 0 : (void)s_rand_jenkins_val();
35 : }
36 0 : }
37 :
38 0 : mp_err s_mp_rand_jenkins(void *p, size_t n)
39 : {
40 0 : char *q = (char *)p;
41 0 : while (n > 0u) {
42 : int i;
43 0 : uint64_t x = s_rand_jenkins_val();
44 0 : for (i = 0; (i < 8) && (n > 0u); ++i, --n) {
45 0 : *q++ = (char)(x & 0xFFuLL);
46 0 : x >>= 8;
47 : }
48 : }
49 0 : return MP_OKAY;
50 : }
51 :
52 : #endif
|