kitab

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | LICENSE

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:
Msrc/digest.rs | 6+++++-
Msrc/meta.rs | 27+++++++++++++++++++++++++++
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. ///