use sha1::Sha1; use sha2::{Digest, Sha256, Sha384, Sha512}; pub fn sha256(input: &str) -> Vec { sha256_bytes(input.as_bytes()) } pub fn sha1_bytes(input: &[u8]) -> Vec { let mut digest = Sha1::default(); digest.update(input); digest.finalize().to_vec() } pub fn sha256_bytes(input: &[u8]) -> Vec { digest_bytes::(input) } pub fn sha384_bytes(input: &[u8]) -> Vec { digest_bytes::(input) } pub fn sha512_bytes(input: &[u8]) -> Vec { digest_bytes::(input) } pub fn digest_bytes(input: &[u8]) -> Vec where D: Digest + Default { let mut digest: D = Default::default(); Digest::update(&mut digest, input); digest.finalize().to_vec() } macro_rules! define_copy_array { ($fn_name: ident, $len: tt) => ( pub fn $fn_name(in_arr: &[u8]) -> rust_util::XResult<[u8; $len]> { if in_arr.len() != $len { return simple_error!("Array length is not: {}, but is: {}", $len, in_arr.len()); } let mut out_arr = [0_u8; $len]; for i in 0..$len { out_arr[i] = in_arr[i]; } Ok(out_arr) } ) } define_copy_array!(copy_sha256, 0x20); define_copy_array!(copy_sha384, 0x30); define_copy_array!(copy_sha512, 0x40); define_copy_array!(copy_rsa2048, 0x100);