secbits/
lib.rs

1mod bytes;
2// mod err;
3mod mem;
4
5pub use bytes::{SecBytes, SecReadBytes, SecWriteBytes};
6
7#[cfg(miri)]
8mod mock {
9    use libc::*;
10
11    // Replace `mlock` with a no-op during Miri tests
12    #[unsafe(no_mangle)]
13    pub unsafe extern "C" fn mlock(_addr: *const c_void, _len: size_t) -> c_int {
14        0 // Return success
15    }
16
17    #[unsafe(no_mangle)]
18    pub unsafe extern "C" fn munlock(_addr: *const c_void, _len: size_t) -> c_int {
19        0
20    }
21
22    #[unsafe(no_mangle)]
23    pub unsafe extern "C" fn madvise(_addr: *const c_void, _len: size_t, _advice: c_int) -> c_int {
24        0
25    }
26
27    #[unsafe(no_mangle)]
28    pub unsafe extern "C" fn explicit_bzero(addr: *const c_void, len: size_t) {
29        let ptr = addr as *mut u8;
30        unsafe { ptr.write_bytes(0, len) };
31    }
32
33    #[unsafe(no_mangle)]
34    pub unsafe extern "C" fn mprotect(addr: *mut c_void, len: size_t, prot: c_int) -> c_int {
35        0
36    }
37
38    #[unsafe(no_mangle)]
39    pub unsafe extern "C" fn pkey_alloc(flags: u32, access_rights: u32) -> i32 {
40        -1
41    }
42
43    #[unsafe(no_mangle)]
44    pub unsafe extern "C" fn pkey_free(pkey: i32) -> i32 {
45        0
46    }
47
48    #[unsafe(no_mangle)]
49    pub unsafe extern "C" fn pkey_mprotect(
50        addr: *mut libc::c_void,
51        len: usize,
52        prot: i32,
53        pkey: i32,
54    ) -> i32 {
55        0
56    }
57    #[unsafe(no_mangle)]
58    pub unsafe extern "C" fn pkey_set(pkey: i32, rights: u32) -> i32 {
59        0
60    }
61}
62
63#[cfg(test)]
64mod tests {
65    use crate::bytes::*;
66
67    #[test]
68    fn test_basic() {
69        let ori0 = b"0123456789";
70        let mut d0: Vec<u8> = ori0.into();
71        let mut sbs = SecBytes::from_bytes(&mut d0).unwrap();
72        assert_eq!(&d0, &[0; 10]);
73
74        assert_eq!(sbs.view().unwrap().as_slice(), ori0);
75
76        let ori1 = b"abcdefg";
77        let mut d1: Vec<u8> = ori1.into();
78        sbs.edit().unwrap().append(&mut d1[0..3]).unwrap();
79        let expected = [ori0, &ori1[..3]].concat();
80        assert_eq!(sbs.view().unwrap().as_slice(), &expected);
81        assert_eq!(&d1[..3], &[0; 3]);
82        assert_eq!(&d1[3..], b"defg");
83
84        sbs.edit().unwrap().as_slice()[..3].copy_from_slice(b"xyz");
85        let expected = [b"xyz", &ori0[3..], &ori1[..3]].concat();
86        assert_eq!(sbs.view().unwrap().as_slice(), &expected);
87    }
88}