flex-alloc-secure 0.0.1

Secured allocations for flex-alloc
Documentation
use flex_alloc_secure::{
    alloc::UNINIT_ALLOC_BYTE,
    boxed::{ProtectedBox, ShieldedBox},
    vec::SecureVec,
    ExposeProtected, ProtectedInit, ProtectedInitSlice,
};

const UNINIT_USIZE: usize = usize::from_ne_bytes([UNINIT_ALLOC_BYTE; size_of::<usize>()]);

#[test]
fn protected_box() {
    let prot = ProtectedBox::init_with(|| 99usize);
    prot.expose_read(|r| {
        assert_eq!(r.as_ref(), &99usize);
    });

    let mut prot = ProtectedBox::init_slice(3, |mut s| {
        s.copy_from_slice(&[10usize, 9, 8]);
    });
    prot.expose_read(|r| {
        assert_eq!(r.as_ref(), &[10, 9, 8]);
    });
    prot.expose_write(|mut w| {
        w[0] = 11;
    });
    prot.expose_read(|r| {
        assert_eq!(r.as_ref(), &[11, 9, 8]);
    });
}

#[test]
fn protected_box_send() {
    use std::sync::OnceLock;
    static ONCE: OnceLock<ProtectedBox<usize>> = OnceLock::new();

    let prot = ProtectedBox::init_with(|| 99usize);
    std::thread::spawn(move || {
        prot.expose_read(|r| {
            assert_eq!(r.as_ref(), &99usize);
        });
    });

    ONCE.get_or_init(|| ProtectedBox::init_with(|| 98usize))
        .expose_read(|r| {
            assert_eq!(r.as_ref(), &98usize);
        });
}

#[test]
fn shielded_box() {
    let prot = ShieldedBox::init_with(|| 99usize);
    prot.expose_read(|r| {
        assert_eq!(r.as_ref(), &99usize);
    });

    let mut prot = ShieldedBox::init_slice(3, |mut s| {
        s.copy_from_slice(&[10usize, 9, 8]);
    });
    prot.expose_read(|r| {
        assert_eq!(r.as_ref(), &[10, 9, 8]);
    });
    prot.expose_write(|mut w| {
        w[0] = 11;
    });
    prot.expose_read(|r| {
        assert_eq!(r.as_ref(), &[11, 9, 8]);
    });
}

#[test]
fn protected_vec() {
    let mut sec = SecureVec::<usize>::with_capacity(4);
    assert_eq!(
        unsafe { sec.spare_capacity_mut()[0].assume_init() },
        UNINIT_USIZE
    );
    sec.extend_from_slice(&[5, 4, 3]);
    let prot = ProtectedBox::<[usize]>::from(sec);
    prot.expose_read(|r| {
        assert_eq!(r.as_ref(), &[5, 4, 3]);
    });
}