1use crate::*;
2use hash::new_yadachash;
3use yadacha16k::BufferedRng;
4
5pub struct Yadarng {
6 c: u128,
7 h: hash::Yadachash,
8 i: usize
9}
10pub fn new_random_yadarng(rng: &mut dyn SeedRNG) -> Yadarng {
12 let mut brng = BufferedRng::new(rng, 16*1);
13 let mut r = Yadarng{
14 c: brng.take_u128(), h: new_yadachash(), i: 0
15 };
16 r.rehash();
17 r
18}
19pub fn new_fixed_yadarng(seed: u128) -> Yadarng {
21 let mut r = Yadarng{
22 c: seed, h: new_yadachash(), i: 0
23 };
24 r.rehash();
25 r
26}
27impl Yadarng {
28 fn rehash(&mut self) {
29 self.h.hash_all(&self.c.to_le_bytes());
30 }
31}
32impl SeedRNG for Yadarng {
33 fn fill(&mut self, buf: &mut [u8]) {
34 for b in buf {
35 *b = self.h.byte_at(self.i);
36 self.i += 1;
37 if self.i == hash::STATE_SIZE {
38 self.c = self.c.wrapping_add(1);
39 self.h = new_yadachash();
40 self.rehash();
41 self.i = 0;
42 }
43 }
44 }
45}