6 static uint32 seed
[32];
9 static int outleft
= 0;
11 #define ROTATE(x,b) (((x) << (b)) | ((x) >> (32 - (b))))
12 #define MUSH(i,b) x = t[i] += (((x ^ seed[i]) + sum) ^ ROTATE(x,b));
14 static void surf(void)
16 uint32 t
[12]; uint32 x
; uint32 sum
= 0;
17 int r
; int i
; int loop
;
19 for (i
= 0;i
< 12;++i
) t
[i
] = in
[i
] ^ seed
[12 + i
];
20 for (i
= 0;i
< 8;++i
) out
[i
] = seed
[24 + i
];
22 for (loop
= 0;loop
< 2;++loop
) {
23 for (r
= 0;r
< 16;++r
) {
25 MUSH(0,5) MUSH(1,7) MUSH(2,9) MUSH(3,13)
26 MUSH(4,5) MUSH(5,7) MUSH(6,9) MUSH(7,13)
27 MUSH(8,5) MUSH(9,7) MUSH(10,9) MUSH(11,13)
29 for (i
= 0;i
< 8;++i
) out
[i
] ^= t
[i
+ 4];
33 void dns_random_init(const char data
[128])
39 for (i
= 0;i
< 32;++i
)
40 uint32_unpack(data
+ 4 * i
,seed
+ i
);
45 uint32_unpack(tpack
+ 4 * i
,in
+ 4 + i
);
49 /* more space in 10 and 11, but this is probably enough */
52 unsigned int dns_random(unsigned int n
)
57 if (!++in
[0]) if (!++in
[1]) if (!++in
[2]) ++in
[3];
62 return out
[--outleft
] % n
;