1mod bytes;
2mod mem;
4
5pub use bytes::{SecBytes, SecReadBytes, SecWriteBytes};
6
7#[cfg(miri)]
8mod mock {
9 use libc::*;
10
11 #[unsafe(no_mangle)]
13 pub unsafe extern "C" fn mlock(_addr: *const c_void, _len: size_t) -> c_int {
14 0 }
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}