use ml_dsa::{
Generate, KeyExport, KeyInit, Keypair, MlDsa65, Signature, SignatureEncoding, SigningKey,
Signer, Verifier, VerifyingKey,
};
use crate::error::{CasError, CasResult};
use crate::pqc::cas_pqc::MlDsaKeyPair;
pub fn generate_signing_and_verification_key() -> MlDsaKeyPair {
let signing_key = SigningKey::<MlDsa65>::generate();
let verifying_key = signing_key.verifying_key();
MlDsaKeyPair {
signing_key: signing_key.to_bytes().to_vec(),
verification_key: verifying_key.to_bytes().to_vec(),
}
}
pub fn sign_message(message: Vec<u8>, signing_key: Vec<u8>) -> CasResult<Vec<u8>> {
let key = SigningKey::<MlDsa65>::new_from_slice(signing_key.as_slice())
.map_err(|_| CasError::InvalidKey)?;
let signature: Signature<MlDsa65> = key.try_sign(&message).map_err(|_| CasError::SigningFailed)?;
Ok(signature.to_vec())
}
pub fn verify_signature(message: Vec<u8>, signature: Vec<u8>, verification_key: Vec<u8>) -> CasResult<bool> {
let vk = VerifyingKey::<MlDsa65>::new_from_slice(verification_key.as_slice())
.map_err(|_| CasError::InvalidKey)?;
let sig = Signature::<MlDsa65>::try_from(signature.as_slice())
.map_err(|_| CasError::InvalidSignature)?;
Ok(vk.verify(&message, &sig).is_ok())
}