add sha256,sm3

This commit is contained in:
2019-11-22 00:02:08 +08:00
parent eff3dd73fb
commit f400eb35ee
3 changed files with 200 additions and 2 deletions

View File

@@ -1,3 +1,91 @@
use rust_util::{
XResult,
new_box_error,
new_box_ioerror,
util_msg::{
print_message,
MessageType,
},
util_io::*,
};
use std::{
env,
fs::{self, File},
io::{Read, ErrorKind},
path::Path,
process::Command,
time::SystemTime,
};
use crypto::{
digest::Digest,
md5::Md5,
sha1::Sha1,
sha2::{Sha256, Sha512},
};
use std::ops::Deref;
use libsm::sm3::hash::Sm3Hash;
fn main() {
println!("Hello, world!");
let h = calc_file_digest(&mut Sha256::new(), "SHA256", "LICENSE");
match h {
Err(_) => {},
Ok(d) => println!("SHA256: {}", d),
}
let sm3 = read_file_full("LICENSE");
match sm3 {
Err(_) => {},
Ok(s) => {
let mut sm3h = Sm3Hash::new(&s);
let hh = sm3h.get_hash();
println!("SM3: {}", hex::encode(hh));
},
}
}
pub fn read_file_full(file_name: &str) -> XResult<Vec<u8>> {
let mut buf: [u8; DEFAULT_BUF_SIZE] = [0u8; DEFAULT_BUF_SIZE];
let mut f = File::open(file_name)?;
let file_len = match f.metadata() {
Err(_) => -1i64,
Ok(meta_data) => meta_data.len() as i64,
};
let mut ret: Vec<u8> = Vec::new();
let start = SystemTime::now();
let mut written = 0i64;
loop {
let len = match f.read(&mut buf) {
Ok(0) => { println!(); return Ok(ret); },
Ok(len) => len,
Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
Err(e) => return Err(Box::new(e)),
};
ret.append(&mut buf[..len].to_vec());
written += len as i64;
let cost = SystemTime::now().duration_since(start.clone()).unwrap();
print_status_last_line(&format!("Calc {}", "digest_alg"), file_len, written, cost);
}
}
pub fn calc_file_digest(digest: &mut dyn Digest, digest_alg: &str, file_name: &str) -> XResult<String> {
let mut buf: [u8; DEFAULT_BUF_SIZE] = [0u8; DEFAULT_BUF_SIZE];
let mut f = File::open(file_name)?;
let file_len = match f.metadata() {
Err(_) => -1i64,
Ok(meta_data) => meta_data.len() as i64,
};
let start = SystemTime::now();
let mut written = 0i64;
loop {
let len = match f.read(&mut buf) {
Ok(0) => { println!(); return Ok(digest.result_str()); },
Ok(len) => len,
Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
Err(e) => return Err(Box::new(e)),
};
digest.input(&buf[..len]);
written += len as i64;
let cost = SystemTime::now().duration_since(start.clone()).unwrap();
print_status_last_line(&format!("Calc {}", digest_alg), file_len, written, cost);
}
}