2024-01-22 00:15:52 +00:00
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests {
|
|
|
|
|
extern crate alloc;
|
|
|
|
|
use hex::decode;
|
|
|
|
|
|
|
|
|
|
use alloc::vec::Vec;
|
|
|
|
|
//use rand::{Rng, SeedableRng};
|
|
|
|
|
use rand_core::{CryptoRng, RngCore};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct TestRng {
|
|
|
|
|
data: Vec<Vec<u8>>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl RngCore for TestRng {
|
|
|
|
|
fn next_u32(&mut self) -> u32 { unimplemented!() }
|
|
|
|
|
|
|
|
|
|
fn next_u64(&mut self) -> u64 { unimplemented!() }
|
|
|
|
|
|
|
|
|
|
fn fill_bytes(&mut self, out: &mut [u8]) {
|
|
|
|
|
let x = self.data.pop().expect("TestRng problem");
|
|
|
|
|
out.copy_from_slice(&x)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn try_fill_bytes(&mut self, out: &mut [u8]) -> Result<(), rand_core::Error> {
|
|
|
|
|
self.fill_bytes(out);
|
|
|
|
|
Ok(()) // panic on probs is OK
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl CryptoRng for TestRng {}
|
|
|
|
|
|
|
|
|
|
impl TestRng {
|
|
|
|
|
fn new() -> Self { TestRng { data: Vec::new() } }
|
|
|
|
|
|
|
|
|
|
fn push(&mut self, new_data: &[u8]) {
|
|
|
|
|
let x = new_data.to_vec();
|
|
|
|
|
self.data.push(x);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-01-31 00:57:53 +00:00
|
|
|
use crate::slh_dsa_shake_128s::{slh_keygen_with_rng, slh_sign_with_rng, slh_verify};
|
2024-01-22 00:15:52 +00:00
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn vector_debug() {
|
2024-01-25 21:17:18 +00:00
|
|
|
let m =
|
|
|
|
|
decode("d81c4d8d734fcbfbeade3d3f8a039faa2a2c9957e835ad55b22e75bf57bb556ac8").unwrap();
|
2024-01-22 00:15:52 +00:00
|
|
|
let mut rnd = TestRng::new();
|
|
|
|
|
let sk_seed = "7c9935a0b07694aa0c6d10e4db6b1add";
|
|
|
|
|
let sk_prf = "2fd81a25ccb148032dcd739936737f2d";
|
|
|
|
|
let pk_seed = "b505d7cfad1b497499323c8686325e47";
|
|
|
|
|
let opt_rand = "33b3c07507e4201748494d832b6ee2a6";
|
|
|
|
|
rnd.push(&decode(opt_rand).unwrap());
|
|
|
|
|
rnd.push(&decode(pk_seed).unwrap());
|
|
|
|
|
rnd.push(&decode(sk_prf).unwrap());
|
|
|
|
|
rnd.push(&decode(sk_seed).unwrap());
|
|
|
|
|
|
2024-01-25 21:17:18 +00:00
|
|
|
let (sk, pk) = slh_keygen_with_rng(&mut rnd).unwrap();
|
2024-01-27 20:43:14 +00:00
|
|
|
assert_eq!(
|
|
|
|
|
*decode("ac524902fc81f5032bc27b17d9261ebd").unwrap(),
|
|
|
|
|
*sk.pk_root,
|
|
|
|
|
"pk_root failed!!!!!!"
|
|
|
|
|
);
|
2024-01-26 02:55:05 +00:00
|
|
|
|
|
|
|
|
let sig_act = slh_sign_with_rng(&mut rnd, &m, &sk, true).unwrap();
|
2024-01-25 02:42:54 +00:00
|
|
|
let sig_exp = decode("07eb19e7d838d71ef66b8263b5d1f8ec43f8eb75d58b652f779c5a0f5378709eff39c179556ee3871600fa606ff751dcccce5e7a6981fbb8a0e959afff26ea6aef4fef5ccb66728f9d119ca2a547f0af0d3509364c7e3c9981e930c8c77ac74b8f385979dc8582063eac5b2a2532c8eb97fe1bea498bdb8b6496fcd3c5931393ac17cf96ccb35aaa9c7491b1a9897ccfbf35b70fec94687aad4e06c1b8d3aea67554d470804eec25309bf34c6487aea92b1d49edfc7afcb31d78ad4be8c1e4403b634d2db503b8cd08270dc3579aa8d639c33d024d3bebb9d401424b009793dd87053e5e0d0538b90a7a5324e5f08a8ab13de4dc1ed0b9848b421f40e5cd1ab70f07f652f3df23853c1d44ff0da5dac93d0fdd2007a1100b3c4abc9779e0fae578653d3848b520e96300cabce717b11dc1257f6c0c54add4fef22be57a67c45b288997b8f496f6fb3cde4a4cbb646b6cd922c7cb04c0bc2dd1bddca39a6154c10a07a1110c23df6b89dfd65c4107371cb98a352f88ce579bf49cda3c7062f9744594b9e431391e85622b13a6356a8fc1900f29dfd0d2a408aa2f15958707a14948294194cc3d51d26ca81dd64fa8a119d156e83ac0b1350ee98ef246e04b85edcf6567f917f4aa1e379244465145f9965a4f7a56fb14a949a0bcd08550a2de294f74ce74bf178dcf521a27d2ef642aeb05b38f835b7cd0e4ad4f2279c46c50378c06d4829ada543cac46a56fdd681dd4f473d792250cfece0fa98fecf1735caf37ec75b00a6212cfd31f57550c89e7acf2cdb257e5c021d1d465b7663b0b64d0e47b38460fcc28b1cf9e40ec44d420fa5677043ad647eb5c80b58ba88fc55e1c5c394a0f7e592a0edcb1dcf6ccfc5f1b25b30ca191e8c31232a39b0563d5b7dc2ad42582b58efbf84cb34d4572a8146ef8da7dace23229a732a901f15c7cb1a36aaa82838d6f554e49f2f18b9b73f7ef1fcc325bb31e668167c74777e0606806d81420df2dedcd56538d5d1386f2122b71e894e348820594869b84455d9a195061dfe1fc2795acb7103f25522caa538420af67dd03859480e0d046c8f175038d78d603af58176a1ab26f560ec78a8f2e45f4fa9da71f2e99c9ce038e5d95b07e8dfad89b8c6b1fb990b081bda6e848d8ce5577f852481396175cfcab40fc296e71996ec4a5c6d52a8a237bdcdc2b57680e9379deed17f929e774bf90906de5c3941a212801dd09e58a013a08a8903a0aabaa90118250370b3318db6b17f586b961a2a98678cf54ca6c422dfe32767c99ad4e12a28a3b36e85bc299f0881a5ff4d2e0efea327656f67851fdd95fd8b9d1bd941345b7ab065f78a8c342a5184ef6150f304e7d7b806de025d5c571831ad4537db35033b0121effeccdb100ecaa9805dc90e965995b39748c645e644331fee496956b6a1fb7a6029eafbae80be5e68c5aa66b369c9e9d7c96c77d32592c6696e3368ccae005a479492d400c926df2b809dcf1c49e77877792ef9c9c1cef36e679e9bfc01a67c92f093cd8ee4ec44fbc0318988014650f4d158edc630443cfde99d674f9763f20c60ea3657a2ea53af1fc2a3e7ea723e546eecfdf3be0309f5a773c228c168fdbcc97325cab9c9137322736a606935f6aa74a10d0f5bc6a83aed3fd2cd94621fbafef01bb3e601222522a9c9f6d4ceae117a2d53d2bd774eaa5948a1fa9a83b871bf763ba4787117ec0e7d62cd587edaae53427fd56e7dd25c9525886ef401a05bb58d3647e305314ba9a2c1c10a394b6cc7ce983fd11f79f6c05a624e16699be007cc57cabfb972a1b1988c1e47b4394fe4a404d0aa641b4281aa98ee047d22466c09f3a0dbf7ec6e51bfcfbe6380a23b81e6062300710423b44e88f8967f4f88e559486f7ef84726c501224c4a9faebce33e188bf9a72edee1326438f23620eaad0ab0ce53a87e8b410f243511eb3ef87c9f7af983c4b0d6e6b2a1a1407ac10c1305cda22d6dd0bbc470fd61c2e4a38c4244dd2a7ceb9d347d8d8f58906cc5b1c5934c973b048fa97a49c39a401c452a92ae8c826781b3edb77416625213e826aa6bbb131dda303cf63cd4f6f200056d13e69be148be51eaee8d059fc47f7ffeb24796a79007c0b83b75be70eeb65f46fc51c071f4ef7bc24d71374cd7955c88bc28f4ee285b6823a45abc8b157c3275c49a925d7ad45183b4f09687a8002e54635f8294768f711a47499234b7a57c5a311534920f12c284ed21522b25ca7890610aaac91666ac54bab87c3f3a566d31f1a66689d6036e968ab30c162da446ebc7cfaa9eb9bf22a8652926e7334265897b2af934d8c2bc261b4d86aaffcce72d7514326052f8c4120868be79b05c9a8f3068a5ee4e5d82b5d3d7afd3d03490caa9a3d75084e2906dc039e72837e85768d7c034b17d26eac57a86f5a3f000dfb783089d14532048eab5bfcb65f1e21af9869254f3a0873a8cb1d94c4a4849972e0d1013d3918631830473529bf392c35948e7fd8b5f60dbc03c168d3d5e5d4f074910ae674740c37be037d84d4390708aaaff47a64ad23ffeda22b8eb0006d9ab9eaa629a07899c6d9f79615a4c6c05cd2639dc87d53f60bb78e0c246766a1de332ca6f6f9b0dcaf58d3fa82149d2e244721f5c47fa6734a01071ab23a871ebeb676a16151402223cda2901338c17d5b0c59139ba82403709bce2ee6cb5b8a419a74ca8046b9da98a10efa6fa5726e235ec329938f4f36e0b3310ed946cce3f2f05a23bf7b203ad82057d8ab2dd6e6f9614187fe90ae1397a927bad5bdea19768da4e1277fdbc2465b73fd0f224a94ed00a765268b081288d14342a0e303e106bf460c247ba3bfb806da76264b8c0b0364e81da052ea399bf
|
2024-01-26 02:55:05 +00:00
|
|
|
assert_eq!(sig_act, *sig_exp);
|
2024-01-22 00:15:52 +00:00
|
|
|
|
2024-01-26 02:55:05 +00:00
|
|
|
let result = slh_verify(&m, &sig_act, &pk);
|
2024-01-22 00:15:52 +00:00
|
|
|
assert_eq!(result, true, "Signature did not verify!");
|
|
|
|
|
}
|
|
|
|
|
}
|