use crypto_core::{Algorithm, CryptoError};
use zeroize::Zeroizing;
use crate::kem_error::{
crypto_error_from_kem_decapsulation_operation_error,
crypto_error_from_kem_encapsulation_operation_error,
crypto_error_from_kem_key_generation_operation_error,
};
pub use crypto_ml_kem_768::{ML_KEM_768_PUBLIC_KEY_LEN, ML_KEM_768_SECRET_KEY_LEN};
pub fn generate_ml_kem_768_keypair() -> Result<(Vec<u8>, Zeroizing<Vec<u8>>), CryptoError> {
crate::operations::kem::generate_key_pair(Algorithm::MlKem768)
.map(|key_pair| (key_pair.public_key, key_pair.secret_key))
.map_err(crypto_error_from_kem_key_generation_operation_error)
}
pub fn generate_ml_kem_768_keypair_from_seed(
seed: &[u8; ML_KEM_768_SECRET_KEY_LEN],
) -> Result<(Vec<u8>, Zeroizing<Vec<u8>>), CryptoError> {
crate::operations::kem::derive_key_pair(Algorithm::MlKem768, seed)
.map(|key_pair| (key_pair.public_key, key_pair.secret_key))
.map_err(crypto_error_from_kem_key_generation_operation_error)
}
pub fn ml_kem_768_encapsulate(
public_key: &[u8],
) -> Result<(Vec<u8>, Zeroizing<Vec<u8>>), CryptoError> {
crate::operations::kem::encapsulate(Algorithm::MlKem768, public_key)
.map(|encapsulation| (encapsulation.ciphertext, encapsulation.shared_secret))
.map_err(crypto_error_from_kem_encapsulation_operation_error)
}
#[cfg(feature = "test-vectors")]
pub fn ml_kem_768_encapsulate_derand(
public_key: &[u8],
randomness: &[u8],
) -> Result<(Vec<u8>, Zeroizing<Vec<u8>>), CryptoError> {
crate::operations::kem::encapsulate_derand(Algorithm::MlKem768, public_key, randomness)
.map(|encapsulation| (encapsulation.ciphertext, encapsulation.shared_secret))
.map_err(crypto_error_from_kem_encapsulation_operation_error)
}
pub fn ml_kem_768_decapsulate(
ciphertext: &[u8],
secret_key: &[u8],
) -> Result<Zeroizing<Vec<u8>>, CryptoError> {
crate::operations::kem::decapsulate(Algorithm::MlKem768, ciphertext, secret_key)
.map_err(crypto_error_from_kem_decapsulation_operation_error)
}