1
0
Fork 0

read from files or stdin

This commit is contained in:
Ishan Jain 2022-04-04 01:04:17 +05:30
parent 554e87bea0
commit e8f8d95288
1 changed files with 45 additions and 8 deletions

View File

@ -1,4 +1,7 @@
use std::io::{self, Read}; use std::{
fs::File,
io::{self, Read},
};
const ROUND_CONSTANT: [u32; 64] = [ const ROUND_CONSTANT: [u32; 64] = [
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
@ -16,29 +19,63 @@ const IV: [u32; 8] = [
]; ];
fn main() -> Result<(), std::io::Error> { fn main() -> Result<(), std::io::Error> {
let stdin = io::stdin(); let files: Vec<String> = std::env::args().skip(1).collect();
let mut stdin = stdin.lock();
if files.is_empty() {
let stdin = io::stdin();
let mut stdin = stdin.lock();
let hash = compute(&mut stdin)?;
print(hash);
} else {
for file in files {
let mut f = match File::open(file.clone()) {
Ok(v) => v,
Err(e) => {
println!("error in opening file: {}", e);
continue;
}
};
let hash = match compute(&mut f) {
Ok(hash) => hash,
Err(e) => {
println!("error in computing hash of {}: {}", file, e);
continue;
}
};
print!("{}: ", file);
print(hash);
}
}
Ok(())
}
fn compute<R: Read>(r: &mut R) -> Result<[u32; 8], std::io::Error> {
let mut s256 = Sha256::new(); let mut s256 = Sha256::new();
loop { loop {
let read = s256.update(&mut stdin)?; let read = s256.update(r)?;
if read != 64 { if read != 64 {
break; break;
} }
s256.buffer.fill(0); s256.buffer.fill(0);
} }
// Compute hash Ok(s256.sum())
for c in s256.sum() { }
fn print(hash: [u32; 8]) {
for c in hash {
for b in c.to_be_bytes() { for b in c.to_be_bytes() {
print!("{:02x?}", b); print!("{:02x?}", b);
} }
// print!(" ") // print!(" ")
} }
println!();
Ok(()) println!();
} }
struct Sha256 { struct Sha256 {