From 86455d547f86ebb1e20844ba938f0063e2b5bbbf Mon Sep 17 00:00:00 2001 From: Nathaniel McCallum Date: Wed, 20 Apr 2022 12:11:47 -0400 Subject: [PATCH] feat: make `Zeroizing` transparent for cheap conversions (#761) Sometimes libraries want to be generic across types like `Vec` and `Box<[u8]>`. Therefore, they use bounds like `T: AsRef<[u8]>`. The `Zeroizing>` type should be transparently equivalent to `Vec` in this regard. This allows `Zeroizing` to be used with all such bounds. Signed-off-by: Nathaniel McCallum --- zeroize/src/lib.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/zeroize/src/lib.rs b/zeroize/src/lib.rs index 5006fb61..ceca6068 100644 --- a/zeroize/src/lib.rs +++ b/zeroize/src/lib.rs @@ -580,6 +580,26 @@ where } } +impl AsRef for Zeroizing +where + T: ?Sized, + Z: AsRef + Zeroize, +{ + fn as_ref(&self) -> &T { + self.0.as_ref() + } +} + +impl AsMut for Zeroizing +where + T: ?Sized, + Z: AsMut + Zeroize, +{ + fn as_mut(&mut self) -> &mut T { + self.0.as_mut() + } +} + impl Zeroize for Zeroizing where Z: Zeroize, @@ -700,6 +720,9 @@ mod tests { #[cfg(feature = "alloc")] use alloc::boxed::Box; + #[cfg(feature = "alloc")] + use alloc::vec::Vec; + #[derive(Clone, Debug, PartialEq)] struct ZeroizedOnDrop(u64); @@ -865,4 +888,16 @@ mod tests { boxed_arr.zeroize(); assert_eq!(boxed_arr.as_ref(), &[0u8; 3]); } + + #[cfg(feature = "alloc")] + #[test] + fn asref() { + let mut buffer: Zeroizing> = Default::default(); + let _asmut: &mut [u8] = buffer.as_mut(); + let _asref: &[u8] = buffer.as_ref(); + + let mut buffer: Zeroizing> = Default::default(); + let _asmut: &mut [u8] = buffer.as_mut(); + let _asref: &[u8] = buffer.as_ref(); + } }