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.
     ///