use core::marker::PhantomData;
use hpke::{Deserializable, Kem as HpkeKemTrait, Serializable};
use super::{Kem, KemError};
pub struct HpkeDhKem<K: HpkeKemTrait>(PhantomData<K>);
impl<K: HpkeKemTrait> Kem for HpkeDhKem<K> {
type PublicKey = K::PublicKey;
type SecretKey = K::PrivateKey;
fn encap(pk: &Self::PublicKey) -> Result<(Vec<u8>, Vec<u8>), KemError> {
let mut rng = rand_core_09::UnwrapErr(rand_core_09::OsRng);
let (shared_secret, encapped_key) =
K::encap(pk, None, &mut rng).map_err(|_| KemError::EncapFailed)?;
Ok((shared_secret.0.to_vec(), encapped_key.to_bytes().to_vec()))
}
fn decap(sk: &Self::SecretKey, ct: &[u8]) -> Result<Vec<u8>, KemError> {
let encapped = K::EncappedKey::from_bytes(ct).map_err(|_| KemError::BadRecipientKey)?;
let shared_secret = K::decap(sk, None, &encapped).map_err(|_| KemError::DecapFailed)?;
Ok(shared_secret.0.to_vec())
}
}
pub fn gen_keypair<K: HpkeKemTrait>() -> (K::PrivateKey, K::PublicKey) {
let mut rng = rand_core_09::UnwrapErr(rand_core_09::OsRng);
K::gen_keypair(&mut rng)
}
pub type DhKemP256HkdfSha256 = HpkeDhKem<hpke::kem::DhP256HkdfSha256>;