pub use aead::{Aead, NewAead, Payload};
pub use aes_siv::{Aes128SivAead, Aes256SivAead};
use aead::generic_array::{ArrayLength, GenericArray};
use rand::{CryptoRng, RngCore};
use std::panic;
pub type Aes128SivNonce = GenericArray<u8, <Aes128SivAead as Aead>::NonceSize>;
pub type Aes256SivNonce = GenericArray<u8, <Aes128SivAead as Aead>::NonceSize>;
pub type Aes128SivKey = GenericArray<u8, <Aes128SivAead as NewAead>::KeySize>;
pub type Aes256SivKey = GenericArray<u8, <Aes256SivAead as NewAead>::KeySize>;
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
pub struct LengthMismatchError;
pub trait GenericArrayExt<T, N>
where
N: ArrayLength<T>,
{
fn try_from_slice(slice: &[T]) -> Result<&GenericArray<T, N>, LengthMismatchError>
where
T: panic::RefUnwindSafe,
{
panic::catch_unwind(move || GenericArray::from_slice(slice))
.map_err(|_| LengthMismatchError {})
}
fn try_clone_from_slice(slice: &[T]) -> Result<GenericArray<T, N>, LengthMismatchError>
where
T: panic::RefUnwindSafe + Clone,
{
panic::catch_unwind(move || GenericArray::clone_from_slice(slice))
.map_err(|_| LengthMismatchError {})
}
}
impl<T, N> GenericArrayExt<T, N> for GenericArray<T, N> where N: ArrayLength<T> {}
pub fn keygen<R: RngCore + CryptoRng>(rand: &mut R) -> Aes128SivKey {
let mut key = Aes128SivKey::default();
rand.fill_bytes(key.as_mut_slice());
key
}
#[cfg(test)]
pub fn keygen_test<R: RngCore>(rand: &mut R) -> Aes128SivKey {
let mut key = Aes128SivKey::default();
rand.fill_bytes(key.as_mut_slice());
key
}