Skip to content

Commit

Permalink
ML-DSA KAT tests
Browse files Browse the repository at this point in the history
  • Loading branch information
justsmth committed Feb 12, 2025
1 parent d943474 commit 1f41137
Show file tree
Hide file tree
Showing 10 changed files with 457 additions and 4 deletions.
28 changes: 27 additions & 1 deletion aws-lc-rs/src/pqdsa/key_pair.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ use crate::pqdsa::signature::{PqdsaSigningAlgorithm, PublicKey};
use crate::pqdsa::validate_pqdsa_evp_key;
use crate::ptr::LcPtr;
use crate::signature::KeyPair;
use aws_lc_sys::{EVP_PKEY_new_raw_private_key, EVP_PKEY_pqdsa_new_raw_private_key};
use core::fmt::{Debug, Formatter};
use std::ffi::c_int;
use std::ptr::null_mut;

/// A PQDSA (Post-Quantum Digital Signature Algorithm) key pair, used for signing.
///
Expand Down Expand Up @@ -122,7 +124,7 @@ impl PqdsaKeyPair {
})
}

/// Parses a PKCS#8 v1 key from the specified bytes.
/// Parses a raw private key from the specified bytes.
///
/// # Errors
/// Returns `Unspecified` if the key is invalid.
Expand All @@ -148,6 +150,30 @@ impl PqdsaKeyPair {
})
}

/// Parses a raw seed from the specified bytes.
///
/// # Errors
/// Returns `Unspecified` if the key is invalid.
pub fn from_raw_seed(
algorithm: &'static PqdsaSigningAlgorithm,
raw_seed: &[u8],
) -> Result<Self, Unspecified> {
let evp_pkey = LcPtr::<EVP_PKEY>::new(unsafe {
EVP_PKEY_pqdsa_new_raw_private_key(
algorithm.0.id.nid(),
raw_seed.as_ptr(),
raw_seed.len(),
)
})?;
validate_pqdsa_evp_key(&evp_pkey, algorithm.0.id)?;
let pubkey = PublicKey::from_private_evp_pkey(&evp_pkey)?;
Ok(Self {
algorithm,
evp_pkey,
pubkey,
})
}

/// Serializes the key to PKCS#8 v1 DER.
///
/// # Errors
Expand Down
4 changes: 2 additions & 2 deletions aws-lc-rs/src/pqdsa/signature.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
// TODO: Remove
#![allow(missing_docs)]

use crate::aws_lc::EVP_PKEY;
use crate::aws_lc::{EVP_PKEY_CTX_pqdsa_set_params, EVP_PKEY};
use crate::buffer::Buffer;
use crate::encoding::{AsDer, Pkcs8V1Der, PublicKeyX509Der};
use crate::error::Unspecified;
Expand Down Expand Up @@ -81,8 +81,8 @@ impl VerificationAlgorithm for PqdsaVerificationAlgorithm {
msg: &[u8],
signature: &[u8],
) -> Result<(), Unspecified> {
// TODO: Do we need to also allow "raw" public keys?
let evp_pkey = parse_pqdsa_public_key(public_key, self.id)?;

evp_pkey.verify(msg, None, No_EVP_PKEY_CTX_consumer, signature)
}
}
Expand Down
12 changes: 11 additions & 1 deletion aws-lc-rs/src/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,16 @@ impl TestCase {
s.parse::<usize>().unwrap()
}

/// Returns the value of an attribute that is an integer, in decimal
/// notation.
pub fn consume_bool(&mut self, key: &str) -> bool {
let value_str = self
.consume_optional_string(key)
.unwrap_or_else(|| panic!("No attribute named \"{key}\""))
.to_ascii_lowercase();
value_str.starts_with('t') || value_str.starts_with('y')
}

/// Returns the raw value of an attribute, without any unquoting or
/// other interpretation.
pub fn consume_string(&mut self, key: &str) -> String {
Expand All @@ -272,7 +282,7 @@ impl TestCase {
#[macro_export]
#[allow(clippy::module_name_repetitions)]
macro_rules! test_file {
($file_name:expr) => {
($file_name: expr) => {
$crate::test::File {
file_name: $file_name,
contents: include_str!($file_name),
Expand Down
99 changes: 99 additions & 0 deletions aws-lc-rs/tests/data/MLDSA_44_ACVP_keyGen.txt

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions aws-lc-rs/tests/data/MLDSA_44_sigVer.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# KAT from NIST: https://raw.githubusercontent.com/usnistgov/ACVP-Server/refs/heads/master/gen-val/json-files/ML-DSA-sigVer-FIPS204/prompt.json

# tcID 8
PUBLIC = 93CA0270D1CE6A764D068C1C93364CD8F5B6800652A0D5F8979C2726FE7FE46E2C1F6A56568C38C32151DF9E63CB2E4264E45424148CDC35CBB25CC6093DF6B3C7EBF8ED26BB142A6A87E1299BF9D4BD19360E7754E073407A6240A7475D5BAA2AFC8C8E5C54DBB62951ACF01A35186CEF484389878369C36FB6D6A86B310E1B12FC02642BC1920D37FCB8A6C8C86A5118E320528C372DC91DA31DBB445E73B2A5EE4C372C614F5A8EFA8C8B21BAA51F439D0F278A8980C251151888FB64444086285876855695D676A1D1DCEE9CDBA2E8FD8CEEFC633CCCDB9937F532C07F70D9734906FB123E9505FE85B10739F2F2888F28B5AF502D96D662C0AA5E05B0F0C7FD66E790A1564C9EB581D2884C5F944F1E15966045E29E062C2665B3A9C0C09DDE035D2194A4017F3A2670D45F852F58E23881258C2826095DEC23B6AA107D8AE62173E94303BB8027C3CE45BED2640D89383B0668CFD5D66C809592D2A5D563941C029AB12B51D6B1F5E0318BE8988A6689444621D4CD5CEA9BFE245A67821C4B44F82CF750F77AF4EF295458F2998E09A809FB4A2C9E83D351E04A9C3A1816C26CDEE7F798F8B489B45F74FA0C1F6242B8B6E60F8D0B1D1385BFA397B0D07A9636474E666712141FD6FD2EE63BD45FDE2C6C54FB595967204C34C5CB7A443EB156DB540E1EFAADE53234E462FCF8B4A1C0C07331D4B77C07C75775B8D504E87EB98D29E667B7609E97D64083695373BCA61764A97026D980C95D462F4379285771C6FB087D487C44D365D6DC420FE0003244AEAB1A7D4AB729A2CB82A2D6DE2E0DAE68DCDE31E0F453619CA068BE0BC78D2347A2762331ABDA60AEFBB403EF00F1B799A458645647C1A0A867B051EA882BC01276A561102849753B645B1F37D234BA49F8BCC39AE90E0E6B54698333C72106C08B6E1EB202652530062AE088ABC6B9A5839D0F8F81829E5D326AAEE83BE86EC999E1A77AEE31056AA34DAFBE93617D2F436C1239E34BBCB0E61FE74EC745CA72B0563045DD9367BA9CDEB1E1784451FE221021EC5A2EDC48711891686E8CD6B26CC1A496EF0996B0CAC2F7D18549BE8977FB1D6A76427AD279E0208730A7E02110C944E954E303D4E4C1F0DD08A534416AE28AABC1A6CB290FD07C92F5A74E4B3C3AE4EE50AB964EC8894CFFFC876D99A0F6F651F130AD8A4180C85071452091E5E45E005E9074D865DD7258C6067DD7C681EE931CEBEE435550D5E26FC81F0088142E836A5B3B340D7D15070D3FBA1B3611796DB58607AE7B54FA062C6D544699452AD13BADC5FD8B5388BF3E4C308B28A449911D7CF6B423A522B0333E3B96F639D3680289D31F0B0E7AF0F2B07EB5005D4117A14C3C88A0099B7983023027F326B2A1C9AF0C50DE612B7FB9E6EC43976378B741C9075B4D86171B79B3913C751A1557B5AB8E730946EC894092AADF6197F3BAFBF1F75A17E3A38060470DDE59510751C456513683B3CDF572C35E2E7ADAF68DE5064BFEA93042E420F66FF3CF2BA9C30B8DC3D13DBBEF44F7FC4E4B51C898B461304C0E9D2966F7D56972494680788634233B46181EB010340D25B346E20142CB5A6C804FB457AA6584FADD8D2928EB288B280D86A6ABBA6AC13041B3677AFB44A6B293170A9DFF330E31C1835CFA9776F8CA7CC4CECA9D7A28D37ECB2102109D6DBA0564670424B1218719BBCEA0259E70A250F736D5E8EF54778B1EA4FEA6918EEF6EAE9A63455A692105B00505852ACC0E4D6B0C1CAD54B97652AF3D135C0ECE253FFC20E667A60803E8C26AFC584470FC7B73F2E6FEFEDD28B8349726D07238470017968552B6EA4708578FC073A63F09EE7AB8F9
MESSAGE = 47330406AE79F3AF950B00514E0A1E1AD424C32AF59ECAB5AD151844F8B13CF3A328A3923775423F672F3737C0177FD104E4E35BF6340AEAC53B7BF1B85BDECC43C068CDDB22FEB87FB95F008990F12906D19FD67D7FB40BF57FB4362DC2F9C730C0C7B14085A2A3BB61DBAA40006A7A71A8B3B2220E8D0B72A8537EC6B9195A649F01F30A63D2BA83C1E50B8A26B449FE7BEF461D5E6731B4D21512402665A06C65D1F44A69F561EFD110894041DD88BB93A52C5A86C036944B5C00C5C28B944B254C68AF6FDDA3A74ACDDE94FC7D11D3DBD4CBBAB1C6B9CE8064270C9DACBDAFA585BD52B163905F5FDD21408FB7F972699E717F3B39D1E39F1A12FF3C03856B0D6D4BF5F07A714D5406F482AA59E89264630F2218CB1DF17BADCD22B0E4655460CB9978495ED678C08A4A582A4C916C3CC2E4A257E537A7E69553C6F332D79E5E1FCF3BC62555480567084F730386CF74C0558783C4743006609D9FA6DCE0C9D9BE5BB11C052D914A6767CB153E088335FAA2D3FBB15DBAD1EC41F3B79FB06D331E8D7B87BCC917935038E07F451C4853553F564913E76739E26DE61CC0E28247E61132865BD87451ECE6E318969D3FD25DB49922F754445014D75F301B037A3351761D84EEA507EE624E9D57387B10429E01203B16D4BE0495202C63C7D7A08A3D1B94A7E0DDD37DEFB0F7B658D971403A2707BB8DB84FE51DFD62C123F69E5904F531A9BB4B6AA6BCADF365B9DC01F7E24F5A6630A57F6FC54FF24B84902BE215B0925AD1538F948E38600D2714351048E6514ED9B40A974F02FD4BDFF8DE1DBA1A7AEFEC4ADE349E331B3A3CCF71C29BD14363ADE6FC8F9F7EA4AF872EC8A9729DDD98D7D0E18C49FF35D544A916F4B28579A7A251BA98B351BFCED72733D3095FE453C423471479E5B4687EAFE15F4D7CD7BB01D10856F0A1BC1FE45B72FD67B3852508637089407B78AAA8AB396F71A42949259A878E85EDB735AD888FF2905C14B81F520377C5FC56895F8E43A7D769A7744E035A7B6BA5780CDA36869604D838EC5311D91918774D8016F334FEF9926C331E94CBC94967C9F96B1BEE127D6C7C948C3D39439DC60819CDA4E3349FE428C9490302806DC5298D5477DF21911A24F928D3E2215BB5362115388E72F51D704B3C802DA166A4676E5E95F9D3E81D525C16D8520F2F644A76A46925D43388234D4AC73EE4763BD27AE31286A62CDA8A3A0DC2FB186BBB127B64A3DC381F4A81E53C26AE73575F1E12F0BECB42E0AF1A81A1441EB56D5F73F93A9643954DC238AE556655465C2C7E2C786977DFB54D11A8382AFB57F8D64B916C0A9FD68B967C689D808FF25752AC9D9B178BB9F0E004DA6CCF2CC92BD62EE458AC9908C91A43032368C0B9277E7864F4262D27BBA43E061369F1CF9A9FD15D39B771CFB7A0C3C93F475E2FE717445D9FC669FC33689CC97C51A98DE4834A8297A7D16BDC172B5E23619057
CONTEXT = ""
SIGNATURE = 77B338CA663AE35D76DF3900F7E3E0F6302AB06C5B72AFB8566163BF4612C3106AB7D46BC11A13F921E548C5A601324B9BA653864406D0F2CEAF6202F95095B8A48D55EF7C11976A9EFD01B0E74E5CB6B075E1B99039A3AC3ED0D28E494B7BC45612A063003E484DA6B1E456C6CEC9067296FE340D17A4B84C677CB35544D7529083F2E6D8B3449750B09D639646B450BC362ABA7B47DCFF49312BD6357A1C892D354548FB150B64FE688DB9CE2A151A7F6FFB52C931DC1F7D9A0C5A917DC01D63890AC6C10E1E12CB132873D8840191FED88881F3E9A6BDCF321AA2279F511B5AF0D3804CF8CB2383E0CC9B16DEC714668C04F23F391611B19CE2C8592E8FABE99CC7E2F63DC06BA3CDDE4BADF9636A528AD506ED8A1404BB171A9F8EB9ED775A4151C174EED851AE42EA9B4A084B37AF7A7EFFF45367F2567ECDF78CAF8591CB5E7B677769969BFB6E99C9BCDE3C07D5933B228CFA91447E2A311D7325A739739F03724F619DC6703D4986572B71F986F6D6F9FD83B141FAB7BA42753A884EF994B873E2ED27A7B0598FA9025655C1EF3E3B657231A9A0C67BDA4B5184630EF0D1FBBF3C9B437B8803F5ACDA5982556BB2AF932BA24E1E4D2BF463FE1CAB2B3A0B9E85E05D5A2CD105B97C914226E6ED05C6F5C0BC8FDD1B4AA4DFA4F1C6D616C69665BE3F5E1F3D07AF0EB0F809C1BD24E9E5840F59891D023A53279D62BD1C6516FAC1F1F74454D990B735F5739CAEC184973DA840811F96BDE581A70D10D6F765C4774C92CBAA32E62F33FABD61C0655EF0DE937B31631C1C724032822DB82BEC58C98CBDB7E0785854B4F47744558787EA5117B38165A6EA6E136D838F20BF410F92B3621CAFD15E6C796AB69C9CF25F0B6870E58EE95B48873A5BEEBFCACDB75CEC12BC0DCF05D1E1CB5C5D1E9A97C8645638F46C4D34959301181179C66DE3D6FD6ABFBC1DAE3C6FA56D936BB8FDD668309BE84D32CCED9DA179E2279914DB5677895B0FD06EFE858BDFD1A6BB6EDC3E5C84B37F3D2DF0FCA764071EB90F46B3E0DF14049594652807EB8C6444CAB07693F2063BF80515D517EF92D79F4793CB83C26B774095E8CDE0079ACB3C6148FC5492EADD604DBEA553982A2EB3150907578ADB87DAE18C8D722D14A4D9DF637CA4D1A5BFDEEA8C8B72B13A0757659CB05C1F403548239DBC664E40E03B79EC3FE6DB84FB65EC7CF309140A671C0B48EA55FDDD3B4C6C2A4D5076957CB6395EBC98EE71FDE16C8A02922A45E9E2D200F7250F1AA6169C8CB487A6A7AF0ED7AAAC1834C1DC91F9F31C1A81914C1C746151C051C0A95D3670B9A309CDAE064EB39CC59EA3FF6C1B0B914D08D0F42F8A20CBE792F188373E97E6EDF0F277722B57C24FC19A47AFFF1DC6A106B98EA20CCB6D1AF098FCC8F9F2A149E7099DB866A6A7DDF4E1FBF89718D40A10EDECFA8A366BD499CFDAE492140231EA2931BFD83B95545CB04C32E7A99C67E8AEC5F6AD4889F439671BCB504C46F43766497AB0BC17F69176CC5926766492180A0A9BA3A2F94F76477442CA5D096F5289458E3A1253B5B057AC73D95E66EEB18B5821A5B9DF760218057F9155EB255067C1113F177B5FA0A11218E76BBE9A4D0A4032DC52906FF93E993ECDC0FC39791B439CA9E620F5F3783EC07602443558CA95EFA85A228A4675FABF2931B62C8CA2F4A93B98082C99620DFFFDAA4C64D6DA98CDFBA34398904CA85E5136E33BC51148B0C9785EB3371D258AEA13FDF30CE39EFE4317091D1C421320A8FB9799D6B9F5C70C6A2A9D2A1C37A013771CC26AD6991ED2AED3FEF91B8BCE3C9F2D0ACBF72BB448404E13BF568E44D04F92B52A9A845AA409C663624AB781D5BF30829B9E6D4299A1C9D666F32D775876FA7E5E7D7198536E974A29C52B2DDB53C9E9347D91CB702300166DE676B4BF5F233660FCA8D968AE39059D977A329DAC98A56C53BD0BCD422607D8EB3B002C26A4FC8B1B286512127F83514A4740A7EB982559D5234D58FA1E6D9923CE83CF5C4E339C0251ECFBFC83520A1089D398607B4C79A17126E8430419304AD134D5CCDBACB39CAF426AAB981B0A50A679176E4ED66163429D72E99366C0C36BA7EB35B12E07B1F87CEB7DDCE91E0FBBBE317DCBB8C5B4E2064943C7457814FB657CD429598B5F153FD75CD76004CDFC8EDC9D43C793B51CF66780D6F96579AED5213A7DDBA49747E9C9777AABF3DD9E78C6C5EC03192C04E2687C2E7D322CE30282FB9B21F2BD18DF05E37770451A73D1A3A172FC0CB7815F492BD5CD9816BDD108CF780AD41E2BC60FCB37F2D6A931AC7EF230C5EF6209AFCA70EA73AE732264C2A09F662DBE5232D2FE5CE3D549D1DD7DE33973E16685A01A65A96CE046BC2CF5EDBEA7676B0222309F7EA1DE0B80A79631B94BF26BB67FBEABB7816888F54EB01394F1A701F55200F9D505E66C7644EF449005516064970CE6CF041057E6FDA14B9B7B66B9711D6DAF47616FC72B209CB1C8DA57742E7C3071768ACAB4F60B4F46E91B8957E8369D9C2D23D3F71EE39B8824249B51EDFD0C6412D32B6B8A7FA592C6A4635DACB09E79CB3267B2681F4C94C552817281BC9EE10F640D752BF87DD0884BF60DC8FFF640270B2A6DAFFEC51BC2B3A1541F3F5FB4AEB83B6BE23AE28CCF279A644E95845419AB3399F66A0A05A7E800CD168374015F181F66497A36A7F7DD05365853E49ED44D450C7B02A698310789EF4089084A0FD1A83F3301F555AC834FE2C9FB35902B5184257C7533BC661C6555E9ABB04547A2E5EA67E40D15E2EC85C7BCE8520876F02D9748BC4104B05AAD9CCD939AF3923699DA6DBAFF4E12513446FB9A59577FAAB57D644E40A97887094C50329749267367A32EB229676090D43E5F14577DA153EF215B1CA487E1904BAE01B2FFC96073F030AFBF0CBACE9C731FE8879A6352E77B463254ECF036B28A6B45B952C731BBCBCFB33FE9BFDE742E05452C5A4C764F85C3C278C19D797AD828A036A7BC1ADE6D2EB5DEB7AD3A024BA45EDE2585A433FB04C76932018A9A989F2FCDAED73584C8F7AA0B6D0CD6C9A405347DC1F9DA38800273634CCF548455E6F6C7D6957948BB97E85FE15EA6BA4A4B83E6E065C60AED49CE0734EB57E5BBE1D24108AA4E2220CBB3A3EDB73FAB3CE6295D7A347E00A1AEBBF03D4134C118434F71A5847AA8E103ECA804DD7D2FD7A999F513B027246E567D27284CFF0025C9111146E09604A041970A0D7E914FF73D62BCA2AF61380CD4C6D54F65AC1522BFF06427FBC6F3F79EB21F22519EF9C3E7FA013B59638DA0A2AEAFEFF302050D15171F204E5E85AABEC7DEE0E3E4060A1D2B333D7F878BA3AFB3BFD5E0E9EEF501303E5152699FA7B4B9C1DEE5E9EC000000000000000000000000000000000000000B1C2E3D
RESULT = True
Loading

0 comments on commit 1f41137

Please sign in to comment.