Files
Tony Arcieri 0c7cf02d1b ml-dsa: apply and fix workspace-level lints (#1338)
Applies the workspace-level config added in #1323 to this crate and
fixes any failures.
2026-05-07 21:14:26 -06:00

101 lines
2.7 KiB
Rust

//! Signature generation tests.
#![allow(clippy::unwrap_used, reason = "tests")]
use ml_dsa::*;
use std::{fs::read_to_string, path::PathBuf};
#[test]
fn acvp_sig_gen() {
// Load the JSON test file
let mut p = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
p.push("tests/sig-gen.json");
let tv_json = read_to_string(p.as_path()).unwrap();
// Parse the test vectors
let tv: acvp::TestVectorFile = serde_json::from_str(&tv_json).unwrap();
// Verify the test vectors
for tg in tv.test_groups {
for tc in tg.tests {
match tg.parameter_set {
acvp::ParameterSet::MlDsa44 => verify::<MlDsa44>(&tc, tg.deterministic),
acvp::ParameterSet::MlDsa65 => verify::<MlDsa65>(&tc, tg.deterministic),
acvp::ParameterSet::MlDsa87 => verify::<MlDsa87>(&tc, tg.deterministic),
}
}
}
}
fn verify<P: MlDsaParams>(tc: &acvp::TestCase, deterministic: bool) {
// Import the signing key
let sk_bytes = ExpandedSigningKeyBytes::<P>::try_from(tc.sk.as_slice()).unwrap();
#[allow(deprecated)]
let sk = ExpandedSigningKey::<P>::from_expanded(&sk_bytes);
// Verify correctness
let rnd = if deterministic {
B32::default()
} else {
B32::try_from(tc.rnd.as_slice()).unwrap()
};
let sig = sk.sign_internal(&[&tc.message], &rnd);
let sig_bytes = sig.encode();
assert_eq!(tc.signature.as_slice(), sig_bytes.as_slice());
}
mod acvp {
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
pub(crate) struct TestVectorFile {
#[serde(rename = "testGroups")]
pub(crate) test_groups: Vec<TestGroup>,
}
#[derive(Deserialize, Serialize)]
pub(crate) struct TestGroup {
#[serde(rename = "tgId")]
pub(crate) id: usize,
#[serde(rename = "parameterSet")]
pub(crate) parameter_set: ParameterSet,
pub(crate) deterministic: bool,
pub(crate) tests: Vec<TestCase>,
}
#[derive(Deserialize, Serialize)]
pub(crate) enum ParameterSet {
#[serde(rename = "ML-DSA-44")]
MlDsa44,
#[serde(rename = "ML-DSA-65")]
MlDsa65,
#[serde(rename = "ML-DSA-87")]
MlDsa87,
}
#[derive(Deserialize, Serialize)]
pub(crate) struct TestCase {
#[serde(rename = "tcId")]
pub(crate) id: usize,
#[serde(with = "hex::serde")]
pub(crate) sk: Vec<u8>,
#[serde(with = "hex::serde")]
pub(crate) message: Vec<u8>,
#[serde(with = "hex::serde")]
pub(crate) signature: Vec<u8>,
#[serde(default, with = "hex::serde")]
pub(crate) rnd: Vec<u8>,
}
}