add sha256,sm3
This commit is contained in:
90
src/main.rs
90
src/main.rs
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user