use crate::{asymmetric::KeyPair, CryptoBaseError};
use cosmian_crypto_core::reexport::generic_array::{ArrayLength, GenericArray};
use rand::{CryptoRng, RngCore};
pub trait Kem<SharedSecretLength: ArrayLength<u8>> {
type KeyPair: KeyPair;
type EncapsulationSize: ArrayLength<u8>;
fn description() -> String;
fn key_gen<R: RngCore + CryptoRng>(rng: &mut R) -> Self::KeyPair;
#[allow(clippy::type_complexity)]
fn encap<R: RngCore + CryptoRng>(
rng: &mut R,
pk: &<Self::KeyPair as KeyPair>::PublicKey,
) -> Result<
(
GenericArray<u8, SharedSecretLength>,
GenericArray<u8, Self::EncapsulationSize>,
),
CryptoBaseError,
>;
fn decap(
sk: &<Self::KeyPair as KeyPair>::PrivateKey,
encapsulation: GenericArray<u8, Self::EncapsulationSize>,
) -> Result<GenericArray<u8, SharedSecretLength>, CryptoBaseError>;
}