#![cfg(feature = "providers-pqclean")]
use crate::traits::Kem;
use pqcrypto_kyber::kyber1024;
use pqcrypto_traits::kem::{PublicKey as _, SecretKey as _, Ciphertext as _, SharedSecret as _};
#[derive(Clone, Copy, Debug, Default)]
pub struct MlKem1024;
impl Kem for MlKem1024 {
type PublicKey = Vec<u8>;
type SecretKey = Vec<u8>;
type Ciphertext = Vec<u8>;
type SharedSecret = Vec<u8>;
fn keypair(&self) -> (Self::PublicKey, Self::SecretKey) {
let (pk, sk) = kyber1024::keypair();
(pk.as_bytes().to_vec(), sk.as_bytes().to_vec())
}
fn encapsulate(&self, pk: &Self::PublicKey) -> (Self::Ciphertext, Self::SharedSecret) {
let pk = kyber1024::PublicKey::from_bytes(pk).expect("valid kyber pk");
let (ss, ct) = kyber1024::encapsulate(&pk);
(ct.as_bytes().to_vec(), ss.as_bytes().to_vec())
}
fn decapsulate(&self, sk: &Self::SecretKey, ct: &Self::Ciphertext) -> Self::SharedSecret {
let sk = kyber1024::SecretKey::from_bytes(sk).expect("valid kyber sk");
let ct = kyber1024::Ciphertext::from_bytes(ct).expect("valid kyber ct");
let ss = kyber1024::decapsulate(&ct, &sk);
ss.as_bytes().to_vec()
}
}