chiark / gitweb /
digest: provide DigestRead etc.
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 1 May 2021 16:35:01 +0000 (17:35 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 1 May 2021 16:35:01 +0000 (17:35 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Cargo.lock
Cargo.toml
src/imports.rs
src/prelude.rs
src/utils.rs

index 1fab225d8ea72de7ef9ebb8b78ec723bc56bd472..690f27cba666bea5366db5c0a8cfb5f73a938a1a 100644 (file)
@@ -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",
index cb9eca9430cf3608037f89a0375018e2ded0ee75..24c608257c780ca8cc97edf938c74b52640dacc8 100644 (file)
@@ -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"
index ec6e02b7cc0dde6ef7832d20a2677a333c0ab009..00a01274620b01c22156ec73754b5e6054c4a752 100644 (file)
@@ -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;
index 2ddd81969b30884e0123aff9c4f7713ccda036b2..a423c066c0f18726a5be518f51186f04fa42b2af 100644 (file)
@@ -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};
index c72c5c55a91ccfa644b235abc60d2a21afb2aff2..20d079ab23936bf9baf26af8fbe211831b7e9287 100644 (file)
@@ -532,3 +532,39 @@ entry_define_insert_remove!{
   slotmap::sparse_secondary::Entry,
   key
 }
+
+#[derive(Debug,Copy,Clone)]
+pub struct DigestRead<D: Digest, R: Read> {
+  d: D,
+  r: R,
+}
+
+impl<D: Digest, R: Read> DigestRead<D, R> {
+  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<D> {
+    self.d.finalize()
+  }
+}
+
+impl<D: Digest, R: Read> Read for DigestRead<D, R> {
+  #[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::<Sha512Trunc256,_>::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 );
+}