use crypto::utils::{randombytes,secmem};
pub struct Key {
key_ptr: *mut u8,
size: usize,
}
impl Key {
pub fn new(size: usize) -> Key {
let mut key = secmem::malloc(size);
randombytes::random_byte_array(&mut key);
secmem::mprotect_noaccess(key);
Key {
key_ptr: key.as_mut_ptr(),
size: size,
}
}
pub fn bytes(&self) -> &[u8] {
use std::slice;
unsafe {
slice::from_raw_parts(self.key_ptr, self.size)
}
}
pub fn bytes_mut(&self) -> &mut [u8] {
use std::slice;
unsafe {
slice::from_raw_parts_mut(self.key_ptr, self.size)
}
}
pub fn activate(&self) {
secmem::mprotect_readonly(self.bytes());
}
pub fn deactivate(&self) {
secmem::mprotect_noaccess(self.bytes());
}
}
impl Drop for Key {
fn drop(&mut self) {
if self.key_ptr.is_null() { return; }
secmem::free(self.bytes());
}
}