Merge pull request #269 from TheBlueMatt/2018-12-198-review
[rust-lightning] / src / util / rng.rs
index f0d4492521b82d090c33c3f570dff9472e6c767d..ae50154d95dea23b29d25c36aeff13372b4b101a 100644 (file)
@@ -1,16 +1,16 @@
 #[cfg(not(feature = "fuzztarget"))]
 mod real_rng {
        use rand::{thread_rng,Rng};
-       use bitcoin::util::uint::Uint256;
 
        pub fn fill_bytes(data: &mut [u8]) {
                let mut rng = thread_rng();
                rng.fill_bytes(data);
        }
 
-       pub fn rand_uint256() -> Uint256 {
-               let mut rng = thread_rng();
-               Uint256([rng.gen(), rng.gen(), rng.gen(), rng.gen()])
+       pub fn rand_u832() -> [u8; 32] {
+               let mut res = [0; 32];
+               fill_bytes(&mut res);
+               res
        }
 
        pub fn rand_f32() -> f32 {
@@ -23,20 +23,38 @@ pub use self::real_rng::*;
 
 #[cfg(feature = "fuzztarget")]
 mod fuzzy_rng {
-       use bitcoin::util::uint::Uint256;
+       use util::byte_utils;
+
+       static mut RNG_ITER: u64 = 0;
 
        pub fn fill_bytes(data: &mut [u8]) {
-               for i in 0..data.len() {
-                       data[i] = 0x42;
+               let rng = unsafe { RNG_ITER += 1; RNG_ITER -1 };
+               for i in 0..data.len() / 8 {
+                       data[i*8..(i+1)*8].copy_from_slice(&byte_utils::be64_to_array(rng));
                }
+               let rem = data.len() % 8;
+               let off = data.len() - rem;
+               data[off..].copy_from_slice(&byte_utils::be64_to_array(rng)[0..rem]);
        }
 
-       pub fn rand_uint256() -> Uint256 {
-               Uint256([0xdeadbeef, 0x1badcafe, 0xbadbeef, 0xdeadcafe])
+       pub fn rand_u832() -> [u8; 32] {
+               let rng = unsafe { RNG_ITER += 1; RNG_ITER - 1 };
+               let mut res = [0; 32];
+               let data = byte_utils::le64_to_array(rng);
+               res[8*0..8*1].copy_from_slice(&data);
+               res[8*1..8*2].copy_from_slice(&data);
+               res[8*2..8*3].copy_from_slice(&data);
+               res[8*3..8*4].copy_from_slice(&data);
+               res
        }
 
        pub fn rand_f32() -> f32 {
-               0.42
+               let rng = unsafe { RNG_ITER += 1; RNG_ITER - 1 };
+               f64::from_bits(rng) as f32
+       }
+
+       pub fn reset_rng_state() {
+               unsafe { RNG_ITER = 0; }
        }
 }
 #[cfg(feature = "fuzztarget")]