use super::serialize::{Serialize, SerializeSecret};
use crate::Result;
use rand::{CryptoRng, RngCore};
use zeroize::Zeroize;
pub trait Kem {
type PublicKey: Clone + Serialize;
type SecretKey: Zeroize + Clone + SerializeSecret;
type SharedSecret: Zeroize + Clone + SerializeSecret;
type Ciphertext: Clone + Serialize;
type KeyPair: Clone;
fn name() -> &'static str;
fn keypair<R: CryptoRng + RngCore>(rng: &mut R) -> Result<Self::KeyPair>;
fn public_key(keypair: &Self::KeyPair) -> Self::PublicKey;
fn secret_key(keypair: &Self::KeyPair) -> Self::SecretKey;
fn encapsulate<R: CryptoRng + RngCore>(
rng: &mut R,
public_key: &Self::PublicKey,
) -> Result<(Self::Ciphertext, Self::SharedSecret)>;
fn decapsulate(
secret_key: &Self::SecretKey,
ciphertext: &Self::Ciphertext,
) -> Result<Self::SharedSecret>;
}