diff --git a/Makefile b/Makefile index 905734d..e332bee 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ VERSION:= v0.2.0 +FEATURES:= --features hash all: clean deps sign trust @@ -14,7 +15,7 @@ trust: ln -sf generator-$(VERSION) generator generator: - cd generator-native && cargo build --release + cd generator-native && cargo build --release $(FEATURES) ln -sf generator-native/target/release/generator-native generator cp -f `readlink generator` ./generator-$(VERSION) diff --git a/generator-native/src/arg.rs b/generator-native/src/arg.rs index 2ebcbb8..d0b92d3 100644 --- a/generator-native/src/arg.rs +++ b/generator-native/src/arg.rs @@ -48,6 +48,9 @@ pub fn parse() -> Result } i += 1; }, + "-u" if look => { + opt |= Opt::NoHash; + }, "-" if look => look=false, other => { files.push(other.to_owned()); diff --git a/generator-native/src/main.rs b/generator-native/src/main.rs index a31a35f..96af170 100644 --- a/generator-native/src/main.rs +++ b/generator-native/src/main.rs @@ -47,7 +47,7 @@ fn usage() -> ! { { let prog = &arg::program_name(); version(true); - println!("Usage: {} [-s] [-e ] [-o ] [-] ", prog); + println!("Usage: {} [-s] [-e ] [-o ] [-u] [-] ", prog); println!("Usage: {} -h", prog); println!("Usage: {} -v|-V", prog); println!(); @@ -58,6 +58,10 @@ fn usage() -> ! { println!(" -s\t\tSilent mode."); println!(" -e \tScript to run after extraction."); println!(" -o \tOutput filename."); + #[cfg(feature = "hash")] + println!(" -u\t\tUnchecked mode. Do not compute hashes of inputs."); + #[cfg(not(feature = "hash"))] + println!(" -u\t\tUnchecked mode. (default as generator is not compiled with `hash` feature)."); } std::process::exit(1) } @@ -67,7 +71,11 @@ type Sha256Hash = [u8; 32]; #[cfg(not(feature = "hash"))] type Sha256Hash = (); -fn write_file(from: From, to: &mut To) -> io::Result<(Sha256Hash, usize)> +const WF_BUFFER_SIZE: usize = 1024; +const WF_GROUP_SIZE: usize = 16; + +#[allow(unused_variables)] +fn write_file(from: From, to: &mut To, hash: bool) -> io::Result<(Sha256Hash, usize)> where From: Read, To: Write + ?Sized { @@ -78,25 +86,32 @@ where From: Read, let mut hash_output = [0u8; 32]; let mut count =0; let mut digest = Sha256::new(); - for buf in from.into_iter(8) - .map(|byte| (digest.input(&[byte]), format!("0x{:02x},", byte)).1) - .group_at(8) + let lambda: Box String> = if hash { + Box::new(|byte| (digest.input(&[byte]), format!("0x{:02x},", byte)).1) + } else { + Box::new(|byte| format!("0x{:02x},", byte)) + }; + for buf in from.into_iter(WF_BUFFER_SIZE) + .map(lambda) + .group_at(WF_GROUP_SIZE) .map(|bytes| (count += bytes.len(), bytes).1) .map(|strs| format!("\t{}", strs.join(" "))) { writeln!(to, "{}", buf)?; } - copy_slice(&mut hash_output[..], &digest.result()[..]); - + if hash { + copy_slice(&mut hash_output[..], &digest.result()[..]); + } + Ok((hash_output, count)) } #[cfg(not(feature = "hash"))] { let mut count =0; - for buf in from.into_iter(8) + for buf in from.into_iter(WF_BUFFER_SIZE) .map(|byte| format!("0x{:02x},", byte)) - .group_at(8) + .group_at(WF_GROUP_SIZE) .map(|bytes| (count += bytes.len(), bytes).1) .map(|strs| format!("\t{}", strs.join(" "))) { @@ -152,6 +167,7 @@ fn main() -> Result<(), Box> _ => None }); let silent = options.has_tag(&Opt::Silent); + let no_hash = options.has_tag(&Opt::NoHash); println!("Writing to {}...", output); let mut fp = OpenOptions::new() @@ -187,7 +203,7 @@ fn main() -> Result<(), Box> .read(true) .open(file)?; - sizes.push(match write_file(file, &mut fp) { + sizes.push(match write_file(file, &mut fp, !no_hash) { Ok((hash, size)) => { hashes.push(hash); println!(" OK"); @@ -211,6 +227,7 @@ fn main() -> Result<(), Box> writeln!(fp, "\n}};")?; #[cfg(feature="hash")] + if !no_hash { println!("Adding hashes..."); writeln!(fp, "#define DATA_HASHED")?; @@ -237,7 +254,7 @@ fn main() -> Result<(), Box> } }; - match write!(fp, "\t\"{}\",", translate::c_escape(file)) { + match writeln!(fp, "\t\"{}\",", translate::c_escape(file)) { Err(error) => { println!(" FAILED: write: {}", error); @@ -247,7 +264,7 @@ fn main() -> Result<(), Box> }; println!(" OK"); } - writeln!(fp, "\n}};")?; + writeln!(fp, "}};")?; }, arg::OperationMode::Help => { usage(); diff --git a/generator-native/src/opt/mod.rs b/generator-native/src/opt/mod.rs index c31c799..0534895 100644 --- a/generator-native/src/opt/mod.rs +++ b/generator-native/src/opt/mod.rs @@ -9,6 +9,7 @@ pub enum Opt Silent, Execute(String), Output(String), + NoHash, } #[derive(Debug, Clone, PartialEq, Eq)] diff --git a/generator-v0.2.0 b/generator-v0.2.0 index 5a548f0..4bb4bcc 100755 Binary files a/generator-v0.2.0 and b/generator-v0.2.0 differ diff --git a/generator-v0.2.0.gpg b/generator-v0.2.0.gpg index 7c5e454..8071253 100644 Binary files a/generator-v0.2.0.gpg and b/generator-v0.2.0.gpg differ diff --git a/generator-v0.2.0.sha256 b/generator-v0.2.0.sha256 index 14607d2..d90c8e4 100644 --- a/generator-v0.2.0.sha256 +++ b/generator-v0.2.0.sha256 @@ -1 +1 @@ -5f91ab8d00829daa41c25de2a911333ef2558088fdabece4ccf6a3d83b6a0405 +eda8606ee47824d0d887f2a946412549416a1e0cc65005e06a25cb8177a11a88