use std::io;
use std::thread;
use std::time::Duration;
fn main() -> io::Result<()> {
const PAGE_LEN: usize = 4096;
let mut secret = vec![0u8; PAGE_LEN];
secret[..16].copy_from_slice(b"super-secret-data");
let ptr = secret.as_ptr() as *const std::os::raw::c_void;
let len = secret.len();
println!("Attempting to lock {} bytes at {:p}", len, ptr);
match unsafe { os_memlock::mlock(ptr, len) } {
Ok(()) => println!("mlock succeeded"),
Err(e) if e.kind() == io::ErrorKind::Unsupported => {
println!("mlock is unsupported on this platform/build; continuing without page-lock")
}
Err(e) => return Err(e),
}
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
{
let mut_ptr = secret.as_mut_ptr() as *mut std::os::raw::c_void;
match unsafe { os_memlock::madvise_dontdump(mut_ptr, len) } {
Ok(()) => println!("madvise dump-exclusion hint applied"),
Err(e) if e.kind() == io::ErrorKind::Unsupported => {
println!("madvise dump-exclusion hint unsupported on this platform/build")
}
Err(e) => eprintln!("madvise failed: {:#}", e),
}
}
println!("Working with secret data (simulated)...");
thread::sleep(Duration::from_millis(250));
match unsafe { os_memlock::munlock(ptr, len) } {
Ok(()) => println!("munlock succeeded"),
Err(e) if e.kind() == io::ErrorKind::Unsupported => {
println!("munlock unsupported (no-op for this platform/build)")
}
Err(e) => return Err(e),
}
for b in &mut secret {
*b = 0;
}
println!("Secret zeroized and example complete.");
Ok(())
}