use crate::error::RivideError;
use crate::sys::*;
use std::ffi::CStr;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CpuFeatures {
pub has_aesni: bool,
pub has_arm_ce: bool,
pub has_avx2: bool,
pub has_neon: bool,
pub bitmask: u32,
}
pub fn cleanse(buffer: &mut [u8]) {
unsafe {
rivide_cleanse(
buffer.as_mut_ptr() as *mut std::os::raw::c_void,
buffer.len(),
);
}
}
pub fn randombytes_into(buffer: &mut [u8]) -> Result<(), RivideError> {
let status = unsafe { rivide_randombytes(buffer.as_mut_ptr(), buffer.len()) };
RivideError::from_status(status)
}
pub fn randombytes(len: usize) -> Result<Vec<u8>, RivideError> {
let mut buf = vec![0u8; len];
randombytes_into(&mut buf)?;
Ok(buf)
}
pub fn ct_memcmp(a: &[u8], b: &[u8]) -> i32 {
if a.len() != b.len() {
return -1;
}
unsafe {
rivide_ct_memcmp(
a.as_ptr() as *const std::os::raw::c_void,
b.as_ptr() as *const std::os::raw::c_void,
a.len(),
)
}
}
pub fn get_cpu_features() -> CpuFeatures {
let mask = unsafe { rivide_get_cpu_features() };
CpuFeatures {
has_aesni: (mask & RIVIDE_CPU_AESNI) != 0,
has_arm_ce: (mask & RIVIDE_CPU_ARM_CE) != 0,
has_avx2: (mask & RIVIDE_CPU_AVX2) != 0,
has_neon: (mask & RIVIDE_CPU_ARM_NEON) != 0,
bitmask: mask,
}
}
pub fn version() -> &'static str {
unsafe {
let ptr = rivide_version_string();
if ptr.is_null() {
"1.1.2"
} else {
CStr::from_ptr(ptr).to_str().unwrap_or("1.1.2")
}
}
}