use core::fmt::Debug;
use digest::Digest;
use rand_core::CryptoRng;
use zeroize::Zeroize;
pub trait Kem {
type EncapsulationKey: AsRef<[u8]> + Clone + Zeroize;
type DecapsulationKey: Zeroize;
type Ciphertext: AsRef<[u8]> + Clone + Zeroize;
type SharedSecret: AsRef<[u8]> + Zeroize;
type Error: Debug;
fn generate(rng: &mut impl CryptoRng) -> (Self::DecapsulationKey, Self::EncapsulationKey);
fn encaps(
ek: &Self::EncapsulationKey,
rng: &mut impl CryptoRng,
) -> Result<(Self::Ciphertext, Self::SharedSecret), Self::Error>;
fn decaps(
dk: &Self::DecapsulationKey,
ct: &Self::Ciphertext,
) -> Result<Self::SharedSecret, Self::Error>;
}
pub trait CipherSuite {
type Kem: Kem;
type Hash: Digest + Clone;
}