From aaad6fe2662e6452ac8e148d4b4b85e0192312fe Mon Sep 17 00:00:00 2001 From: trivernis Date: Thu, 12 Mar 2020 20:17:56 +0100 Subject: [PATCH] Add conversion from HashLookupTable to GenericChunk --- Cargo.lock | 16 ++++++++++++ Cargo.toml | 1 + src/lib/rainbowutils.rs | 57 ++++++++++++++++++++++++++++++++--------- 3 files changed, 62 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e26368..17e411a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,6 +93,11 @@ dependencies = [ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byte-tools" version = "0.3.1" @@ -144,6 +149,14 @@ name = "constant_time_eq" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-deque" version = "0.7.2" @@ -202,6 +215,7 @@ dependencies = [ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "cfb-mode 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "des 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -774,6 +788,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" "checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" @@ -781,6 +796,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" "checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" "checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" "checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" "checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" diff --git a/Cargo.toml b/Cargo.toml index 8e1d9bb..2b9c057 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,3 +19,4 @@ pbr = "1.0.2" spinners = "1.2.0" regex = "1.3.4" byteorder = "1.3.4" +crc = "1.8.1" \ No newline at end of file diff --git a/src/lib/rainbowutils.rs b/src/lib/rainbowutils.rs index 1c69192..a82a895 100644 --- a/src/lib/rainbowutils.rs +++ b/src/lib/rainbowutils.rs @@ -1,4 +1,5 @@ use byteorder::{BigEndian, ByteOrder}; +use crc::crc32; use std::collections::HashMap; use std::convert::{TryFrom, TryInto}; use std::fs::File; @@ -168,28 +169,50 @@ impl GenericChunk { impl From for GenericChunk { fn from(chunk: MetaChunk) -> GenericChunk { + let serialized_data = chunk.serialize(); + let crc_sum = crc32::checksum_ieee(serialized_data.as_slice()); + GenericChunk { + length: serialized_data.len() as u32, + name: META_CHUNK_NAME.to_string(), + data: serialized_data, + crc: crc_sum, + } + } +} + +impl From for GenericChunk { + fn from(chunk: HashLookupTable) -> GenericChunk { + let serialized_data = chunk.serialize(); + let crc_sum = crc32::checksum_ieee(serialized_data.as_slice()); + GenericChunk { + length: serialized_data.len() as u32, + name: HTBL_CHUNK_NAME.to_string(), + data: serialized_data, + crc: crc_sum, + } + } +} + +impl MetaChunk { + pub fn serialize(&self) -> Vec { let mut serialized_data: Vec = Vec::new(); let mut chunk_count_raw = [0u8; 4]; - BigEndian::write_u32(&mut chunk_count_raw, chunk.chunk_count); + BigEndian::write_u32(&mut chunk_count_raw, self.chunk_count); serialized_data.append(&mut chunk_count_raw.to_vec()); let mut entries_pc_raw = [0u8; 4]; - BigEndian::write_u32(&mut entries_pc_raw, chunk.entries_per_chunk); + BigEndian::write_u32(&mut entries_pc_raw, self.entries_per_chunk); serialized_data.append(&mut entries_pc_raw.to_vec()); let mut total_entries_raw = [0u8; 4]; - BigEndian::write_u32(&mut total_entries_raw, chunk.entry_count); + BigEndian::write_u32(&mut total_entries_raw, self.entry_count); serialized_data.append(&mut total_entries_raw.to_vec()); - if let Some(method) = chunk.compression_method { - serialized_data.append(&mut method.into_bytes()); + let mut compression_method = self.compression_method.clone(); + if let Some(method) = &mut compression_method { + serialized_data.append(&mut method.clone().into_bytes()); } else { serialized_data.append(&mut vec![0, 0, 0, 0]); } - GenericChunk { - length: serialized_data.len() as u32, - name: META_CHUNK_NAME.to_string(), - data: serialized_data, - crc: 0, - } + serialized_data } } @@ -235,6 +258,16 @@ impl HashLookupTable { pub fn get_entry(&self, id: u32) -> Option<&HashEntry> { self.entries.get(&id) } + + /// Serializes the lookup table into a vector of bytes + pub fn serialize(&self) -> Vec { + let mut serialized_full: Vec = Vec::new(); + for (_, entry) in &self.entries { + serialized_full.append(entry.serialize().as_mut()) + } + + serialized_full + } } impl TryFrom for HashLookupTable { @@ -278,7 +311,7 @@ impl TryFrom for HashLookupTable { } impl HashEntry { - pub fn serialize(&mut self) -> Vec { + pub fn serialize(&self) -> Vec { let mut serialized: Vec = Vec::new(); let mut id_raw = [0u8; 4]; BigEndian::write_u32(&mut id_raw, self.id);