From 99588da34c08cd1243381378a6337e052f5d1c23 Mon Sep 17 00:00:00 2001 From: Vivek Revankar Date: Fri, 8 Aug 2025 22:20:01 -0700 Subject: [PATCH 1/7] add adapter for digest crate --- embedded-io-adapters/Cargo.toml | 2 + embedded-io-adapters/src/digest.rs | 98 ++++++++++++++++++++++++++++++ embedded-io-adapters/src/lib.rs | 3 + 3 files changed, 103 insertions(+) create mode 100644 embedded-io-adapters/src/digest.rs diff --git a/embedded-io-adapters/Cargo.toml b/embedded-io-adapters/Cargo.toml index ea88ee65..90dbdd9d 100644 --- a/embedded-io-adapters/Cargo.toml +++ b/embedded-io-adapters/Cargo.toml @@ -13,11 +13,13 @@ categories = [ ] [features] +default = ["digest"] std = ["embedded-io/std"] tokio-1 = ["std", "dep:tokio", "dep:embedded-io-async", "embedded-io-async?/std"] futures-03 = ["std", "dep:futures", "dep:embedded-io-async", "embedded-io-async?/std"] [dependencies] +digest = { version = "0.10.7", default-features = false, optional = true } embedded-io = { version = "0.6", path = "../embedded-io" } embedded-io-async = { version = "0.6.1", path = "../embedded-io-async", optional = true } diff --git a/embedded-io-adapters/src/digest.rs b/embedded-io-adapters/src/digest.rs new file mode 100644 index 00000000..5645c963 --- /dev/null +++ b/embedded-io-adapters/src/digest.rs @@ -0,0 +1,98 @@ +//! Adapters to/from `digest::Digest` traits e.g. sha2::Sha256 + +use core::convert::Infallible; +use digest::Update; +use embedded_io::{ErrorType, Write}; + +/// Adapter from `digest::Digest` traits. +#[derive(Clone)] +pub struct FromDigest { + inner: T, +} + +impl FromDigest { + /// Create a new adapter. + pub fn new(inner: T) -> Self { + Self { inner } + } + + /// Consume the adapter, returning the inner object. + pub fn into_inner(self) -> T { + self.inner + } +} + +impl FromDigest { + /// Borrow the inner object. + pub fn inner(&self) -> &T { + &self.inner + } + + /// Mutably borrow the inner object. + pub fn inner_mut(&mut self) -> &mut T { + &mut self.inner + } +} + +impl ErrorType for FromDigest { + type Error = Infallible; +} + +impl Write for FromDigest { + fn write(&mut self, data: &[u8]) -> Result::Error> { + T::update(&mut self.inner, data); + Ok(data.len()) + } + fn flush(&mut self) -> Result<(), ::Error> { Ok(()) } +} + +impl Default for FromDigest { + fn default() -> Self { + Self { inner: T::default() } + } +} + +/// Adapter to `digest::Digest` traits. +#[derive(Clone)] +pub struct ToDigest { + inner: T, +} + +impl ToDigest { + /// Create a new adapter. + pub fn new(inner: T) -> Self { + Self { inner } + } + + /// Consume the adapter, returning the inner object. + pub fn into_inner(self) -> T { + self.inner + } +} + +impl ToDigest { + /// Borrow the inner object. + pub fn inner(&self) -> &T { + &self.inner + } + + /// Mutably borrow the inner object. + pub fn inner_mut(&mut self) -> &mut T { + &mut self.inner + } +} + +impl Default for ToDigest { + fn default() -> Self { + Self { inner: T::default() } + } +} + +impl + Write> Update for ToDigest { + fn update(&mut self, data: &[u8]) { + match self.inner.write_all(data) { + Ok(()) => {}, + Err(_) => unreachable!(), + } + } +} \ No newline at end of file diff --git a/embedded-io-adapters/src/lib.rs b/embedded-io-adapters/src/lib.rs index c5e6710a..abdf7e71 100644 --- a/embedded-io-adapters/src/lib.rs +++ b/embedded-io-adapters/src/lib.rs @@ -16,3 +16,6 @@ pub mod futures_03; #[cfg(feature = "tokio-1")] #[cfg_attr(docsrs, doc(cfg(feature = "tokio-1")))] pub mod tokio_1; + +#[cfg(feature = "digest")] +pub mod digest; \ No newline at end of file From b0a99a15a1840cf9db12884dc0cbe26dec17da98 Mon Sep 17 00:00:00 2001 From: Vivek Revankar Date: Fri, 8 Aug 2025 22:54:52 -0700 Subject: [PATCH 2/7] cargo fmt --- embedded-io-adapters/Cargo.toml | 2 ++ embedded-io-adapters/src/digest.rs | 34 ++++++++++++++++++------------ embedded-io-adapters/src/lib.rs | 2 +- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/embedded-io-adapters/Cargo.toml b/embedded-io-adapters/Cargo.toml index 90dbdd9d..936418c7 100644 --- a/embedded-io-adapters/Cargo.toml +++ b/embedded-io-adapters/Cargo.toml @@ -24,6 +24,8 @@ embedded-io = { version = "0.6", path = "../embedded-io" } embedded-io-async = { version = "0.6.1", path = "../embedded-io-async", optional = true } futures = { version = "0.3.21", features = ["std"], default-features = false, optional = true } +hex = "0.4.3" +sha2 = "0.10.9" tokio = { version = "1", features = ["io-util"], default-features = false, optional = true } [package.metadata.docs.rs] diff --git a/embedded-io-adapters/src/digest.rs b/embedded-io-adapters/src/digest.rs index 5645c963..eb5c74de 100644 --- a/embedded-io-adapters/src/digest.rs +++ b/embedded-io-adapters/src/digest.rs @@ -10,7 +10,7 @@ pub struct FromDigest { inner: T, } -impl FromDigest { +impl FromDigest { /// Create a new adapter. pub fn new(inner: T) -> Self { Self { inner } @@ -22,7 +22,7 @@ impl FromDigest { } } -impl FromDigest { +impl FromDigest { /// Borrow the inner object. pub fn inner(&self) -> &T { &self.inner @@ -34,21 +34,25 @@ impl FromDigest { } } -impl ErrorType for FromDigest { +impl ErrorType for FromDigest { type Error = Infallible; } -impl Write for FromDigest { +impl Write for FromDigest { fn write(&mut self, data: &[u8]) -> Result::Error> { T::update(&mut self.inner, data); Ok(data.len()) } - fn flush(&mut self) -> Result<(), ::Error> { Ok(()) } + fn flush(&mut self) -> Result<(), ::Error> { + Ok(()) + } } -impl Default for FromDigest { +impl Default for FromDigest { fn default() -> Self { - Self { inner: T::default() } + Self { + inner: T::default(), + } } } @@ -58,7 +62,7 @@ pub struct ToDigest { inner: T, } -impl ToDigest { +impl ToDigest { /// Create a new adapter. pub fn new(inner: T) -> Self { Self { inner } @@ -70,7 +74,7 @@ impl ToDigest { } } -impl ToDigest { +impl ToDigest { /// Borrow the inner object. pub fn inner(&self) -> &T { &self.inner @@ -82,17 +86,19 @@ impl ToDigest { } } -impl Default for ToDigest { +impl Default for ToDigest { fn default() -> Self { - Self { inner: T::default() } + Self { + inner: T::default(), + } } } -impl + Write> Update for ToDigest { +impl + Write> Update for ToDigest { fn update(&mut self, data: &[u8]) { match self.inner.write_all(data) { - Ok(()) => {}, + Ok(()) => {} Err(_) => unreachable!(), } } -} \ No newline at end of file +} diff --git a/embedded-io-adapters/src/lib.rs b/embedded-io-adapters/src/lib.rs index abdf7e71..c494b298 100644 --- a/embedded-io-adapters/src/lib.rs +++ b/embedded-io-adapters/src/lib.rs @@ -18,4 +18,4 @@ pub mod futures_03; pub mod tokio_1; #[cfg(feature = "digest")] -pub mod digest; \ No newline at end of file +pub mod digest; From 3aa98f88337497eaed292219271edcc62ec19fec Mon Sep 17 00:00:00 2001 From: Vivek Revankar Date: Fri, 8 Aug 2025 22:57:11 -0700 Subject: [PATCH 3/7] don't forget to flush --- embedded-io-adapters/src/digest.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/embedded-io-adapters/src/digest.rs b/embedded-io-adapters/src/digest.rs index eb5c74de..ebc6c2aa 100644 --- a/embedded-io-adapters/src/digest.rs +++ b/embedded-io-adapters/src/digest.rs @@ -100,5 +100,9 @@ impl + Write> Update for ToDigest { Ok(()) => {} Err(_) => unreachable!(), } + match self.inner.flush() { + Ok(()) => {} + Err(_) => unreachable!(), + } } } From a8c19c1a6625f2cb33df5aa458ff89cd6cfbc246 Mon Sep 17 00:00:00 2001 From: Vivek Revankar Date: Fri, 8 Aug 2025 22:59:05 -0700 Subject: [PATCH 4/7] oops --- embedded-io-adapters/Cargo.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/embedded-io-adapters/Cargo.toml b/embedded-io-adapters/Cargo.toml index 936418c7..90dbdd9d 100644 --- a/embedded-io-adapters/Cargo.toml +++ b/embedded-io-adapters/Cargo.toml @@ -24,8 +24,6 @@ embedded-io = { version = "0.6", path = "../embedded-io" } embedded-io-async = { version = "0.6.1", path = "../embedded-io-async", optional = true } futures = { version = "0.3.21", features = ["std"], default-features = false, optional = true } -hex = "0.4.3" -sha2 = "0.10.9" tokio = { version = "1", features = ["io-util"], default-features = false, optional = true } [package.metadata.docs.rs] From 89381198b0f040b08562b712e036648efa7a55a4 Mon Sep 17 00:00:00 2001 From: Vivek Revankar Date: Fri, 8 Aug 2025 23:01:34 -0700 Subject: [PATCH 5/7] nit --- embedded-io-adapters/src/digest.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded-io-adapters/src/digest.rs b/embedded-io-adapters/src/digest.rs index ebc6c2aa..f0b07a56 100644 --- a/embedded-io-adapters/src/digest.rs +++ b/embedded-io-adapters/src/digest.rs @@ -48,7 +48,7 @@ impl Write for FromDigest { } } -impl Default for FromDigest { +impl Default for FromDigest { fn default() -> Self { Self { inner: T::default(), @@ -86,7 +86,7 @@ impl ToDigest { } } -impl Default for ToDigest { +impl Default for ToDigest { fn default() -> Self { Self { inner: T::default(), From f64c5d8b293f6b9c528eb5327889c6e81f215610 Mon Sep 17 00:00:00 2001 From: Vivek Revankar Date: Fri, 8 Aug 2025 23:04:24 -0700 Subject: [PATCH 6/7] nm --- embedded-io-adapters/src/digest.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/embedded-io-adapters/src/digest.rs b/embedded-io-adapters/src/digest.rs index f0b07a56..ebc6c2aa 100644 --- a/embedded-io-adapters/src/digest.rs +++ b/embedded-io-adapters/src/digest.rs @@ -48,7 +48,7 @@ impl Write for FromDigest { } } -impl Default for FromDigest { +impl Default for FromDigest { fn default() -> Self { Self { inner: T::default(), @@ -86,7 +86,7 @@ impl ToDigest { } } -impl Default for ToDigest { +impl Default for ToDigest { fn default() -> Self { Self { inner: T::default(), From 74959ae62c934c1513741d4a6f926159d62b5e06 Mon Sep 17 00:00:00 2001 From: Vivek Revankar Date: Fri, 8 Aug 2025 23:10:07 -0700 Subject: [PATCH 7/7] add documentation macro --- embedded-io-adapters/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/embedded-io-adapters/src/lib.rs b/embedded-io-adapters/src/lib.rs index c494b298..6ee37611 100644 --- a/embedded-io-adapters/src/lib.rs +++ b/embedded-io-adapters/src/lib.rs @@ -18,4 +18,5 @@ pub mod futures_03; pub mod tokio_1; #[cfg(feature = "digest")] +#[cfg_attr(docsrs, doc(cfg(feature = "digest")))] pub mod digest;