commit ca9dd852c6c915b4c90c9022e8b5127f56b05e2d
parent e0aa923d68b16858d23263f3a5c3ae20ddfd2167
Author: lash <dev@holbrook.no>
Date: Wed, 28 Sep 2022 12:41:43 +0000
Add sha256 support for apply subcmd
Diffstat:
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/src/digest.rs b/src/digest.rs
@@ -16,6 +16,7 @@ use log::error;
#[derive(Copy, Clone)]
pub enum DigestType {
Sha512,
+ Sha256,
#[cfg(feature="digest_md5")]
MD5,
}
@@ -30,8 +31,11 @@ impl FromStr for DigestType {
"sha512" => {
return Ok(DigestType::Sha512);
},
+ "sha256" => {
+ return Ok(DigestType::Sha256);
+ },
_ => {
- return Err(ParseError::new("Unknown digest string"));
+ return Err(ParseError::new("unknown digest string"));
},
};
}
diff --git a/src/meta.rs b/src/meta.rs
@@ -7,6 +7,7 @@ use mime::{
};
use sha2::{
Sha512,
+ Sha256,
Digest,
};
use std::fs::{
@@ -76,6 +77,10 @@ pub fn digests_from_path(filepath: &path::Path, digest_types: &Vec<digest::Diges
let digest = digest_sha512_from_path(filepath);
r.push(digest);
},
+ digest::DigestType::Sha256 => {
+ let digest = digest_sha256_from_path(filepath);
+ r.push(digest);
+ },
#[cfg(feature = "md5")]
digest::DigestType::MD5 => {
let digest = digest_md5_from_path(filepath);
@@ -128,6 +133,28 @@ pub fn digest_sha512_from_path(filepath: &path::Path) -> digest::RecordDigest {
digest::RecordDigest::Sha512(r)
}
+/// Generates the native `sha256` digest of a file.
+///
+/// # Arguments
+///
+/// * `filepath` - Absolute path to file to calculate digest for.
+pub fn digest_sha256_from_path(filepath: &path::Path) -> digest::RecordDigest {
+ let mut h = Sha256::new();
+ let st = metadata(filepath).unwrap();
+ let bs: u64 = st.st_blksize();
+ let sz: u64 = st.st_size();
+ let mut b: Vec<u8> = vec!(0; bs as usize);
+ let mut f = File::open(filepath).unwrap();
+ let mut i: usize = 0;
+ while i < sz as usize {
+ let c = f.read(&mut b).unwrap();
+ h.update(&b[..c]);
+ i += c;
+ }
+ let r = h.finalize().to_vec();
+ digest::RecordDigest::Sha256(r)
+}
+
impl MetaData {
/// Create a new MetaData instance with basic data.
///