diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..bfed16b --- /dev/null +++ b/src/main.rs @@ -0,0 +1,80 @@ +mod iter; +mod load_file; +mod demo_hash; + +use num::BigInt; +use num::bigint::Sign; + +fn vec_pop_cnt(v: &Vec<u8>) -> u32 +{ + let mut cnt = 0; + + for x in v + { + cnt += x.count_ones(); + } + + cnt +} + +fn pop_cnt_vec(c: u32) -> Vec<u8> +{ + let mut v = Vec::new(); + v.push(2u8.pow(c % 8) - 1); + for _ in 0..(c / 8) + { + v.push(0xff); + } + + v +} + +fn main() +{ + /* "Compression" setup */ + let raw_file = load_file::load_file_vec(&"data.bin".to_owned()).unwrap(); + let size = raw_file.len(); + let popcnt = vec_pop_cnt(&raw_file); + let bi_file = BigInt::from_bytes_be(Sign::Plus, &raw_file); + let solution_hash = demo_hash::hash_bigint(size, &bi_file); + + println!("Length: {}", size); + print!("SHA512: "); + demo_hash::show_hash(&solution_hash); + println!("popcnt: {}", popcnt); + + /* + // , , + for _ in 0..1000000 + { + bi = iter::next(&bi); + } + + println!("{:x}", bi); + panic!("stopping after benchmark"); + */ + + //panic!("Performing compress only"); + + /* "Decompression" loop */ + let raw = pop_cnt_vec(popcnt); + let mut bi = BigInt::from_bytes_be(Sign::Plus, &raw); + + loop + { + let iteration_hash = demo_hash::hash_bigint(size, &bi); + //println!("{:b}", bi); + //println!(); + + if iteration_hash == solution_hash + { + demo_hash::show_hash(&iteration_hash); + break; + } + + bi = iter::next(&bi); + } + + println!("Found hash (data follows)!!!"); + println!("{:x}", bi); +} |