use crypto::utils::{randombytes,secmem};
pub struct Nonce {
nonce_ptr: *mut u8,
size: usize,
}
impl Nonce {
pub fn new(size: usize) -> Nonce {
let mut nonce = secmem::malloc(size);
randombytes::random_byte_array(&mut nonce);
secmem::mprotect_noaccess(nonce);
Nonce {
nonce_ptr: nonce.as_mut_ptr(),
size: size,
}
}
pub fn bytes(&self) -> &[u8] {
use std::slice;
unsafe {
slice::from_raw_parts(self.nonce_ptr, self.size)
}
}
pub fn bytes_mut(&self) -> &mut [u8] {
use std::slice;
unsafe {
slice::from_raw_parts_mut(self.nonce_ptr, self.size)
}
}
pub fn activate(&self) {
secmem::mprotect_readwrite(self.bytes());
}
pub fn deactivate(&self) {
secmem::mprotect_noaccess(self.bytes());
}
#[cfg(feature = "latest")]
pub fn increment(&self) {
secmem::increment(self.bytes_mut());
}
}
impl Drop for Nonce {
fn drop(&mut self) {
if self.nonce_ptr.is_null() { return; }
secmem::free(self.bytes());
}
}