#![no_std]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![doc = include_str!("../README.md")]
#![warn(missing_docs)]
pub use aead::{self, Error, Key, Nonce, Tag};
use aead::{
AeadCore, AeadInOut, KeyInit, KeySizeUser, TagPosition,
array::{
ArraySize,
typenum::{IsGreaterOrEqual, IsLessOrEqual},
},
consts::{True, U4, U16},
inout::InOutBuf,
};
mod asconcore;
use asconcore::{AsconCore, Parameters, Parameters128};
#[derive(Clone)]
struct Ascon<P: Parameters> {
key: P::InternalKey,
}
impl<P: Parameters> KeySizeUser for Ascon<P> {
type KeySize = P::KeySize;
}
impl<P: Parameters> KeyInit for Ascon<P> {
fn new(key: &Key<Self>) -> Self {
Self {
key: P::InternalKey::from(key),
}
}
}
impl<P: Parameters> AeadCore for Ascon<P> {
type NonceSize = U16;
type TagSize = P::TagSize;
const TAG_POSITION: TagPosition = TagPosition::Postfix;
}
impl<P: Parameters> AeadInOut for Ascon<P> {
fn encrypt_inout_detached(
&self,
nonce: &Nonce<Self>,
associated_data: &[u8],
buffer: InOutBuf<'_, '_, u8>,
) -> Result<Tag<Self>, Error> {
if (buffer.len() as u64)
.checked_add(associated_data.len() as u64)
.is_none()
{
return Err(Error);
}
let mut core = AsconCore::<P>::new(&self.key, nonce);
Ok(core.encrypt_inout(buffer, associated_data))
}
fn decrypt_inout_detached(
&self,
nonce: &Nonce<Self>,
associated_data: &[u8],
buffer: InOutBuf<'_, '_, u8>,
tag: &Tag<Self>,
) -> Result<(), Error> {
if (buffer.len() as u64)
.checked_add(associated_data.len() as u64)
.is_none()
{
return Err(Error);
}
let mut core = AsconCore::<P>::new(&self.key, nonce);
core.decrypt_inout(buffer, associated_data, tag)
}
}
pub struct AsconAead128(Ascon<Parameters128<U16>>);
pub type AsconAead128Key = Key<AsconAead128>;
pub type AsconAead128Nonce = Nonce<AsconAead128>;
pub type AsconAead128Tag = Tag<AsconAead128>;
impl KeySizeUser for AsconAead128 {
type KeySize = U16;
}
impl KeyInit for AsconAead128 {
fn new(key: &Key<Self>) -> Self {
Self(Ascon::new(key))
}
}
impl AeadCore for AsconAead128 {
type NonceSize = U16;
type TagSize = U16;
const TAG_POSITION: TagPosition = TagPosition::Postfix;
}
impl AeadInOut for AsconAead128 {
#[inline(always)]
fn encrypt_inout_detached(
&self,
nonce: &Nonce<Self>,
associated_data: &[u8],
buffer: InOutBuf<'_, '_, u8>,
) -> Result<Tag<Self>, Error> {
self.0
.encrypt_inout_detached(nonce, associated_data, buffer)
}
#[inline(always)]
fn decrypt_inout_detached(
&self,
nonce: &Nonce<Self>,
associated_data: &[u8],
buffer: InOutBuf<'_, '_, u8>,
tag: &Tag<Self>,
) -> Result<(), Error> {
self.0
.decrypt_inout_detached(nonce, associated_data, buffer, tag)
}
}
pub struct TruncatedAsconAead128<TagSize = U16>(Ascon<Parameters128<TagSize>>)
where
TagSize: ArraySize + IsLessOrEqual<U16, Output = True> + IsGreaterOrEqual<U4, Output = True>;
pub type TruncatedAsconAead128Key<TagSize = U16> = Key<TruncatedAsconAead128<TagSize>>;
pub type TruncatedAsconAead128Nonce<TagSize = U16> = Nonce<TruncatedAsconAead128<TagSize>>;
pub type TruncatedAsconAead128Tag<TagSize = U16> = Tag<TruncatedAsconAead128<TagSize>>;
impl<TagSize> KeySizeUser for TruncatedAsconAead128<TagSize>
where
TagSize: ArraySize + IsLessOrEqual<U16, Output = True> + IsGreaterOrEqual<U4, Output = True>,
{
type KeySize = U16;
}
impl<TagSize> KeyInit for TruncatedAsconAead128<TagSize>
where
TagSize: ArraySize + IsLessOrEqual<U16, Output = True> + IsGreaterOrEqual<U4, Output = True>,
{
fn new(key: &Key<Self>) -> Self {
Self(Ascon::new(key))
}
}
impl<TagSize> AeadCore for TruncatedAsconAead128<TagSize>
where
TagSize: ArraySize + IsLessOrEqual<U16, Output = True> + IsGreaterOrEqual<U4, Output = True>,
{
type NonceSize = U16;
type TagSize = TagSize;
const TAG_POSITION: TagPosition = TagPosition::Postfix;
}
impl<TagSize> AeadInOut for TruncatedAsconAead128<TagSize>
where
TagSize: ArraySize + IsLessOrEqual<U16, Output = True> + IsGreaterOrEqual<U4, Output = True>,
{
#[inline(always)]
fn encrypt_inout_detached(
&self,
nonce: &Nonce<Self>,
associated_data: &[u8],
buffer: InOutBuf<'_, '_, u8>,
) -> Result<Tag<Self>, Error> {
self.0
.encrypt_inout_detached(nonce, associated_data, buffer)
}
#[inline(always)]
fn decrypt_inout_detached(
&self,
nonce: &Nonce<Self>,
associated_data: &[u8],
buffer: InOutBuf<'_, '_, u8>,
tag: &Tag<Self>,
) -> Result<(), Error> {
self.0
.decrypt_inout_detached(nonce, associated_data, buffer, tag)
}
}