use alloc::vec::Vec;
use core::ops::{Deref, DerefMut};
use zeroize::Zeroizing;
#[cfg_attr(
all(feature = "ffi", not(test)),
safer_ffi_gen::ffi_type(clone, opaque)
)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Secret(Zeroizing<Vec<u8>>);
#[cfg_attr(all(feature = "ffi", not(test)), safer_ffi_gen::safer_ffi_gen)]
impl Secret {
pub fn as_bytes(&self) -> &[u8] {
&self.0
}
}
impl From<Vec<u8>> for Secret {
fn from(bytes: Vec<u8>) -> Self {
Zeroizing::new(bytes).into()
}
}
impl From<Zeroizing<Vec<u8>>> for Secret {
fn from(bytes: Zeroizing<Vec<u8>>) -> Self {
Self(bytes)
}
}
impl Deref for Secret {
type Target = [u8];
fn deref(&self) -> &[u8] {
&self.0
}
}
impl DerefMut for Secret {
fn deref_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}