use core::sync::atomic::{Ordering, compiler_fence};
pub fn zeroize_bytes(bytes: &mut [u8]) {
for byte in bytes.iter_mut() {
unsafe {
std::ptr::write_volatile(byte, 0);
}
}
compiler_fence(Ordering::SeqCst);
}
pub fn zeroize_array<const N: usize>(arr: &mut [u8; N]) {
zeroize_bytes(arr.as_mut_slice());
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn zeroize_clears_bytes() {
let mut buf = [0xFFu8; 64];
zeroize_bytes(&mut buf);
assert!(buf.iter().all(|&b| b == 0));
}
#[test]
fn zeroize_clears_array() {
let mut arr = [0xABu8; 32];
zeroize_array(&mut arr);
assert!(arr.iter().all(|&b| b == 0));
}
#[test]
fn zeroize_empty_slice() {
let mut buf = [];
zeroize_bytes(&mut buf); }
}