use sodium_sys::crypto::utils::secmem;
#[test]
fn memzero() {
let v = [0, 1, 2, 3, 4, 5, 6, 7];
secmem::memzero(&v);
assert!(v == [0; 8]);
}
#[test]
fn memcmp() {
let v0 = [0, 1, 2, 3, 4, 5, 6, 7];
let v1 = [0, 1, 2, 3, 4, 5, 6, 7];
let v2 = [7, 6, 5, 4, 3, 2, 1, 0];
assert!(secmem::memcmp(&v0,&v1) == 0);
assert!(secmem::memcmp(&v0,&v2) == -1);
assert!(secmem::memcmp(&v1,&v2) == -1);
}
#[test]
fn bin2hex() {
let v = [0, 1, 254, 255];
assert!(secmem::bin2hex(&v).unwrap() == "0001feff");
}
#[test]
fn hex2bin() {
let hex = String::from("0001feff");
let mut output = Vec::new();
assert!(secmem::hex2bin(hex, &mut output, None) == 0);
assert!(output == [0, 1, 254, 255]);
let hex = String::from("00:01:fe:ff");
let ignore = Some(String::from(":"));
let mut output = Vec::new();
assert!(secmem::hex2bin(hex, &mut output, ignore) == 0);
assert!(output == [0, 1, 254, 255]);
let hex = String::from("00 01 fe ff");
let ignore = Some(String::from(" "));
let mut output = Vec::new();
assert!(secmem::hex2bin(hex, &mut output, ignore) == 0);
assert!(output == [0, 1, 254, 255]);
let hex = String::from("00 01:fe ff");
let ignore = Some(String::from(": "));
let mut output = Vec::new();
assert!(secmem::hex2bin(hex, &mut output, ignore) == 0);
assert!(output == [0, 1, 254, 255]);
}
#[cfg(feature = "mlock_tests")]
#[test]
fn mlock_munlock() {
::test_init();
let v = [0, 1, 2, 3, 4, 5, 6, 7];
assert!(secmem::mlock(&v) == 0);
assert!(secmem::munlock(&v) == 0);
assert!(v == [0; 8]);
}
#[test]
fn malloc_free() {
::test_init();
let mut v = secmem::malloc(64);
v[0] = 1;
assert!(v.len() == 64);
assert!(v[0] == 1);
secmem::free(&mut v);
}
#[test]
fn allocarray_free() {
::test_init();
let count = 2;
let size = 16;
let mut v = secmem::allocarray(count, size);
v[0] = 1;
v[31] = 255;
assert!(v.len() == (count * size) as usize);
assert!(v[0] == 1);
assert!(v[31] == 255);
secmem::free(&mut v);
}
#[test]
fn malloc_noaccess_free() {
::test_init();
let mut v = secmem::malloc(64);
v[0] = 1;
assert!(v.len() == 64);
assert!(v[0] == 1);
secmem::mprotect_noaccess(&mut v);
secmem::free(&mut v);
}
#[test]
fn malloc_readonly_free() {
::test_init();
let mut v = secmem::malloc(64);
v[0] = 1;
assert!(v.len() == 64);
assert!(v[0] == 1);
secmem::mprotect_readonly(&mut v);
assert!(v[0] == 1);
secmem::free(&mut v);
}
#[test]
fn malloc_noaccess_readwrite_free() {
::test_init();
let mut v = secmem::malloc(64);
v[0] = 1;
assert!(v.len() == 64);
assert!(v[0] == 1);
secmem::mprotect_noaccess(&mut v);
secmem::mprotect_readwrite(&mut v);
assert!(v[0] == 1);
v[1] = 1;
assert!(v[1] == 1);
secmem::free(&mut v);
}
#[cfg(feature = "latest")]
#[test]
fn increment() {
let mut nonce = [1];
secmem::increment(&mut nonce);
assert!(nonce == [2]);
}