use crate::assert::assert_zeroize_on_drop;
use crate::traits::{AssertZeroizeOnDrop, FastZeroizable, ZeroizationProbe};
use crate::zeroize_on_drop_sentinel::ZeroizeOnDropSentinel;
use crate::zeroizing_mut_guard::ZeroizingMutGuard;
#[test]
fn test_assert_zeroized_on_drop_ok() {
struct StructThatIsZeroizedOnDrop<'a> {
data: ZeroizingMutGuard<'a, [u8; 32]>,
__sentinel: ZeroizeOnDropSentinel,
}
impl<'a> FastZeroizable for StructThatIsZeroizedOnDrop<'a> {
fn fast_zeroize(&mut self) {
self.data.fast_zeroize();
self.__sentinel.fast_zeroize();
}
}
impl<'a> StructThatIsZeroizedOnDrop<'a> {
fn new(data: &'a mut [u8; 32]) -> Self {
Self {
data: ZeroizingMutGuard::from(data),
__sentinel: ZeroizeOnDropSentinel::default(),
}
}
}
impl<'a> AssertZeroizeOnDrop for StructThatIsZeroizedOnDrop<'a> {
fn clone_sentinel(&self) -> ZeroizeOnDropSentinel {
self.__sentinel.clone()
}
fn assert_zeroize_on_drop(self) {
assert_zeroize_on_drop(self);
}
}
impl<'a> Drop for StructThatIsZeroizedOnDrop<'a> {
fn drop(&mut self) {
self.fast_zeroize();
}
}
let mut data = [1u8; 32];
{
let s = StructThatIsZeroizedOnDrop::new(&mut data);
s.assert_zeroize_on_drop();
}
assert!(data.is_zeroized());
}
#[test]
fn test_assert_zeroized_on_drop_failure() {
use std::panic::catch_unwind;
struct StructThatIsNotZeroizedOnDrop<'a> {
data: ZeroizingMutGuard<'a, [u8; 32]>,
__sentinel: ZeroizeOnDropSentinel,
}
impl<'a> FastZeroizable for StructThatIsNotZeroizedOnDrop<'a> {
fn fast_zeroize(&mut self) {
self.data.fast_zeroize();
self.__sentinel.fast_zeroize();
}
}
impl<'a> StructThatIsNotZeroizedOnDrop<'a> {
fn new(data: &'a mut [u8; 32]) -> Self {
Self {
data: ZeroizingMutGuard::from(data),
__sentinel: ZeroizeOnDropSentinel::default(),
}
}
}
impl<'a> AssertZeroizeOnDrop for StructThatIsNotZeroizedOnDrop<'a> {
fn clone_sentinel(&self) -> ZeroizeOnDropSentinel {
self.__sentinel.clone()
}
fn assert_zeroize_on_drop(self) {
assert_zeroize_on_drop(self);
}
}
let mut data = [1u8; 32];
let result = catch_unwind(move || {
let s = StructThatIsNotZeroizedOnDrop::new(&mut data);
s.assert_zeroize_on_drop();
});
assert!(result.is_err());
assert!(data.iter().all(|b| *b == 1));
}