use core::fmt::Debug;
pub trait Kem {
const ENCAPSULATION_KEY_SIZE: usize;
const DECAPSULATION_KEY_SIZE: usize;
const CIPHERTEXT_SIZE: usize;
const SHARED_SECRET_SIZE: usize;
type EncapsulationKey: Clone + Eq + Debug + AsRef<[u8]>;
type DecapsulationKey: Clone + Eq + Debug + AsRef<[u8]>;
type Ciphertext: Clone + Eq + Debug + AsRef<[u8]>;
type SharedSecret: Clone + Eq + Debug + AsRef<[u8]>;
type KeyGenerationError;
type EncapsulationError;
type DecapsulationError;
fn generate_keypair(
fill_random: impl FnMut(&mut [u8]) -> Result<(), Self::KeyGenerationError>,
) -> Result<(Self::EncapsulationKey, Self::DecapsulationKey), Self::KeyGenerationError>;
#[must_use = "KEM encapsulation output must be used; dropping it loses the established shared secret"]
fn encapsulate(
encapsulation_key: &Self::EncapsulationKey,
fill_random: impl FnMut(&mut [u8]) -> Result<(), Self::EncapsulationError>,
) -> Result<(Self::Ciphertext, Self::SharedSecret), Self::EncapsulationError>;
#[must_use = "KEM decapsulation output must be checked and used; dropping the Result can ignore input failure"]
fn decapsulate(
decapsulation_key: &Self::DecapsulationKey,
ciphertext: &Self::Ciphertext,
) -> Result<Self::SharedSecret, Self::DecapsulationError>;
}