use zeroize::{Zeroize, ZeroizeOnDrop};
pub struct SecretBytes(Vec<u8>);
impl Zeroize for SecretBytes {
fn zeroize(&mut self) {
self.0.zeroize();
}
}
impl ZeroizeOnDrop for SecretBytes {}
impl Drop for SecretBytes {
fn drop(&mut self) {
self.zeroize();
}
}
impl SecretBytes {
pub(crate) const fn new(bytes: Vec<u8>) -> Self {
Self(bytes)
}
#[must_use]
pub fn as_bytes(&self) -> &[u8] {
&self.0
}
pub fn as_str(&self) -> Result<&str, std::str::Utf8Error> {
std::str::from_utf8(&self.0)
}
#[must_use]
pub fn len(&self) -> usize {
self.0.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}
impl std::fmt::Debug for SecretBytes {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("SecretBytes").field(&"[redacted]").finish()
}
}
pub(crate) unsafe fn zeroize_raw(ptr: *mut u8, len: usize) {
let slice = unsafe { std::slice::from_raw_parts_mut(ptr, len) };
slice.zeroize();
}