add BLAKE2S, BLAKE2B
This commit is contained in:
18
src/main.rs
18
src/main.rs
@@ -16,6 +16,8 @@ use crypto::{
|
|||||||
digest::Digest,
|
digest::Digest,
|
||||||
ripemd160::Ripemd160,
|
ripemd160::Ripemd160,
|
||||||
whirlpool::Whirlpool,
|
whirlpool::Whirlpool,
|
||||||
|
blake2s::Blake2s,
|
||||||
|
blake2b::Blake2b,
|
||||||
md5::Md5,
|
md5::Md5,
|
||||||
sha1::Sha1,
|
sha1::Sha1,
|
||||||
sha2::{
|
sha2::{
|
||||||
@@ -33,9 +35,7 @@ use indicatif::{
|
|||||||
ProgressStyle
|
ProgressStyle
|
||||||
};
|
};
|
||||||
use libsm::sm3::hash::Sm3Hash;
|
use libsm::sm3::hash::Sm3Hash;
|
||||||
use opt::{
|
use opt::Options;
|
||||||
Options,
|
|
||||||
};
|
|
||||||
|
|
||||||
const FILE_SIZE_1GB: u64 = 1024 * 1024 * 1024;
|
const FILE_SIZE_1GB: u64 = 1024 * 1024 * 1024;
|
||||||
const BUFF_SIZE: usize = 512 * 1024;
|
const BUFF_SIZE: usize = 512 * 1024;
|
||||||
@@ -55,7 +55,7 @@ fn main() -> XResult<()> {
|
|||||||
|
|
||||||
let the_algo = options.algorithm.to_uppercase();
|
let the_algo = options.algorithm.to_uppercase();
|
||||||
if options.file_name_list.is_empty() {
|
if options.file_name_list.is_empty() {
|
||||||
let boxed_digest = get_digest_by_algorithm(the_algo.as_str());
|
let boxed_digest = get_digest_by_algorithm(the_algo.as_str(), &options);
|
||||||
match boxed_digest {
|
match boxed_digest {
|
||||||
Some(mut digest) => {
|
Some(mut digest) => {
|
||||||
println!("{} - ({})", calc_digest_stdin(&mut *digest)?, the_algo);
|
println!("{} - ({})", calc_digest_stdin(&mut *digest)?, the_algo);
|
||||||
@@ -66,9 +66,9 @@ fn main() -> XResult<()> {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
for f in options.file_name_list {
|
for f in &options.file_name_list {
|
||||||
let the_fn = f.as_str();
|
let the_fn = f.as_str();
|
||||||
let boxed_digest = get_digest_by_algorithm(the_algo.as_str());
|
let boxed_digest = get_digest_by_algorithm(the_algo.as_str(), &options);
|
||||||
match boxed_digest {
|
match boxed_digest {
|
||||||
Some(mut digest) => {
|
Some(mut digest) => {
|
||||||
println!("{} - {} ({})", calc_file_digest(&mut *digest, the_fn)?, the_fn, the_algo);
|
println!("{} - {} ({})", calc_file_digest(&mut *digest, the_fn)?, the_fn, the_algo);
|
||||||
@@ -95,14 +95,16 @@ Supported algorithms:
|
|||||||
MD5, SHA1, SHA224, SHA256, SHA512, SHA512-224, SHA512-256,
|
MD5, SHA1, SHA224, SHA256, SHA512, SHA512-224, SHA512-256,
|
||||||
SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE-128, SHAKE-256,
|
SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE-128, SHAKE-256,
|
||||||
KECCAK-224, KECCAK-256, KECCAK-384, KECCAK-512,
|
KECCAK-224, KECCAK-256, KECCAK-384, KECCAK-512,
|
||||||
SM3, RIPEMD160, WHIRLPOOL
|
SM3, RIPEMD160, WHIRLPOOL, BLAKE2S, BLAKE2B
|
||||||
"#, VERSION, &GIT_HASH[0..7]);
|
"#, VERSION, &GIT_HASH[0..7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_digest_by_algorithm(algo: &str) -> Option<Box<dyn Digest>> {
|
fn get_digest_by_algorithm(algo: &str, options: &Options) -> Option<Box<dyn Digest>> {
|
||||||
match algo {
|
match algo {
|
||||||
"RIPEMD160" => Some(Box::new(Ripemd160::new())),
|
"RIPEMD160" => Some(Box::new(Ripemd160::new())),
|
||||||
"WHIRLPOOL" => Some(Box::new(Whirlpool::new())),
|
"WHIRLPOOL" => Some(Box::new(Whirlpool::new())),
|
||||||
|
"BLAKE2S" => Some(Box::new(Blake2s::new(if options.blake_len == 0_usize { 32 } else { options.blake_len }))),
|
||||||
|
"BLAKE2B" => Some(Box::new(Blake2b::new(if options.blake_len == 0_usize { 64 } else { options.blake_len }))),
|
||||||
"MD5" => Some(Box::new(Md5::new())),
|
"MD5" => Some(Box::new(Md5::new())),
|
||||||
"SHA1" | "SHA-1" => Some(Box::new(Sha1::new())),
|
"SHA1" | "SHA-1" => Some(Box::new(Sha1::new())),
|
||||||
"SHA224" | "SHA-224" => Some(Box::new(Sha224::new())),
|
"SHA224" | "SHA-224" => Some(Box::new(Sha224::new())),
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ pub struct Options {
|
|||||||
pub version: bool,
|
pub version: bool,
|
||||||
pub algorithm: String,
|
pub algorithm: String,
|
||||||
pub file_name_list: Vec<String>,
|
pub file_name_list: Vec<String>,
|
||||||
|
pub blake_len: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Options {
|
impl Options {
|
||||||
@@ -13,6 +14,7 @@ impl Options {
|
|||||||
version: false,
|
version: false,
|
||||||
algorithm: "SHA256".to_string(),
|
algorithm: "SHA256".to_string(),
|
||||||
file_name_list: Vec::new(),
|
file_name_list: Vec::new(),
|
||||||
|
blake_len: 0_usize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,6 +23,7 @@ impl Options {
|
|||||||
let mut ap = ArgumentParser::new();
|
let mut ap = ArgumentParser::new();
|
||||||
ap.set_description("digest - command line digest tool.");
|
ap.set_description("digest - command line digest tool.");
|
||||||
ap.refer(&mut self.algorithm).add_option(&["-a", "--algorithm"], Store, "Algorithm, e.g. SHA256, SM3");
|
ap.refer(&mut self.algorithm).add_option(&["-a", "--algorithm"], Store, "Algorithm, e.g. SHA256, SM3");
|
||||||
|
ap.refer(&mut self.blake_len).add_option(&["-l", "--blake-len"], Store, "Blake2s/b length, 1~32/64");
|
||||||
ap.refer(&mut self.version).add_option(&["-v", "--version"], StoreTrue, "Print version");
|
ap.refer(&mut self.version).add_option(&["-v", "--version"], StoreTrue, "Print version");
|
||||||
ap.refer(&mut self.file_name_list).add_argument("File names", List, "File names to be digested");
|
ap.refer(&mut self.file_name_list).add_argument("File names", List, "File names to be digested");
|
||||||
ap.parse_args_or_exit();
|
ap.parse_args_or_exit();
|
||||||
|
|||||||
Reference in New Issue
Block a user