pub mod xchacha20_siv;
use crate::{anyhow, sodium::utils, Error};
use std::{alloc, ptr, slice};
pub(crate) unsafe fn unsafe_move_to_heap_partially<T>(value: &mut T) -> Box<T> {
let value = value as *mut _ as *mut u8;
let layout = alloc::Layout::new::<T>();
let ptr = alloc::alloc(layout);
ptr::copy_nonoverlapping(value, ptr, layout.size());
utils::memzero(slice::from_raw_parts_mut(value, layout.size()));
Box::from_raw(ptr as *mut T)
}
#[macro_export]
#[doc(hidden)]
macro_rules! move_to_heap {
($t:ident) => {{
let mut src = $t;
let result = unsafe { $crate::crypto::unsafe_move_to_heap_partially(&mut src) };
#[allow(clippy::forget_non_drop)]
std::mem::forget(src);
result
}};
}
pub(crate) fn cast_key<K>(key: &[u8]) -> &K {
assert_eq!(key.len(), std::mem::size_of::<K>());
unsafe { &*(key.as_ptr() as *const K) }
}
pub(crate) fn split_nonce_tag(
data: &mut [u8],
nonce: usize,
tag: usize,
) -> (&mut [u8], &mut [u8], &mut [u8]) {
let (nonce, rest) = data.split_at_mut(nonce);
let (data, tag) = rest.split_at_mut(rest.len() - tag);
(nonce, data, tag)
}
pub(crate) fn crypto_error<T>(_: T) -> Error {
anyhow!(@CryptoError "crypto error")
}