use crate::{MlKemKeyPair, PublicKey, SecretKey, given_oqs};
use anyhow::Result;
use hkdf::Hkdf;
use oqs;
use oqs::kem::SharedSecret;
use sha2::Sha256;
pub(crate) fn derive_chacha_key(shared_secret: SharedSecret) -> Result<[u8; 32]> {
let hk = Hkdf::<Sha256>::new(None, &shared_secret.into_vec());
let mut okm = [0u8; 32];
hk.expand(b"chacha-encryption-v1", &mut okm)
.map_err(|e| anyhow::anyhow!("HKDF key derivation failed: {}", e))?;
Ok(okm)
}
pub fn generate_keypair() -> Result<MlKemKeyPair> {
let (sec, kem) = given_oqs()?;
let (gpublic_key, gprivate_key) = kem
.keypair()
.map_err(|e| anyhow::anyhow!("Failed to generate ML-KEM keypair: {}", e))?;
Ok(MlKemKeyPair {
public_key: PublicKey {
security: sec.clone(),
key: gpublic_key,
},
private_key: SecretKey {
security: sec,
key: gprivate_key,
},
})
}