1*08b48e0bSAndroid Build Coastguard Worker #include <stdint.h>
2*08b48e0bSAndroid Build Coastguard Worker #include "afl-fuzz.h"
3*08b48e0bSAndroid Build Coastguard Worker #include "types.h"
4*08b48e0bSAndroid Build Coastguard Worker
5*08b48e0bSAndroid Build Coastguard Worker #define XXH_INLINE_ALL
6*08b48e0bSAndroid Build Coastguard Worker #include "xxhash.h"
7*08b48e0bSAndroid Build Coastguard Worker #undef XXH_INLINE_ALL
8*08b48e0bSAndroid Build Coastguard Worker
rand_set_seed(afl_state_t * afl,s64 init_seed)9*08b48e0bSAndroid Build Coastguard Worker void rand_set_seed(afl_state_t *afl, s64 init_seed) {
10*08b48e0bSAndroid Build Coastguard Worker
11*08b48e0bSAndroid Build Coastguard Worker afl->init_seed = init_seed;
12*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[0] =
13*08b48e0bSAndroid Build Coastguard Worker hash64((u8 *)&afl->init_seed, sizeof(afl->init_seed), HASH_CONST);
14*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[1] = afl->rand_seed[0] ^ 0x1234567890abcdef;
15*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[2] = (afl->rand_seed[0] & 0x1234567890abcdef) ^
16*08b48e0bSAndroid Build Coastguard Worker (afl->rand_seed[1] | 0xfedcba9876543210);
17*08b48e0bSAndroid Build Coastguard Worker
18*08b48e0bSAndroid Build Coastguard Worker }
19*08b48e0bSAndroid Build Coastguard Worker
20*08b48e0bSAndroid Build Coastguard Worker #define ROTL(d, lrot) ((d << (lrot)) | (d >> (8 * sizeof(d) - (lrot))))
21*08b48e0bSAndroid Build Coastguard Worker
22*08b48e0bSAndroid Build Coastguard Worker #ifdef WORD_SIZE_64
23*08b48e0bSAndroid Build Coastguard Worker // romuDuoJr
rand_next(afl_state_t * afl)24*08b48e0bSAndroid Build Coastguard Worker inline AFL_RAND_RETURN rand_next(afl_state_t *afl) {
25*08b48e0bSAndroid Build Coastguard Worker
26*08b48e0bSAndroid Build Coastguard Worker AFL_RAND_RETURN xp = afl->rand_seed[0];
27*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[0] = 15241094284759029579u * afl->rand_seed[1];
28*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[1] = afl->rand_seed[1] - xp;
29*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[1] = ROTL(afl->rand_seed[1], 27);
30*08b48e0bSAndroid Build Coastguard Worker return xp;
31*08b48e0bSAndroid Build Coastguard Worker
32*08b48e0bSAndroid Build Coastguard Worker }
33*08b48e0bSAndroid Build Coastguard Worker
34*08b48e0bSAndroid Build Coastguard Worker #else
35*08b48e0bSAndroid Build Coastguard Worker // RomuTrio32
rand_next(afl_state_t * afl)36*08b48e0bSAndroid Build Coastguard Worker inline AFL_RAND_RETURN rand_next(afl_state_t *afl) {
37*08b48e0bSAndroid Build Coastguard Worker
38*08b48e0bSAndroid Build Coastguard Worker AFL_RAND_RETURN xp = afl->rand_seed[0], yp = afl->rand_seed[1],
39*08b48e0bSAndroid Build Coastguard Worker zp = afl->rand_seed[2];
40*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[0] = 3323815723u * zp;
41*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[1] = yp - xp;
42*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[1] = ROTL(afl->rand_seed[1], 6);
43*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[2] = zp - yp;
44*08b48e0bSAndroid Build Coastguard Worker afl->rand_seed[2] = ROTL(afl->rand_seed[2], 22);
45*08b48e0bSAndroid Build Coastguard Worker return xp;
46*08b48e0bSAndroid Build Coastguard Worker
47*08b48e0bSAndroid Build Coastguard Worker }
48*08b48e0bSAndroid Build Coastguard Worker
49*08b48e0bSAndroid Build Coastguard Worker #endif
50*08b48e0bSAndroid Build Coastguard Worker
51*08b48e0bSAndroid Build Coastguard Worker #undef ROTL
52*08b48e0bSAndroid Build Coastguard Worker
53*08b48e0bSAndroid Build Coastguard Worker /* returns a double between 0.000000000 and 1.000000000 */
54*08b48e0bSAndroid Build Coastguard Worker
rand_next_percent(afl_state_t * afl)55*08b48e0bSAndroid Build Coastguard Worker inline double rand_next_percent(afl_state_t *afl) {
56*08b48e0bSAndroid Build Coastguard Worker
57*08b48e0bSAndroid Build Coastguard Worker return (double)(((double)rand_next(afl)) / (double)0xffffffffffffffff);
58*08b48e0bSAndroid Build Coastguard Worker
59*08b48e0bSAndroid Build Coastguard Worker }
60*08b48e0bSAndroid Build Coastguard Worker
61*08b48e0bSAndroid Build Coastguard Worker /* we switch from afl's murmur implementation to xxh3 as it is 30% faster -
62*08b48e0bSAndroid Build Coastguard Worker and get 64 bit hashes instead of just 32 bit. Less collisions! :-) */
63*08b48e0bSAndroid Build Coastguard Worker
64*08b48e0bSAndroid Build Coastguard Worker #ifdef _DEBUG
hash32(u8 * key,u32 len,u32 seed)65*08b48e0bSAndroid Build Coastguard Worker u32 hash32(u8 *key, u32 len, u32 seed) {
66*08b48e0bSAndroid Build Coastguard Worker
67*08b48e0bSAndroid Build Coastguard Worker #else
68*08b48e0bSAndroid Build Coastguard Worker inline u32 hash32(u8 *key, u32 len, u32 seed) {
69*08b48e0bSAndroid Build Coastguard Worker
70*08b48e0bSAndroid Build Coastguard Worker #endif
71*08b48e0bSAndroid Build Coastguard Worker
72*08b48e0bSAndroid Build Coastguard Worker (void)seed;
73*08b48e0bSAndroid Build Coastguard Worker return (u32)XXH3_64bits(key, len);
74*08b48e0bSAndroid Build Coastguard Worker
75*08b48e0bSAndroid Build Coastguard Worker }
76*08b48e0bSAndroid Build Coastguard Worker
77*08b48e0bSAndroid Build Coastguard Worker #ifdef _DEBUG
78*08b48e0bSAndroid Build Coastguard Worker u64 hash64(u8 *key, u32 len, u64 seed) {
79*08b48e0bSAndroid Build Coastguard Worker
80*08b48e0bSAndroid Build Coastguard Worker #else
81*08b48e0bSAndroid Build Coastguard Worker inline u64 hash64(u8 *key, u32 len, u64 seed) {
82*08b48e0bSAndroid Build Coastguard Worker
83*08b48e0bSAndroid Build Coastguard Worker #endif
84*08b48e0bSAndroid Build Coastguard Worker
85*08b48e0bSAndroid Build Coastguard Worker (void)seed;
86*08b48e0bSAndroid Build Coastguard Worker return XXH3_64bits(key, len);
87*08b48e0bSAndroid Build Coastguard Worker
88*08b48e0bSAndroid Build Coastguard Worker }
89*08b48e0bSAndroid Build Coastguard Worker
90