use libcrux_secrets::U8;
pub trait Kem<
const EK_LEN: usize,
const DK_LEN: usize,
const CT_LEN: usize,
const SS_LEN: usize,
const RAND_KEYGEN_LEN: usize,
const RAND_ENCAPS_LEN: usize,
>
{
fn keygen(
ek: &mut [u8; EK_LEN],
dk: &mut [U8; DK_LEN],
rand: &[U8; RAND_KEYGEN_LEN],
) -> Result<(), KeyGenError>;
fn encaps(
ct: &mut [u8; CT_LEN],
ss: &mut [U8; SS_LEN],
ek: &[u8; EK_LEN],
rand: &[U8; RAND_ENCAPS_LEN],
) -> Result<(), EncapsError>;
fn decaps(
ss: &mut [U8; SS_LEN],
ct: &[u8; CT_LEN],
dk: &[U8; DK_LEN],
) -> Result<(), DecapsError>;
}
#[derive(Debug)]
pub enum KeyGenError {
InvalidRandomness,
Unknown,
}
#[derive(Debug)]
pub enum EncapsError {
InvalidEncapsKey,
InvalidRandomness,
Unknown,
}
#[derive(Debug)]
pub enum DecapsError {
InvalidCiphertext,
InvalidDecapsKey,
Unknown,
}
impl core::fmt::Display for KeyGenError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
let text = match self {
KeyGenError::InvalidRandomness => "error generating key with provided randomness",
KeyGenError::Unknown => "an unknown error occurred",
};
f.write_str(text)
}
}
impl core::fmt::Display for EncapsError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
let text = match self {
EncapsError::InvalidEncapsKey => "encapsulation key is invalid",
EncapsError::InvalidRandomness => "error generating key with provided randomness",
EncapsError::Unknown => "an unknown error occurred",
};
f.write_str(text)
}
}
impl core::fmt::Display for DecapsError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
let text = match self {
DecapsError::InvalidDecapsKey => "encapsulation key is invalid",
DecapsError::InvalidCiphertext => "ciphertext is invalid",
DecapsError::Unknown => "an unknown error occurred",
};
f.write_str(text)
}
}
#[cfg(feature = "error-in-core")]
mod error_in_core {
impl core::error::Error for super::EncapsError {}
impl core::error::Error for super::DecapsError {}
impl core::error::Error for super::KeyGenError {}
}