From 391e3ac3c62cb963a75d5a9127c926201efb00b8 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 1 May 2021 17:35:01 +0100 Subject: [PATCH] digest: provide DigestRead etc. Signed-off-by: Ian Jackson --- Cargo.lock | 2 ++ Cargo.toml | 2 ++ src/imports.rs | 2 ++ src/prelude.rs | 2 ++ src/utils.rs | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 44 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 1fab225d..690f27cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2195,6 +2195,7 @@ dependencies = [ "chrono", "chrono-tz", "delegate", + "digest 0.9.0", "downcast-rs", "either", "enum-map", @@ -2227,6 +2228,7 @@ dependencies = [ "rmp-serde", "serde", "serde_with", + "sha2", "slotmap-fork-otter", "structopt", "strum", diff --git a/Cargo.toml b/Cargo.toml index cb9eca94..24c60825 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ cast_trait_object="0.1" chrono="0.4" chrono-tz="0.5" delegate="0.5" +digest="0.9" downcast-rs="1" either="1" enum_dispatch="0.3.5" @@ -65,6 +66,7 @@ rmp="0.8" rmp-serde="0.15" serde_with="1" structopt="0.3" +sha2="0.9" tempfile="3" tera="0.11" toml="0.5" diff --git a/src/imports.rs b/src/imports.rs index ec6e02b7..00a01274 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -11,6 +11,7 @@ pub use cast_trait_object; pub use chrono; pub use chrono_tz; pub use delegate; +pub use digest; pub use either; pub use env_logger; pub use failure; @@ -30,6 +31,7 @@ pub use parking_lot; pub use pwd; pub use regex; pub use rmp_serde; +pub use sha2; pub use slotmap; pub use toml; pub use uds; diff --git a/src/prelude.rs b/src/prelude.rs index 2ddd8196..a423c066 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -57,6 +57,7 @@ pub use byteorder::{BigEndian, LittleEndian, ReadBytesExt, WriteBytesExt}; pub use cast_trait_object::{dyn_upcast, DynCastExt}; pub use delegate::delegate; pub use derive_more::*; +pub use digest::Digest; pub use downcast_rs::{impl_downcast, Downcast}; pub use either::{Either, Left, Right}; pub use enum_dispatch::enum_dispatch; @@ -91,6 +92,7 @@ pub use serde::{de::DeserializeOwned, Deserialize, Serialize}; pub use serde::{Deserializer, Serializer}; pub use serde_with::DeserializeFromStr; pub use serde_with::SerializeDisplay; +pub use sha2::{Sha512, Sha512Trunc256}; pub use slotmap::{dense::DenseSlotMap, SparseSecondaryMap, Key as _}; pub use strum::{EnumString, EnumIter, EnumProperty}; pub use strum::{IntoEnumIterator, IntoStaticStr}; diff --git a/src/utils.rs b/src/utils.rs index c72c5c55..20d079ab 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -532,3 +532,39 @@ entry_define_insert_remove!{ slotmap::sparse_secondary::Entry, key } + +#[derive(Debug,Copy,Clone)] +pub struct DigestRead { + d: D, + r: R, +} + +impl DigestRead { + pub fn new(r: R) -> Self { DigestRead { r, d: D::new() } } + pub fn into_inner(self) -> (D, R) { (self.d, self.r) } + pub fn finish(self) -> digest::Output { + self.d.finalize() + } +} + +impl Read for DigestRead { + #[throws(io::Error)] + fn read(&mut self, buf: &mut [u8]) -> usize { + let count = self.r.read(buf)?; + self.d.update(&buf[0..count]); + count + } +} + +#[test] +fn test_digest_read() { + let ibuffer = b"abc"; + let inner = &ibuffer[..]; + let mut dr = DigestRead::::new(inner); + let mut obuffer = [0;4]; + assert_eq!( dr.read(&mut obuffer).unwrap(), 3 ); + assert_eq!( &obuffer, b"abc\0" ); + let got = dr.finish(); + let exp = Sha512Trunc256::digest(&ibuffer[..]); + assert_eq!( got, exp ); +} -- 2.30.2