fips205-source/tests/py_vectors.rs

315 lines
624 KiB
Rust
Raw Normal View History

2024-02-09 23:43:59 +00:00
use fips205::traits::{KeyGen, Signer, Verifier};
use hex::decode;
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);
}
}
#[test]
fn vector_slh_dsa_shake_128s() {
use fips205::slh_dsa_shake_128s::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
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());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("07EB19E7D838D71EF66B8263B5D1F8EC43F8EB75D58B652F779C5A0F5378709EFF39C179556EE3871600FA606FF751DCCCCE5E7A6981FBB8A0E959AFFF26EA6AEF4FEF5CCB66728F9D119CA2A547F0AF0D3509364C7E3C9981E930C8C77AC74B8F385979DC8582063EAC5B2A2532C8EB97FE1BEA498BDB8B6496FCD3C5931393AC17CF96CCB35AAA9C7491B1A9897CCFBF35B70FEC94687AAD4E06C1B8D3AEA67554D470804EEC25309BF34C6487AEA92B1D49EDFC7AFCB31D78AD4BE8C1E4403B634D2DB503B8CD08270DC3579AA8D639C33D024D3BEBB9D401424B009793DD87053E5E0D0538B90A7A5324E5F08A8AB13DE4DC1ED0B9848B421F40E5CD1AB70F07F652F3DF23853C1D44FF0DA5DAC93D0FDD2007A1100B3C4ABC9779E0FAE578653D3848B520E96300CABCE717B11DC1257F6C0C54ADD4FEF22BE57A67C45B288997B8F496F6FB3CDE4A4CBB646B6CD922C7CB04C0BC2DD1BDDCA39A6154C10A07A1110C23DF6B89DFD65C4107371CB98A352F88CE579BF49CDA3C7062F9744594B9E431391E85622B13A6356A8FC1900F29DFD0D2A408AA2F15958707A14948294194CC3D51D26CA81DD64FA8A119D156E83AC0B1350EE98EF246E04B85EDCF6567F917F4AA1E379244465145F9965A4F7A56FB14A949A0BCD08550A2DE294F74CE74BF178DCF521A27D2EF642AEB05B38F835B7CD0E4AD4F2279C46C50378C06D4829ADA543CAC46A56FDD681DD4F473D792250CFECE0FA98FECF1735CAF37EC75B00A6212CFD31F57550C89E7ACF2CDB257E5C021D1D465B7663B0B64D0E47B38460FCC28B1CF9E40EC44D420FA5677043AD647EB5C80B58BA88FC55E1C5C394A0F7E592A0EDCB1DCF6CCFC5F1B25B30CA191E8C31232A39B0563D5B7DC2AD42582B58EFBF84CB34D4572A8146EF8DA7DACE23229A732A901F15C7CB1A36AAA82838D6F554E49F2F18B9B73F7EF1FCC325BB31E668167C74777E0606806D81420DF2DEDCD56538D5D1386F2122B71E894E348820594869B84455D9A195061DFE1FC2795ACB7103F25522CAA538420AF67DD03859480E0D046C8F175038D78D603AF58176A1AB26F560EC78A8F2E45F4FA9DA71F2E99C9CE038E5D95B07E8DFAD89B8C6B1FB990B081BDA6E848D8CE5577F852481396175CFCAB40FC296E71996EC4A5C6D52A8A237BDCDC2B57680E9379DEED17F929E774BF90906DE5C3941A212801DD09E58A013A08A8903A0AABAA90118250370B3318DB6B17F586B961A2A98678CF54CA6C422DFE32767C99AD4E12A28A3B36E85BC299F0881A5FF4D2E0EFEA327656F67851FDD95FD8B9D1BD941345B7AB065F78A8C342A5184EF6150F304E7D7B806DE025D5C571831AD4537DB35033B0121EFFECCDB100ECAA9805DC90E965995B39748C645E644331FEE496956B6A1FB7A6029EAFBAE80BE5E68C5AA66B369C9E9D7C96C77D32592C6696E3368CCAE005A479492D400C926DF2B809DCF1C49E77877792EF9C9C1CEF36E679E9BFC01A67C92F093CD8EE4EC44FBC0318988014650F4D158EDC630443CFDE99D674F9763F20C60EA3657A2EA53AF1FC2A3E7EA723E546EECFDF3BE0309F5A773C228C168FDBCC97325CAB9C9137322736A606935F6AA74A10D0F5BC6A83AED3FD2CD94621FBAFEF01BB3E601222522A9C9F6D4CEAE117A2D53D2BD774EAA5948A1FA9A83B871BF763BA4787117EC0E7D62CD587EDAAE53427FD56E7DD25C9525886EF401A05BB58D3647E305314BA9A2C1C10A394B6CC7CE983FD11F79F6C05A624E16699BE007CC57CABFB972A1B1988C1E47B4394FE4A404D0AA641B4281AA98EE047D22466C09F3A0DBF7EC6E51BFCFBE6380A23B81E6062300710423B44E88F8967F4F88E559486F7EF84726C501224C4A9FAEBCE33E188BF9A72EDEE1326438F23620EAAD0AB0CE53A87E8B410F243511EB3EF87C9F7AF983C4B0D6E6B2A1A1407AC10C1305CDA22D6DD0BBC470FD61C2E4A38C4244DD2A7CEB9D347D8D8F58906CC5B1C5934C973B048FA97A49C39A401C452A92AE8C826781B3EDB77416625213E826AA6BBB131DDA303CF63CD4F6F200056D13E69BE148BE51EAEE8D059FC47F7FFEB24796A79007C0B83B75BE70EEB65F46FC51C071F4EF7BC24D71374CD7955C88BC28F4EE285B6823A45ABC8B157C3275C49A925D7AD45183B4F09687A8002E54635F8294768F711A47499234B7A57C5A311534920F12C284ED21522B25CA7890610AAAC91666AC54BAB87C3F3A566D31F1A66689D6036E968AB30C162DA446EBC7CFAA9EB9BF22A8652926E7334265897B2AF934D8C2BC261B4D86AAFFCCE72D7514326052F8C4120868BE79B05C9A8F3068A5EE4E5D82B5D3D7AFD3D03490CAA9A3D75084E2906DC039E72837E85768D7C034B17D26EAC57A86F5A3F000DFB783089D14532048EAB5BFCB65F1E21AF9869254F3A0873A8CB1D94C4A4849972E0D1013D3918631830473529BF392C35948E7FD8B5F60DBC03C168D3D5E5D4F074910AE674740C37BE037D84D4390708AAAFF47A64AD23FFEDA22B8EB0006D9AB9EAA629A07899C6D9F79615A4C6C05CD2639DC87D53F60BB78E0C246766A1DE332CA6F6F9B0DCAF58D3FA82149D2E244721F5C47FA6734A01071AB23A871EBEB676A16151402223CDA2901338C17D5B0C59139BA82403709BCE2EE6CB5B8A419A74CA8046B9DA98A10EFA6FA5726E235EC329938F4F36E0B3310ED946CCE3F2F05A23BF7B203AD82057D8AB2DD6E6F9614187FE90AE1397A927BAD5BDEA19768DA4E1277FDBC2465B73FD0F224A94ED00A765268B081288D14342A0E303E106BF460C247BA3BFB806DA76264B8C0B0364E81DA052EA399BFA331
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:22:35 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_shake_128f() {
use fips205::slh_dsa_shake_128f::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
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());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("07EB19E7D838D71EF66B8263B5D1F8EC50527F9F9C94098E82F178619256721F46F852DD5F90AE0D445B9A61D4057C29828429AF7330E1C1B6F9ABC2421CA42EFE90FD8E66944D635146D6974B2CA7F7E47F820498DB143285161011030E72894C57C26D6EB552CB549098669D3AD21964C8D1096237BCDAEF80246F3D970AD70E7AECF5823717CC7BBF315834189A91BEC5897E66B76206A60E08D411722C43C4EC9A530838FEDEB71F69CDE446CF491D0C111347484C3CDFDB2A2F6F4A1815B3A83F26B959A2722D18445EFC8C74BBB55287A2DA98102D05DE0B1CF7F32789CAE0BC71222B36B33FCBB67299F013F55DBFD8D69146A90950A26659C21E0A2D0F0B29AAF63065BAAE7FA9D8EE9086A3A1221580F45DBE8EAB7AE118CDB9BB9E34586F1E0261B6E6BBBDE6093D26974A67B215306113893C7E3A7AA03B0C42DB326C26A98B58D37A1562D3FF7D875BF8E6AE69A0E93EA70F3F9FA76353861AEF60B83BCB4C38F59FDDCB90B080D634CFE65F3467FE8114711F0F90C44D5A9155ADE6517DE638D2FEDFCEE7D2629770DF45CA3A7CC23227EE71C8A3DCFA293FA1C1B7419704705EABCF617539F8A51B7CA8BA895C49588D49A164568462031B72D5F3A267BC32AA90A741D2447905B478C5201C57F620FD7D1035E6438F0BCB04A31AFC4B63B18DF643261C3E872C5C244AA0C458F36CBAA61F1F577C64C9BB237C4BBA17AE514EB291C51805E2220541C34AE862842817CA7DB96DAF5994A36C1592259961ECD5DECCF4DD8AC8CCD16031836A58D9BA0571707C5A246BE1DBD785D820A8281771CC09FA3FF817A436FF27208CA5AA0DF8AC1B04115B844F5346E2EE6E112AFF037AAC7568D525FF994F02470C7DA004A8783B18123C46D28B0975BDA1580504C936ACC91AE1863A6147A29945A1771141819EEB45F936171F1403D2057E5B7C813CC84EEE72F7DE7397CE44FAF04900D31F914F65064C43D18551337466467261903D820EE9758283912B91E4D2ABB2728CFFCBF711B88EE81EC3A67785CCA5EAE1CC4CC51890F20DA33611A5E1BA5DD933E5D48CF1C61F43A1C1A922BECD1190853D09AA60FBC666A1C1F6F59276F905924D0869CE9C603E5094FFF320058138D671D2390A9F451DC300F055CFC8D0E49BBFAE57A83AB56E31016229C51AC636BBD7ABB24F9EF3816A0E41D06C18294E5083153AF99EBDB0A40A0CF18AD235BFC6CDE3F654DBE3CD049350197BF655EF0809A8AA48453B5990BA85A47129C8D9F5F976197A6B4A5B4150253DBD3303A4FE99EAC7EBDDFEB01FEEDC000F5F6C228BC6DCF1DD728F0B36E2D911816EC3A739405B509730581C068114F195C4309471F7A951849E35F2D136807861FFAFFBB789E3BC180C25798D5E8D74EC8A8ACE28256F3196B5ACE54324EBCBE3C443469BB04215886E3810A0799F6F4BDB2BB3927454860107FE5D695258ADD2D8D2E970E673CBA6AAC861DA64CA2F414FC1844601ECC2C088F820DD0436D956CDB54E13B7E730E158670004014BE3839AF474E4DEF8968C43CBCE57B110595D6981F16A59EB3118848E8F8BB853349E8FE54D893A99EC21AD57B0EE61DEAD270B796C5ED92287FDA29FCE87E8CBC21E90D5F185B7BA5A4215782F39725F7B7960212256F096BDAB0B51821937F7373FD79A0408EE9EC2C0FE5DA116C36382AC6D1E7FC67F50C9CEBC5DE88B69843158AB98467FA94BBBB33B2FD21763C3160DF8FF266598EB334B5BF1B996013823BB01E6491084DF9704303411F0DCC69B645FBA15286A030F9A8079D2048EDB6C7D4FEE6DCCBE462FDC6612F548A490D1A57D1B54BC57D7FA5A8E527B131CB9A7FC622821F916AEE1126A015BF36D1447836A173C8D914F1ECAE343F7189048C360D624D4C234B59E9E4DFD73895E0A822313AD489E0B4F44CBDAA17CE023C98E15294DDE977B8ED6D8AC423EAD263083E731D354CB7536CBCE4C95BFA049D82F640C1FD6E9A1A8AD6749BD2B927527E9A7BF159AF084D8B7932365CAB8A60038DA176909A9992C259F9F03E813624B6812B669E70C9382C5A75CB8E6D413FE904CBE1393A93820BDE103CFDE46E676015801ECEFEAA07E6D10FB9D9EABE59A31890F217F6A35352040FDC91D78CE95F9DECF5E1D44F0E35C7BEB4481CA3BBE08328B5967376DCF9605ED28B004AE99C9A77B6F028F79A61C00E8514A6E9C998BFA4046DE5FC0448FA7D90BC0538A44CC9CCCADE0EFEF32EFCB8C6A2BD2A41D0777274123CCC9F5B29CD4B20347A0E0B3A57EB7FDBA04794817C96C1D977E42D3E5F5EB0DB2F049917E5E6E69D0E14489D38F3C9D75814A7CD204A42CE97DE623EFD4AA70DA2ED266FC5079995F2F4EC442C520B712D9DE5824D8DE7C57630664BDC72F98E12DADCAFC57C8000B8AF83C6064CCAC43744F7862242C57C4DEA10E2FA738E40B13497532334A61B6D17525AFC262D1442C71ECB2925B5EF5D5B412396CFBE865B5937D758F4BE86F363CFB288136623977675CBD5A3C831366C88525D967714C10D99BD3CBE400D4B325471AC775A4C66298671A0FCFA0D84EFC995C3EC8349742428728D09A83C72745938F7A8680010F518B2E8215FB229B01C512903DF4528B897A5270343993A98A529F8CAB1E8582D44403A9DCB81458CD367E140F06E05563EEB649E3E98338A8F2D5D9DB9F0B7C569606F70D7539108B282069E1E9C03F01F62387B721907BC7E4941009F5917E7B46D6D7E96C6BC439A3FA8DB5CE5FF3D6200A3BB1EDEDDA12008CE329E757E2C9E6625DA8B8A9326E2F37E61F834179C080A2D9A030D41BFC3F84612E046FA3A6ADD79A9E53F62D46DA6899C8B2EC2DFCBACD18E53EB34AD97
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:22:35 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_shake_192s() {
use fips205::slh_dsa_shake_192s::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
let mut rnd = TestRng::new();
let sk_seed = "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB14803";
let sk_prf = "2DCD739936737F2DB505D7CFAD1B497499323C8686325E47";
let pk_seed = "92F267AAFA3F87CA60D01CB54F29202A3E784CCB7EBCDCFD";
let opt_rand = "8BF0F459F0FB3EA8D32764C259AE631178976BAF3683D333";
rnd.push(&decode(opt_rand).unwrap());
rnd.push(&decode(pk_seed).unwrap());
rnd.push(&decode(sk_prf).unwrap());
rnd.push(&decode(sk_seed).unwrap());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("A2C90186931A040BE4287A1A40706E5FC0C81FD93193D695772EDE7CC10D83086E93529B411394765E77F636F6A2EE7AFCECE43A726293C4B94916E891A8B7E95963E7C1533391068CEFE64F9FE391CF835FCB583851B9A8C444121C6909ED1CAE7B769F73FF40BB5FB48156385D6E396219570B6D39E91491E8866FF33E7B03CBC84B3AA1EA311FE7EFEF79CD4E43F10212F41282799E570D1385115D43DD774FD48C5913B11A261805D53E5330C2D0919DD2A734050D2116F93989509796CC153251E6F8A0F1244EA2B61F0105D0BBAAA850CE3F46DD8ED4DA07DE7066780F189A32D1EA749D0CD69900624140DC83A69DE6B8AEF8134C050D02C5A866FA6B09FDBF71E9F2E7549A76105A5B3071EDE8ED725764D5E036201A544295DD36C411D71A1860262BB3ADB7AA4A2F4319D42297C5A79C5FE61044AF0C2D4CB027D819134D8347A2BB55B3099DE0E65C99FCAA9803D779193D6A01CCEBDCB713EFA1DEE52B634CE13A5E50247ACE1898A2B0F250D37F551D87D3F24191E1F3832A3D7E8957179E06DEF23C661B75EEAF5F5F45218825841D97E26AD11E123631AD8136BA5F0B052108901F97BA4692B053978A1647397E3AE9B9ED666A33D1C0CF00C0223CB8E8FB1E3BA4D1A3EBF393E4C13B0C83CFEAE4E42E21C2E1EAD8CEE4C63D5DA07CFB915762F6653590AAE36F5816C4153F67BC489FE276259D5994D0E3E974B298D4A338F030515AC8609B4EAC1ECB25302F2813003A9CEB736F09425B3789D9203D3514F1614038AB7E342A590AD8F70357F19B8D976029DACACF907ADB402802C6516DC7AFB3E1F02CB85822EBB1ADF9D00396C92B4D6118BB0A20B2CFFBA0CAA9D47004200ED5F6C1FD6B92DCFAF56EEAD46016D15074B69410DDCCC044268296C50C977D73D56EE662964BFD6533BA877F857E91466CECA313303204A54F034224E871989E73160A53E245E5D4EEAFA0DC5CE37449627B8A981C4BF91F254DFD79228A706CB1A900BAA10B6DFF26B46BBF42B735BB989C370BDE4A7BD18DE4C09D021CA99BCF1C6B0D55AF5CF7D162AFD24FB3978CBEA372F094889647C62455AD6ABFBF2E421675B067E9449E3238513C07B50E1CDAB1769C3DCAA52733824FC02A480D7215B0C0B9EFF5E6D89C7FD49B0779759102DF96C9E77105B6FB0D8374A88F60DC3BE039655E683B8DDA65FDA4643D8D6D96EC9D45BB673D66B476ECFA53C44200E645351DC25B33019DB6ED75D11B96ABD6F5B6E9B70A032123E1F15E87C45D5F13E0C066015C128BEF43CCEE114971B5B2964761A334FA95BB9635A27722AD3AB4A32E36A1A710267A0DABA907F1E6B90F2BB351AACCC54FFCCAAD5C05F566773FE30DA66F354AC3A52EAB49E68EB4273366898CC35E2A99D2EE76F5F6B0BB0C22D9F52A0431D64CC0521BAA6B616208C78A27BF1B24EAB107C9595DF681EAE0A5F550938846A2A2AB29FDC2FD2E63025537708487695E254A2B6A93FB7BF7769AFD2924A6D59C45F23F934860CAEA0E69F60471B3DF3FBC3C633338C3D162E4D6A40539CAF8ACA9898A4ABCAADC7FF70E4343AFD094ED26F1686F2F52AE5132E74E6D6B1773C04EC0B60F1EA850B15F215E11ECEE561FDE2ABC83D19F73562ECD7D4951C97E798776F34A39085DE024DD8EB691D3410F923ABB5DC4DCBFC0078692D7BBFB878A727275634F8F65C4345DD919D17DF227FF197FF91E34789A4BA65FE866B6813762E5701090E358BA70C224046338064C4968B294B9967B03CA325F210B042B7B532FE7CF9000F7F4E8E34197FEA5BCAF8F2C7EE125B6B13726747475A976DDFE2C8834A8BB27B3395035C2F33A8066E0AF960319817165C4DBFDEBB2010BB6B662E6B02C795F6C5FAD765F223B06A828B9AEBD113547921F1F222B853C0C0AAD948AC07ECECA82F76095A9983EFC09944BB5B50DAB3DCA0E5BA82F372845A3844E21F3A1DA7E92ED9DA1AE088C4036A81256AD943300CD2F141D638FF32C4C7EB76F04429985992844FA6AF91D60F514FC2AF4A89978680F8C9B0567FCB6352AC1E43774A650A6445A888F8A6979AC2AFE37F5CFA05B1D464F9B7EB1E5F6F3D0CB8130F396B1CE91BBABF6F02310EC7F6CA3DE49440F6ABCC00275C5894172AA6249D64129CA7075A9DE0935B204187417A556394C8070101C4FF5908F94D1AA8957534A4A9293401269745EA45332312D746017DD1A5845301ED0FBFAE63436F93F898A7E2BA2F57CA8F49499768C39F6B65B3AF42CF7E33207245207A9B3AF99076EAC160E7D38EEDE7B7FFA66BCC27AFD1EEF41DA86AF4A55FCBFA47A2CF239D8E5ED557B2BF5226FBBB25B28B059AF44FE91AAE0312FD0A32732C2E8F49AEB07F3786088BE458AB82EA667A3961FD6105A13E5437444EADDCBDD5EEEBD168384085B307CCAEF9A3FDDCE28451575EE85E11638C84B282C4D7223203D627684E3C85ACBB668F7B4B9B63DE2A96495621F43E2E16150F9D860CF6DDA0BF4BE9ACAD6F864F8BF9E59092D232A9BC66F2A51B2D09B4CB1A8B7CAB4E2CAE495B250D424A2B8419238F8C7A708C9CF00A9F60C65CC0D8CD321A74AE84C9C6D8755DC33242ED8282E762141CBFFB67F4E641DF4B7EBD4ED2F2846BD2B70D75C4BFFB3BA3A96672A28B16E31C6D75C7AEC7A722750DB78E797FAFFB62E2703B5D9750073286B9B35B02A6C3D8C531DA2AB18E94FF4B65BABBE48DD4D69B3B74DDE7E218420DFB15B6AD33AF2A2E419533A0A5534CEA81A819AA916D549CF1D3FC4A158E58F4ED7EED50F0AAE2C68BF3F64B9295BB8AE4B7001FB6E8BA84DB4C2CED2C5AA92EBD6C4FCBC8079369BA56720B6BD36083C67947D260AFF4962825B9551D32
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:32:05 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_shake_192f() {
use fips205::slh_dsa_shake_192f::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
let mut rnd = TestRng::new();
let sk_seed = "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB14803";
let sk_prf = "2DCD739936737F2DB505D7CFAD1B497499323C8686325E47";
let pk_seed = "92F267AAFA3F87CA60D01CB54F29202A3E784CCB7EBCDCFD";
let opt_rand = "8BF0F459F0FB3EA8D32764C259AE631178976BAF3683D333";
rnd.push(&decode(opt_rand).unwrap());
rnd.push(&decode(pk_seed).unwrap());
rnd.push(&decode(sk_prf).unwrap());
rnd.push(&decode(sk_seed).unwrap());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("A2C90186931A040BE4287A1A40706E5FC0C81FD93193D695DB6395C1C1EF3AC36AD0EAC32544588094A8557CC7A8E0422CFA09A5F41C000D69FA3A1AE772D7BFCD62252D54A6EEA8F75DE0A18DA8DE8D9D3DBB43A2731FB628D86105168AB35EB2927FB93C63871A358DB670E40C55954BDBC0B4F7A9501CD1446B7D7A21FA4D287CBA7203C7E8324AEFCF72CEDB7C76BE26E575829E7F22621137396A676A72CE72A931BE154FBBDBAC237E96011A0221852972B8B5B4EEA44C2D3C1712982D28B73E9065156328F501E4CBBBA76080CB06D2272DD211240135B635C0AAA6141FCEBE61CF891BBDD31B3BA7FD6EF6F3F87386E36B9918A8FDC02258F2B0197CCA5A44AE57FF52B18D2865329F52E8B91073EC63204F57795EA121CE58A5E170CC8403BD96F511BF0F0F36C99481B6E1EC0A8C9637D5F72287C17F485F5078282B5F8803AC392726FDB5B09F18B6A4E1F884C6FFFB3E546832C5DF33E7408613A354DAE2F4F66EA1496472445DCA1DF6C0867DD1ED07D72EE0BB98E5406E3A0466C5888E32544B67EAB1320A2144D4F15C74A3B353BAA69FFE3B82B1616DBE8BCFD1F852E7A99E10BAD140FE52CCFFC27CCC3DDECCAA64C112849EEB07B796123DEB543CA12EA22EB9A851393C40986888BE8CB60D37F0049626A7351BFEB5A300C2D60160A2BD64E96409D45C7DA84B7DF1B72F8A7C8E6B85A41C1E6D3AEC810C20B76DC1214C2EF767CA537F1E7B56D7A42A48E8F885A914702117DECE6D422FF918F4F6A142763D6872EFEA703A958CC700B4C7F763744C9FD8E0852AA04FFDF0C37967F6B1E2350D19A818EA4DA9ED02388A073FDB07ADE8A84E3E971D7208B3EE1F2D5540F0B200AD7733E1E81094F532635FDFF7B1AA5157B5EF594692DECB004B31B83E6C7DE76FEC9C6773D9AC28F34532B6216A42B8CD04D1954366B5AAA126AABD56F961D633A7060B41E90A8E4B011484F8CBFE6542D9FB4A06F6DCEA1946644F0844CAA1FE483AF294E99454AEB33FBAB34094B784ABB9634713A020498DC43941468C03F9D0891538502088FD6FB5C06CE52BAE4BD75FE93CEFA9C68B06AFFB702CE195728EB40698C839E268BD377BEAD45E056F426775952093C5FF80BF932CBDFAB1EDC263090306A48360C2725CFD2330F0A078708E05ADCE3BC7A2AAEF2721C5F0F1C2C62E4BFA7F081F5B34FEE6F1856B2006F379E6CF9BABFB56FE9FDEC5C9468789BB9548864AB1E8DD3678B99557AB5002722397C17C04A588276B298D9DB115F66910529CB50C54D42CD0B3F37D935892E3403E23A0B9B6AF3530E453061F0F378DF4A3C580B4ECD4AD7BE44D1F1C65800D46428F01971C33F0097C88D5262883CB4D4DB05ECA16F5973D2EA54A4A06EEE75C84BD508E03C213BA0D8028EDEE1A5E522C2DEEE5F804FF26722916CF6F40AFA95162C4A570287ABA21267AAD4CE276C2D8FA854F571759FD41DB5EB12A6785862B087C19156B2F32AB8BBB728BC9F1E78A49B334228F88189A0074CD56D19F3C56C600C5CE9D942C99B2C538EFA6ECD0F453D9100EF4C7C7FB9F31B18828855D60E1869A6486372F174FF85FFFFB4553941BDC1545DC054531305DD39A5E5AF662BB7B49660B9802602236CB40E82B74DEB04784B05DA41B2D546E6368639D39183BE24D2B36B952DA0CD9948C81F5D7150B455004FA87C4F32A1DC936F42131487F100BD0A1D8B4014B30C7D95C577A27A1181BC70ABB8BAEB130D89DA90758B0DCFB9760BF0D4FE9A862EC8B7ECD2ECB214D81BC010B435DD906B389A23B1B68D19DFF3047B7B9992E02D7A3D2B79B542E8735DC70CDD471E47A29C25AC6D56CC88126A0F2B164F8038574754C768014E0D60665C42B6A1BA688E566D98583154365435737DA41C55BC17ED02E36F0090E4D8C2BD593497A0BF88C39FFA5EDEF0E4BD867FB3E2198BBE1561FE1451F371E95320A9DFE036C32EB3075D97A7B6A641FBF41D4361C2BD5E4C92ADE8CEEB9DCD58C4A7D2471EFF76DCF3B9A4A1469AAC17DBA76F36D65F9F6914C37340C22C00158004FF15AE21661593541B2013417BCFDDCD603579661F3AA82E41D6698442A9EA86BFAD7A5C94A5D504826D111F5E6527EA8C544C685338B9642CCA7DCC29C156D28AE8AAC7FFD65A297FB648AA702B62E209C35159113EC36A2D46B4A12B31A0FBF06B80D24EFB917DFC2638677C509F9697D4E4FD877F982D804A4F7D395E230FF52628BA18C701554AF6F500D03D1B99F540A3D374DA317336C42550C2EDE87F5E3E8F460A6F24553409B3D03036244BB495751EC7E3FA9A73F11840CAE62A0AAAFC07125AF80EF5E6967D199089B428EC991EC8150BFB80289995B62A153F8AE9CD0A6447239A47EE35359AF5BEAF84C28A00CA1DF388D79D58DE4369A3E3D2BAD4EBF101032DC51E4A01F64C2348608FFC0F456497D461A9657F03A4F50142DC544989A99E9C2930560E7D4282A3B2E81E7EE9616B50CEE7AD5116AB8721F7038407F9248776EBA7C7DF77C621AB9BCC0463583C57399ECC6E4D9905596990CF28CD7F9981F18103A256793C4232DF889EB82130F27B182C41624C84BC4CDEE6ADE150CB20238E2F649EAB7EE464F5A398868FFA396AC2A3776BF58A37BE70AB2BA2FAA90ABC74484461420E6F5D9CB00E4E95434CAEE850E90464BD049FD841E10602384BA9A3E58A71BD0FAC7F63873C71819A8C25552ED988F162CEC067FB888A45D0B805478F07853B7241A0D67A2D161D2C67C678A283BA18A832BD646F51B6F6F569E61766CE9DB16728EF61094502DFFA71E17C2432659178222DE88DEF97414EB5C1CB131C622E1257E538F7C7272EE5A9A034D48ADA4B3881FF
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:32:05 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_shake_256s() {
use fips205::slh_dsa_shake_256s::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
let mut rnd = TestRng::new();
let sk_seed = "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148032DCD739936737F2D";
let sk_prf = "B505D7CFAD1B497499323C8686325E4792F267AAFA3F87CA60D01CB54F29202A";
let pk_seed = "3E784CCB7EBCDCFD45542B7F6AF778742E0F4479175084AA488B3B74340678AA";
let opt_rand = "EE716762C15E3B72AA7650A63B9A510040B03C0FE70475C0463BBC45A0BA5B79";
rnd.push(&decode(opt_rand).unwrap());
rnd.push(&decode(pk_seed).unwrap());
rnd.push(&decode(sk_prf).unwrap());
rnd.push(&decode(sk_seed).unwrap());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("60F74DB4F30C2224DDDE29F0F2A2505E8F689B3E82963B818C79484A58DF44348873BA7E88C71F7305CF5F5577B0FECF60E99F79ECD8D4533B9391942C40C37A76B68641C094316F3A9E8105AD59F5DB4E9C50C8DC0E8D708B7445AC0CFD237B7D186CAF84D9FDC90348F08B7D28306D1ABD77E3E0C286A3B7FF17E772FB99366D7F370500389BFD9F7AE1345BDA21D45B12FCDE4CF7D76A111A56B450AD7ABC2E33ECCBED39C91F8757D1C7F22FC2D97FC773B8378D52B356D96FC171B3DE0D474445820A069AE8E08B8895AD30E748B3E6B794394A8DF2D58904F32DCCC042754769A611CC9D809FDB9EE513E32D8A9799EB3183F56B51AB390AD39BAC8CF4CB39B4B503CC0946FFA6B8B838FBBDD9D668CD9054023EFAED212ED6E8B26DBDCBC66A7F2C05B5285F926EAC556FE107B4374EE6B45195450E00455152FD3E4CAF2535E545BBA5439124C3A46C11ED363A0409933780DD39A52B1F77F651919EF70937129297B2378CD964E5D7D5624D1DDE6CCD6261D1AEAA0B197472FB546015EAAC944774EAF02C35E2916D54EFB90BD50EE30E3F5658271F63813BAF91C2E62CEB67CD75BB8EB6E45C353479C695E051094752EF85B795A2E4F43D86B6E590F9A15C05A83941084650C4E9476B8A57D81BC3B17DB8C10385D34C13E9176604B088B165598BAD6FD28B36DAA330B0528DC56BCE46883F85660BED6E986D1A30B059A116191658D26A77C876C73500E1EF3684B0DC3F2E9FDB05D44D607D4B0F37380413B226983EB837C8C0DE723D67A0E2B6537C424A0CE8E251C12B220141534C08A330D405F2F3473AA88C2B55D7F0F15AF955370EFC152BE419E153F858210F838B32F9AE6B93A19B6BBE092F921ACA557211912D9A3348E2D1DCB64FE15A3951609D9AC71D7ED1B033921EA2F5F3B272772C222691D3B5D145E0E7F4C2B207BABDDC6F1D859F957C9018F85408E3FB6247FC20D73F9DEE5187E5D5D2F4572C3BE9388232DE7848F59CD4E0A4CFF4D92EC8C9FC9C600237EB27602F2449D1AD4E84C8559957478F9A88724B1ABB1A13B63DCCF168BDA3FBDFAF463906D06F902B4B561837604624060C5F0FE41B1DA51B0C6C25CA5F477E9E2692BB1F110D89A28BBAE324A2B592895E26742A11F0C4FD219CA16086CFDEF9EB7F5CC62AA68FA089A10D25BBBEBDD9B1621289CF85A7EAE40D9C96F86C179B5BC2BE3853397B9C5D51506DA5D17128A3CB72F184BBCB1685B769690AB8B0E43BD2D62F3A28BE1D9457463436BE7FFFBC769EA19E7FCF760BE345D5AB9F615A5AC0C95741E20DE82D512432E71F9DDA258B5B22943616B391A87CBBE7ED9D96A4A88914D5F536C326A0C6288D3F7E2E9F791FF26A46F1DC02A9A42E01D0EE7FA946F49B277FE6748632230752EE49C7E5FD05E830FC47857652E8FA75044D3DB3D64CEA80075334638FA5215B7DDD946D9DEFFC81DB73A0BC7C240E158F2BF578EE487F5D3835C350691E7AB8E3721D8BD46300388B24E576503319ADD07E0C3DF7E911C5FD2115DD2D58A1E02A2C60D7F3BEF391518AFF2B2EA29796B72946F21BA5CADB180825DEA5C04E49B9A68CF282353775ED1023DCCD555752DB3497A6D986538C5A86190BE0D295E0CB33D59CDC1236D197A014AB7A2E71BC2177E129BFE429A5465EFFE132535A1C31AB7B04BE00C995E2228E0F7BF2EA0107E1112695A4CA52EA7C0293B21D9BF10295C39B5CB4EDDDBD88BE06E55FD5A8590D933AB6A2ACEDDFABCE07746E69888A9BBDDB7833281E95DD44C5E3B4B7EE2CFDAD036D04BF2CC5935B4D6F1FF70336538493CF058805AD4237878DA5CBC3F580CC53F3C366F90A443F9FBD1B1C9568D60C1EB55F6428F74DDB1684FC1C244DEB40D534C5732C529D105B66E8566D66A2180893B03B74D51DA8944CC05DB2C2DA447E87164899CC23F14E11610739EDDD993BD8C01CEFB266F4519FEF2696A2E040AC45766CD300C72B44058C4FCE79B34778D9DF476BF4F4272D851556AE941FE459AE094C6C675DB418D824A02C1121D4B53BBDB02B918EEF378303FA679371F4CE54272B676EFC8E1CC0766C3015E59DA72170CE7C35D8B23BB2458D259FA752AC9B5BB3C3B53A7701CAACCAD52573869695A110A1791F5E891E8A25C2ADA6E5A045FA20D97C6BAC257F306DBBDBCC853B7660A53C87B7A230FB8F5BB566D7E3ABB0C90DBA80E2B433843D831DD9697B5017457BB48480D72AFBD495339BDB937CBF62F5853542D2320997AB921E449AE5A2FF143582B80EBAC72DB6BB5BE5A066FD824940049893600FB62B20D1089F6204CAE00614A96E639348BB6744F62CDB366395DD1859CC0BAEEBD3747DE4066C547E8CDA5E47B9741B4AA70E7060BC2DD69547A6E472DFCEBBB65D82C3E0176CBC2000723B50BDC7F1726D74FC19FE3B9BF2581515306D52D4A52B7B0F0AB8F7BBE0959A321C7E0747F906A3662F51753269970B138EB86B8B33398FE1034DBDA2D3D7188974B556DFB389F499D57559FACD1BE12809350618F418444C389181732D7006D4725A4E9F850219F34FABFB7EA3C020BF5E75844677EEC8BC47689354F5D1E20827CF81C65E2F256D55E5C28C5DC84A6882349440E453AA749D408DC8ABB978F41869F2600FEB249520E732823B2D5357D609167934D4DAE2C7C3E817E6551E62E9B627CCECB0D116D293769495A82EFA9A77399895C5564BABEC2E37ADDAEEE1F8D3F05DE0F6E95F5BF556D17E042AB42AD7A5D4851CC32D1FFED7EBAF1E8EB89F1DDAABA740FE6D3D1A9CBF57D5D66EB0A287302245696B01D8ABE92C0744794666C58ECDDF50753AFF8FE4044878418D9697D9CD9962611788698597B8058C2
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:32:05 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_shake_256f() {
use fips205::slh_dsa_shake_256f::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
let mut rnd = TestRng::new();
let sk_seed = "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148032DCD739936737F2D";
let sk_prf = "B505D7CFAD1B497499323C8686325E4792F267AAFA3F87CA60D01CB54F29202A";
let pk_seed = "3E784CCB7EBCDCFD45542B7F6AF778742E0F4479175084AA488B3B74340678AA";
let opt_rand = "EE716762C15E3B72AA7650A63B9A510040B03C0FE70475C0463BBC45A0BA5B79";
rnd.push(&decode(opt_rand).unwrap());
rnd.push(&decode(pk_seed).unwrap());
rnd.push(&decode(sk_prf).unwrap());
rnd.push(&decode(sk_seed).unwrap());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("60F74DB4F30C2224DDDE29F0F2A2505E8F689B3E82963B818C79484A58DF443442B5B4E7562933237CAA8F6E39A97DFFAE24CC51F41E6900711FB08C851770B33D4B425AFBA3DA8A1258E8769BF53E24DCE1D689973D6FF53F7F09C24CF3C5D0F0C22F85E5562FA4ABB18610850DCF6CCB8D1A3D4E3EEA48AF87FD1D8F417647A381502062FB94DE5C8D1CEC61519BAD34CC437CE0B0A4642F7E24BDC0A4221EB418DA07E64E4CA91EEAD38F2CEF71B991AC9487B91CB49BEFD482CB1F3D4A25EA101624EAE754C32C0B83ABD57D9DDBEDAE2970E69C8FB92A8E8AD7C5DE41853DFF1D6A3B5D4C9989F4B868501B84414F22FC436ADECE6A5B6BCC66137740BC49A94D664EBD5CB0F0FF71E2C2CDFC59B7A5EDEC96B0558AEFA7BCC27CEEA4CA90171A89559D122D10345BAFA31177130A55807FECFFA36F05542248042A5CACCEBA91D13B71CDE5C1AB250ABBDBBE2B2EF02A6B22E2701085E1CCE697D23AB16377C18B69BBE99C8B95FDE42D5736D6D897A3461D20BF8B169768EF94C13F9B09335C2E376D6C8332C5CED764811D032ADCA915A2E13F49F9344B8832D952BFF9E2598723FAB10D81317DE303FEA7E453B01FEF68F4D0ADF6E54C9E6A204AE3334CC9284289E6027EFC0A35C9A42AC6AD9241BC57C162C9594B813AB1BBBF66D6C853251FECA9A7BACBAF1FDF33BB723A1F710D4428FE9058D925AFB6FBA75B201D2062399ED42888E00B8FFF572EB4F12F03528D1FCC0CF2D519BA3A5BD1F618DBC7DC272FCB211B561B5C824AA6375E0E8187A384EEB717EE4E270B00BF5438907787C27DD9C593229CFFDC56E5FDB3D51D40D535AE654D887E89F30700D8412C6F9BE67B4678E9EB968D9D35E694A4BC1EEBD7903DE4C744B339BD1868E040661D43D6F055AD1765DA9E66E44CDAA61117C682C155D1A15ADA16B301DD2E2C7A7F0C9C5049869A976B4080C82420EACE5AF98F3D13312229819A8EA4BEDA306E72CAE744143B347791190B9D2EE4A8FCB92832EE6C2FBD9F352DAFC8C4561455A72E8FC29403B395D0ABA43807FAB36DDA4148AA857AF74FFF5C8889F87CFA219BE10E83B19078B15E070A5A16779322124B38F485DC9585F9DD4AF7B7460651A4CC49E39E2DDC60FECB9B6B8FB9904D6BE7818CE1F08842E969F27039F3ABAC4A0038089CDC327863C18F35917C09C1D9C151C9F30B180DAF15B21F92B7EAB6E1A5209BFE0F4CCB29A186B66A5ACA6A010F6F572EA2EB02F6157B05DF9F451766BE6FD137B2D416B766D112BB6876CD950DE288C20A5759280A73C1E8750EC008E034668A38B5D132B274D58FEAED148E8A6DBB9AD556BCEABA86C30D2F29DBA7528753354F5E10A3A3A60F7D7D5D1F7EFE1D25386EFBCF4F9D24C01568287F8D8DA5C314694690576E826817CF19F085A8C44BDA05FA0325B21F501CB11BC514F65D8012F24E6630BCD82C3902D201E5830AC488BE48BA9B3C74E8D5980CD0FF18D3737681CA6D08396C6561367436D7FDE69285C364A97F799BFA9DEA8B011A248CB2D758518F4F7FF85905F9B97FDEF07B4A4D00880A1898D418ED43001068FDF33514ED548442BD396299A65EFA0F489F8C342A8EABC7D80DC171B919A3690F9614DAEE49A5DCB2B972581AF94CF3CDA9CD9BFD4A866A7443D8FA108251EF6BA16EA7F334CAAA8F5579B4BD6A5087D9D382266CA7ABE1E542C1D585DF86BFEB0E4D2B2B8EA02FCDDDED88C7FAAF37C83A83892BF366E21633D9C09F11174B6E61B83CE2A7655738E7B1EC8DA161634C64C9713370C6C3BDCE5EBC22098402AFE7BD9E9A566C8956279E1120B2A69B8391425D7820D0D79D7226C1DC4370D6507EB62E672F8369F741B0551AB6E6E648CD330E8BD2FE38CDE1700452E6687477573B357A96E79875B353D0141BC9C2AA6A295501A6F3B75BEDBC96FC6C2CC9A1C3ACF691591CABB8B832CFA1A38312354E68B47D8FBFCC1CB479C9DDE16C626D4C22AC34EC1E26A26399BD1559CC3FCEF0E03A990436629254533B8ACF9994D4BFB36158590CE5E5966F84141035DDFBB644D0AC41EABF4B9491DC3915191B87747FBCE98B76974522B401F6200B60B6C90CFD446924E153DCDF3F869906841DFC7E6EFA5C9BAC0C09A8F28C1F3A913D4217D2FFB72E3A8CB8D4A1B601C3D4D3A66F0850BD71554426E6E9636E307BF0F9365226C923850AB34559FBFF433BBED71C3A2B8C387E111EDCF7A9EE33485CD6F5BF1004145C00342C74CAD8BA9E720902B3ED284FCFF92A528D4B6B28904123FB444B45464AB07B1B27319DBE1BDB7CA7F3677C2DC9F36BA624B9C3921C1746A04B7D2893C5A7C72083CC718589912BC097505E501C7CB5110378956FDA9473F4978B092ECC3353BE4DEA0C81EB61ABC5441314F70DD00DC1EE9D000BD0857C973714692B24B8216EB5BB3CD7516E74D85621E03277AE2D87E04F353C518EE41C67A0241E87E68CA4243899FEB5C373C67B00019FEE8BCC458643E2465C6993CD4D0B7137A4C3FB81F207173AEDFA185E4288932AE68C2938EEA912547A92A6F3217913903F6C3EDF9B66861AED97E882D329E8A2D7B92542BE7A7A1CE085CC451211C7EF79596C081182079839EA2A0215857CDD852CD6BF93CDBBDEF9770503AEC6D5FA2A7C0896350958C69DF91250D199309F5D42612BF148A6BA1C9EB8DC5F69CF11317F2A8C5B55614F1C83B6073BBB0175E61BC2CED3C09A7A7FCB7EF01E4A93B72864EBF5A06F55040FDA489B85533589DCE9788DCC0A75A3E815AF79A2CC5EE1DA5EC4529EC049922B1CF0FC707C31BADE8A6C38694E584B447AB14EA9A5F56DE46DDC4708D21920878C4677256FFAC066A79429D44C44EBC
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:22:35 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_sha2_128s() {
use fips205::slh_dsa_sha2_128s::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
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());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("B77B5397031E67EB585DBA86B10B710BE87F777DD90795BFF3E8DB503FDE9BEA496A95C291FFF430451E189BA9B0551D106E0C9659A46F2C780682CB605271584E416C189ECD1E662C997234ADF37E39C6DED7AF50F561210E2E09ACB9FAF334765B4A752E02E58D229CACC782AFF6BF17677C0D0E0CE4A6A0C2C79C52FFD3E62CFF04946A2CE0A48265D3BD5963BD2835F738279CD09DFDDCA7AE545DDA58781190ABB6726E1D856F567A0FAE940543823279923CA0EF41D2F6AFFB412253B829F7D43C2E3E4263BDEA9C337515DF2F321B2A5E902530622B1A4C8F1E845465F9C893912A0B8C102439666A427A92EF627BA8B500F1ABFC9E85AF0CC19665736B6345AA1198B15EEFC565CD1865DC1D57A5793670DBB246C22EC2AB9DEA54FCB688D34CC3A90441B05B90858A890ED5034DF136D940567ADD7E9AB7B2B1CFCCE398C0F2668CB24E226A83F7E8089AE8492CC572402B60F6C0EAAB3E217F69E4FC8F8F712B38350BB83C26D20C2E05057CDC0019562BD0984390C578EC849C852EB3DA71F7BB2B90FEEDCD3BA0A0D8E04D4B842723A7B9895AEF45291BD2315F1EE4824FADEA051932B31131F00DCE1734C48D1C7C656924CAB81510400C6DF444D21F31F6472F0AEA15C98966DEB82618BB88A92F306F4B643040CDEBE81CB7178CB38F1180B96A882281E0044239E0B60DB452E9714EFAD53D0DEE12EED47AFBD2980353ADFC6247BE8881977979C37E1D12E832391E5E6AFBAFD8EC20DC77A17487B8FB868A650DDA95E334F8A1E974956B1F8BF38764D7605FFC67E5F35B99CF144691EF0641E50DD1B2DAE28862835FC8654EF36AA278A742FB15D7204E3DA269531B48A45E1161108F1584203C78E8C291D00C265871EE87C881C63831D70E34B8408C9CED379F851819D7047292823F24E3963340451ADC5B20FDCA9A26CA80EA7F52815CA02A46829E95401E3B79661762E1847328A54A8018209ED23E1E0F4E824A34A920C9AFA16682A0F480A8971F86997329A8B71BC9BB70B09E3AC05D22D339034AC2CCAD6D956D2A9F7BDFD697F00774D748353064C1C4D3D92773B8F1689A9C60883E0A102DB41F4CD72E81802A733BCEA7FF426B2A1E9F18240E65AEFE59020392694E7085C90BDE377617443FA0832AC0C3D5ED2925296283B9B896945A7678E45D005B8ADA4481C3416E5C17019682D0419EE47B9B148413388B1D96D4196F4AA4A0FAD668B41028BDF06D900E0D48AD884D742439C8FBA9E6CFD4F88805EF361BFDA743233A72B7A763BF5676C3A40496FF3399892058E5F0517EDD12B3610EEC4C9C22139088DFEA81B543376BB5DE000B2025B4C564F9BEA8B9FEA99EF1AFBE60C87C4F22F06992BAB097AFE4D5A20EA564B3BE21D5E33550E4E02D4ADFFB4530004B09979684BF813B7CA67975478089BB8F8E02110D6B07384DE4EA1F4659BF0D8B7FD1853D47B64C7DFF28901EAA8CDE7BFE89F872090777E857B70591491685E5211C83CF8EF0D50713506C5FD322A43173ACA3E52935A719D90FCA6025238C9E90C6C40A43790303A5DEFF21186DE1826704EE91958437FF273B378EC9A666C6DB83CF685C7CAF4425E18C77939D453DA710DB1CC2749DBAFB56E447A67135F4037731CF16DB7AA5C6921BB86A6B06D9CCF0E8722F9CAE325526970ED7DB0D5B54A643B50A456D23FE61CD49F4D5DE6670522F32C284653489494F4AF6F27E8FA9029D384D228C4C8AFC7330E04773923D724EC24F2EEE5C88BDE157657CE98275920CEF4C9434EC240768811162865988F61DA86E7AC1084FB9B7E82D7A6738289A912361214A64A2FE5B5E702FCB6FA98E352C3A6760304E3881D8E0B1C370F33C3372FABEB89DC2ED54E4780C48B05317A2A9580C12DA9E602341CD823793F5C4E12A3FA3E365A98E6888838E5D736A056CCDC0DDC627EA72CBF3B0DC865A56696DB34009A29CF18AA0B94BD6276CDCF0CF368B7D90C67E319249BA09A030DDC470E11E6588C8980C74C4D43BE281CCC1C858F2AD7E9E132278C2422E941DA5C2FEBB83E7D4E836F45D42F6F14CF17463FF5636F618647AD2C8D74B4A03AA72C71103D5AC977F16E4DC8E9ED8E9A9C9C0CF369626678E3662AA4AD36A37F3D45EDDEFE38EE3A6C3939D6D353C13585749EDDBC367B2A72A3904CE5B51FED495BA418A74FFD483A3B289EB17D978C44BD1E2A63677D97107ED375FEB2C77E034566AB2407C176F50D72F935C7D39E0794183F45F1C37F5B4E601F5DB4761270F0D2528E7530D75FFD23968ABE544E7A7E2ED73E6929204E751F47F0906197B73CD76A9344C2DE23EE1D931DFA494B28F131C4E0BEC05805EC946ABE750C758A4EDE464CF16B06303C9C8C72F4AF58C7EEF12C9FA257E996CFB84BDBD72C8B3CE6619E12C8C4F23F9073A14AB894007664FBCD9ECD4E37855B87759838D8527EA73FD1A17103AD3209AB145CEC0F419B9522829F777BE3DBB82C7B2C835793849A163BA6AA637A8B051488E9280E96D1B8BDE1C946E437A51F022F3BA5641D205963B92F23AB6E41CB545BA8E952206C67A5AD4BAC561E5D9542DF5E2189BA96D160A6BA528272FF2E4F25E82A8C8B363500949A53854C6BB5D5F2877EE33754B2BD97FC9C80FE72B6A7E924D69683120248E84E014705FB76990433EDA1E9817FDC2AA6E176817893E850C0999C606D37D227B86875108E15CCBC8D44C720E3EDF7A0EE7ED8C1649E406FFC323354C9F0B8CB06783C73536674C2EA9E7B5E9F8D84BF8A4F31610C73D95FD7C708AD400D2A01F6A6195155332702F084DEDE6835EF0993FE4097C9B57DB6F9228E9A7318D2CDF309B71EA88C80D85FB30A0CB56D8A7A812B
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:22:35 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_sha2_128f() {
use fips205::slh_dsa_sha2_128f::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
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());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("B77B5397031E67EB585DBA86B10B710B2E1D737F7C8CC74324FC36AB27E0D47B5855E7ADAD15530F1AAB8EED4F1426B16F6F9811D1F43EC2A06229CE43527AF76100DC23F3BD4D2999FB2E3D54B9159B2590E1E9CE3BA45B9D6AFFD28ECBD3676FC4093F95B80C08CF95F4FC893D5E4493FA0D6A2BA8A21D247B057BE4B26D024C857B1DF0C88C296F4498EF6B6C7B45C263F1C397D62B2402379E194C7D1D37B73D6306D5A8FA5C67F62CD9871984B3A93BD61DD60ECB6FB0175704CC007D5B81218744100FA64DA5D850310A0780DEEFE4EBA89BE833D0199157001E0DE3DE7B514A252B1DD37B8E94EEE382EDBC8F9A603B07082D4951F95114BAA165E5F788E43E561E7C2B452070CE96F19F18A39AF5A9D6F5AFCF71E98B253C0935C87317EDFFD469946DFBCC6B02F377FFCD01022D86C56B001735F0AFC1502CE6B430C1CF4F3254C74DCECCC9AFE404C2DAB395BF0007859D61857B1E7E8CD0DDB720856DE7281EF23F0E27E810241FAC49C9CF45C80665C8487367E7BE23C6783C05510E8B8967E950AB97EFAF3A94705EC5E1A096C54305C24CF1E7DC62A19AF820FEBA66F4EB28F4A82462F424BC653986DA24D79C40CF993C9E25560923E5970419823192060EC484D1C9B2992C3500C798D9CDD19C6198D94D5015923D9F76CE2B063566F036B16CECB56EB2DE553885052D0B7D96F3CA6FDC3C57AAF24080EA3501AD7DC30BBF0BCB734E3F2DE028190C527BA387E6E8AF8B0CC823913126F7506052B23C11819488D06659C908ADA323E8C927CA5653A60A7112A8C23D092798BD67E053295E2C70C10863C8274E275F2EB2851C684D060352541306562BB52FD2B1797070EC7BAB930F2F99C2903005EF508376AAAE08A1C5D1DD88164E6D718B59662D4BEF8E7835FB2139F5283149B104093F72F3A5B81359BF4196DC6E92E9067F1B9AFDD13DF9A90D8CE02AEA1C8C276FFE3067FF0395BD8B16A67F255D86D90C752681832F90377F2AEDDC02CBF467CA76E120AEB8B71F39EB3187A0E402A34B0A4411D6E93393B3ED2F30DAEA3E737029A31242D8203A033FA7B06A65793A54AF01E278A681792D44667178BC74650133CDC6711ED1A9AEF2F7CD6ED094B8579FB855494AE3B728E792D5B8E5DA39D7EF63F01DB9E3B8984AA5B3A5CA64C107062BE2793F15BB89FB9BFAB0A5BCEFC7A7ACAE4AC224AEEB39BD84FD137C582D58710B239849E62DBC92DCF853BECB009952BCBDEBBF28D49E330B6044FC53F8A8F90186378914F7068CC4DE3BDCB19D59EA9F5E45E414AEA1EF649C9E1CF15BD1A3CB044AB0E30F0776777F1035EE2EA283E22ABAF2397DAF68F03A5CB7F8FDC250822C70CD835C07D646A4AE77790992E4F322F2CBFD9EC39075714877368EFEFFE8EE4EE29EC9C91936EE6B80E87AD8BF2F8EDE6EBDE3C44935E37F6802FD3306953D42FC5973C42F20CE320C506270483469AEBF899338DF61D66DEA18C7A8B21E1C6882C978A27A016A40B6E3DB7A1497D64BBD703DBFEA5E71DC5B13C7B38594B3B6BFD1A0D99247DF4869A4ABFFA6D604F1615DD0CA7EC5C796F40E8AEE0FED3F9B7F2D870A2AE915EE40D2A4FE3D2633D6A3A31084B87DE3778F773CBD1C1C102FEF15C2AA5423D0ED262142653B3A6670797657E7E350DDBB0FF2E23B2AAE54E08841E50B64226FFDD07F7B6F533BD1066860819D459070442530F2F04A3E7FCECD5C252917BA8BFCB9B5A8D434E7CE4550A4FC389614FC40CB59C99035DAE2BCC9C4953D4983B4509503DD1ED934E6A69CD6775FEAB7F6E05BFD54D242D87510C9B94F8322D2A27BB53C0A56289B16FF59E11BB95AC81B2BCDB2B2CE0D34FB4B167B55CDEA3C2ED1234FA0EF2943026AE9B10A433E3873B4267807576A59B5A4EFA3774A48B9F4C6FEADDF7C59F0A9A1C4010AF94F4BF9039183393142002343853C663A01A5131628691E7BB13C9BE766B05F5CC6FE13B124B67BCA4ECF8B6BF67E4650CA6AF80BF57614DAE170EFD1A06F9EF46FA27971F7F9947A2A999D3C1D4F36162275919F35BBD46A881D4D9722D6CE4127C8FEE67D2B3AE240C9BB6A47F6F5E29B44841D138E42304B12144FDE185786E2A9B1ACA8686FC82618D9EA2EF94E2EF47E95AAA504C55B9593A020C68161FA009DF4917DB9ADCCDD7AD0E51781BF1F4B70E61B26400FA7AE72A96BECAE964BDA7B7B740F94F625A43A3775476B434F9F4C4BAB9406B9EB33A4C6911B2DA55510A63D490AAF768CF5A86CDCAD04ED55A9D49A63B72DC02778EBDC0AC6032340D93A2A0AF610A88FEA7C18CCD9C9304F5240CE2EA883F548D603937D997FB72F8E6D00E24A04C0A1786268CB379C77A49832177CEBD3178ABE8EA2BB5500F11325F0D1A94CEED2E68E99A85F9E052C3A9C6DCEAE28D4186CA013243EB205D4CA35910DC2101B1BF023B31029E3BD33A997B53B470CA2D7C48424812F550478703EF46F55A9B9A16FF1865CF1640819DE08C3F1DC484BF8203D4196E9F60BEE1339C67C10BEE8B2D865DDEC891109B70845C6947CCE1D4BD8D1361523C2471EFB5AF1DB5D84C8278787C3ADE9D463FB4492EE87F44561AD2EAFF08CDF84E10A5B84314D6CD0FD731843EE8D178722ADEC86BC0736D9B43C375D4E791205D64C05E39AF0BACFAC39ED295650D22CA423C89B3D2C109F5FACB80DBD223241C4654D19C0FF769EA130715DC20F857802B7341278BE2E65F7CF59004A2B966B9FE5291D9A3F9B868CA9242042130FC07836BF733267AEFB93384078927C3D8CADC33CAA2F6C6C04E26896C9DEF92BB05DE05FF718141019A02E560768069AABF22BC9CBA6DC51C591ECF0C9834609B80B17DF123FC4105C8
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:22:35 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_sha2_192s() {
use fips205::slh_dsa_sha2_192s::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
let mut rnd = TestRng::new();
let sk_seed = "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB14803";
let sk_prf = "2DCD739936737F2DB505D7CFAD1B497499323C8686325E47";
let pk_seed = "92F267AAFA3F87CA60D01CB54F29202A3E784CCB7EBCDCFD";
let opt_rand = "8BF0F459F0FB3EA8D32764C259AE631178976BAF3683D333";
rnd.push(&decode(opt_rand).unwrap());
rnd.push(&decode(pk_seed).unwrap());
rnd.push(&decode(sk_prf).unwrap());
rnd.push(&decode(sk_seed).unwrap());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("16D80287FC5E337C864B7E8C1E136EC8061282688975BA136E917DAAA375F442A93976DCF6507C8537AE364AD9773028E2DF9492797B3B8CB817C3B5239D42FEF818D6679B6F9B1F0C9373AD101E966F469ED3E72F284FCBC193673671B76F266F91B6B16E33B83965D0E0F16592A5D2DFB2EE48A6C451F331BA6196B4E6B0B2D8BD76FF6B4F01A92CA8417069FABB02DDAA66CAD0B8C0EEB8263D297B7746F8F050DDE0B9F448AB647B7487AFFF82B1ED2BB6E82F8C19C0BB81FFC1C90E9A4468EA5098EF893C109AFA4DC65F29DB2036B9CF21ADE45AF7FF6F625B7E1E881204FD16299B81FA9552579CB5DF29C7C84128217C4ABD143C3B2740660C665D0342A7D3CC877E6C932EA2F7316A42D5FD69CCF89C57CE68F704CAE94B8029D37A33A5AF3462AB30D2C3379DF2E7DEE5D34C6BCC35291EC215DA1B6C05BD205602660A4DF5AD496A1B69269C8E1B7FD77C8CBDF1170136AEF67F9577E545993CECF904BBDFF26ABD7228A5AB01DF675DBA9E4F3D197AF2552FF03406DA012559EB56D1D374EC2FC603A9A58E66C1B7387B155E978BA4EFAD14C8EE77240BE5F1776451AE4F82F50270D77FF955FB669B92F20951194F81337AFF91A9A474EDD706231A5413E5DFE6CC6488FCD1FFB89BD6CF9B45A1BD1BD9F259E7F63F1C2B8A580071712CC32B724A5A95B55EA739D7B5ACFDA022AE6E7EAE9AC985EFA4FC4E107DEE6372D708693DB13FE43C061AD9202B4A4833FBF9D01716630DE7C114E29F781C2F208C7E7A8AAB96D0CC653DA6EB30AD72401CA531F584C69FE52BD487341690FFE8BBEEFCF29C55D70989800B1A04FB244F96B1B36588FFFFB8E5E5C7ABDCB3C9A571AA6D8FE56022732732DDA90A20D11CFFF64D81ECD9E664767C151E068ACE0F0E0D0EA4D5C66323ADFF646D894BC634CEBD7D9A519D9C8170BA9E853CCFDA7BE5EB208C36037C8102D21E733FFDCD7804267083C74CE8DA409E70BCF3535F6D73DFA2725A951DE2FEF8DA21918963B1C862D0F9F6F4E58DB32513F8EA3BC246232F7CE7133639A613E3C9DF2FBA09F363F176687DD459F6A525EBC0E148D17996737557786B875A45F584FBE468BBE76F0AA3A7C43560FACC4EB5623928D1887C27BD14970C9E761C4E636BE5BA0103DBEC66C7C5F833C17AB2D4A6F2B133E7FCCAC32F837C142E1A8B9CED24113CFD04076E6FE99B9C90F824BC9DB3921CA0E5CF2491F7E41924E8B8A5F64B593D5BBB266FF44B285C29C313014B1EFA2DD34AA8AAD148841BD1D11CF1B15477CA5FBADC8F57EDBFEB7E56E871E9608B5790CE66E19F9DB71C368B5C2BF9BF4E258934B2A71C71C39C35F92AE4B0664B47BAF119A9898286F84D72946FB7491ECEDF778965356C1B4DA8D23467128F62AE6E3DE716DE7A9AA64A4CEB5395C9CAF8968CFA8A58117F200F1842973B25949232A81EFB427FA069D0067CC4A1AFD73FB2B64D84F3A84F7A5DA9C4458E920D37F12E7043BB02E72434F7DEECA74F3C311AE5DEEDAEBD534EC7E7EC1293E3CA48D74199128CF565BC7FDAC492D23847B64E8A5455AB84D5C916FFE64E66DBB8DD90BF68C294A473C935C6B6F723511E6C3132DC9D04EF7446AD2C6894E9DC9E616E1898830041252E356F6E928DEBCB669A216B9A725E27CB4147594839F27AB1FA066C7CCEBCE4F52C12BE22FBC10D64FC1A73FCCFC6543E37C76F2B9E2C7B39C0DDF2D7E82900CB606E74620211AA686E9474315413479BCA2BEFC41B511B17139F8C202831F061E0A865A43CA9EBFC14CCB2B015BF344DD5B71CCDA4666E32945089ABD307881793A1FE36B87373F1855A71F32ACB087BCFDB0D35FE414D409AD9B4AEB0402F1CF3232C64CBC47A098754B86DE8A38532AAC31DC9DE206FE958314A66B1FDC8706C2915EF630B93E6EFFEC5DB5CAD630C16CB36EBDABCCF969C3A42DEF2ACEB002EE0375858F9D7B71A1640706DE11E5137BC750B0689D692DF4B9FDAD4C968A78EF0B9507CA8A2169C2312145893C6AD86F4C9D700941FE3009BA02B3FC9C48D87BFCEDC44174A4F59A96BF59A5C5D323837700026B0C8C7A070E039655C0DCBD3C0A6AA0F4AE1EE29CAAA255BEBAB79AD4716D8306E1B3601996A7B70F70421374F9990CF73EBEFB170273E381861906008FF9034C6D63339B9FD4F4C0B0B8FA341943068D4E3BAE061024CDCC962F750E69FCD679E7D1B54EF67D6DDD2C5912A3ACC134AA94FD4EDBBE7386E4806E0358B32265EF9D89A71104D38AA0131791E3B1B1AB6245080383A1B17E47C361753857F8E1FA8F951375572F0CD87CDBC1838C70CE801D25F65807BF1ECEC9567647DDC05F3D313675DBA85166652A3317E541962A2BB0B2FEEBCD575F6137A1497695D2440639F29FCF821252D921D1BA64A9358EEDCD93935A74943F570C52C4D16C6328CE99B8E374179333D6015DAA08790537DAE290097BC867B4C44B844278FA61025EEF3E5C4DEB646E43F0D3612C63E6065A6C2BE27548036229ABDEF99283D22DA2D767EA75510B78AFAAD20F108FA38EA9F402D66BA63D33B5875BEE85DB01701D176BB779D8FAE5CDC40F761900FC8CFEBD7A6AFA532EE1D3855944B8D3D3F5CFB0356E89A7A5ED94BBB3517905F6AB6EF4721F5FC2BA2DA4C0A443F077F3DF760D0AF5152B821DBE5722BEE96770FD59081371686382BBE2A9769914BA74CA4C7221BC84580F9D7EEFD6EBE07A91F6233C661202BDC1BADD0BEBFAD7F3B1A00BAD4702191527C098616B1A0847BDC00D48072B91B9F92A5610BAAC2B971E7F4A512586A5DA0DC7CAF3C836A88CA9BBA8B23F0B8CE63986B1666B0BF8FBF0592DB0EA058667787ABD08A02550238D95118170
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:22:35 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_sha2_192f() {
use fips205::slh_dsa_sha2_192f::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
let mut rnd = TestRng::new();
let sk_seed = "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB14803";
let sk_prf = "2DCD739936737F2DB505D7CFAD1B497499323C8686325E47";
let pk_seed = "92F267AAFA3F87CA60D01CB54F29202A3E784CCB7EBCDCFD";
let opt_rand = "8BF0F459F0FB3EA8D32764C259AE631178976BAF3683D333";
rnd.push(&decode(opt_rand).unwrap());
rnd.push(&decode(pk_seed).unwrap());
rnd.push(&decode(sk_prf).unwrap());
rnd.push(&decode(sk_seed).unwrap());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("16D80287FC5E337C864B7E8C1E136EC8061282688975BA139A3E6D350794CD2AA0035214B2F65FD2692EF325FC8DA9E0B804A6F66CB644B8A26337DA27A7E051EA2BA23322F777679AE34FB06BD928514AC83CCECF6FED0006AE80DA897D3BEA367D39F9047D476282FD4A7FCCDC7EE6A768F6D5FB7DBF3A11F192969E8B3359A0E7D37FE2B1102F41AD23DAC24E21A8B886B6694ED9FDB69F91B8C32E056D280E8A482BDE260D6F9F310DE6313915377D2759FFC78817477A54477C2BB6055F868A4C8C3C538ACFD2F39DBFA142692A9AEAEF69631DBF55E5B3B3E46665B0F02F37F8792EF6EB2F765024162ACECAAB7A7873C2EB4B2B67D69B0F7C7077FC8CC3029D4807C930E7628BBFE0F58C308E717E8C3C78096FEAE4FEB92605846C9AD61B03EC4ADE99EA9A4F3B193BED5F4A1E0DB33ADB30C8E6388AFE6910F1327D4E97D10FB985925E5BE6296727A91F754F16D43C942FDC9AA36D0DCF7669455EF61CCD04B0AF78F2E815B9262ED8C60453727EFA4DD84A6A9653157CE8693D61863FC4B4C7875BF9555B96D22742CC9D309F0663C1CCE24FC09B9114DB43395EE781DA1B2FA9E3E94F9637914BE7818F63B99D0D2999D3E621FD1F16ABEE67F1327B1F0E271D2583659A93987D029E4686AF5379C9CC9F688487D719F1322FEC4C4CBEA7201B6313CB9C124DDC7831EC97166B3CB5B63A3839F09EF2527F74852DA27997575C7880FE0BE91C6F912317FC96A239C844E4727DA81C923331A1A439D95A6E3BCC802D77F957B130FDDFC446A82DA124DB18A07B106AE574E06C5EC1D7A94567699A08A2E9D71784D3AD4267C9D2EAB9A1F10324727757B837DAAA147B3947CC8E080A4BABAB6224EDC6E4675173036A40141B3D03A60930C5632CC4BF4D7A6641B3441C1A5A1230E6CF849274E8825807F961A254502BB712C36A51D3F2FA644B4DC2353BCDDA06E6D15C9B3AFEF7EB7581C51368918044659449DA8BA26DBE37B615669BB78A069305EA38CBB1166F65DB926BE8E3F852DBED8F7A718CC8DBBE95B82ADC32166D55A3EE0FABBE44FFD282D8FE3C44234C645D75F6A6B54556284DDB6C4C2348173703C54833E045EC8BC516613638A75693CE5238CAFDB51ABB022AE9B8C73D70F0B6ADA13C8CB08D7BA5197072FDE88A2AF3D909DCF2339C772FC5D33EFFD0BF20F1E25C75DC47F9D9C59CD86C19C377E60EA23E8E6C362DF2569C50D976750EF125A13576880E54823A75BDC817DEE2E23B5C3472C422E9C86669BEF22C694E161E16689B7BF827ABAA0E09CA635F561400165454F8899924F2CFBD1A744CF8CFCBBF99B66C8BE244CA0A36FB7A36E4E693BA682F5164E02DF7AD77CB98475FB6B5E653FC90BA18B4CFCC4CA52FD8EAF97EB3BBE0582215023B2AF7879C9C8F076BDE2C74FBFDBACCF4F0CF7AE7778AF964BBCF5D2B6B1B42B8C1CD393F383C9D4EA872567D788366895B5E7A3D6C1A4D0D45CBE4B4E18C2C43D7C3B04239B25CAB69FFCE81E1496A2B7B4CC1B9F22214EC8F4E97889B196F6A9D846004A9D5DAFA39B54B5D7A589BF978EEA36D2A22D0C473EAFCDD265D62B7370942352777A27213CA5EC5EFF183F69E585C5AF38F237F264B2FF7DA183830DA5C64DCC7A7889A24BDD06CEC4CFB8B2B33520A7A2B8F9B5422ACECDA796C8F4015CCC19B04ACF488E525FC33E1946E1D1A4BAD29B7C42BCFF10ADAB3FD9F5CCFE91B899CF1034C221AFB957C3E6C570EC43A7787E37FD2D89806EB7570B4E4053C40B70FC78D6E465013A9C0A666E70AB14D43F2326702DA4AB516688902DD53DB702197EFA1AEE4947779011F1E1CA52DF011596FBD96A166BF027D954F8DE858D9E0A5080302A71C77FABF0F13B8E739AD5F2BBCFF792EA6B965D54E4FFC38215C5D2DF1F7E995C9A1C4E2117E4FC05A277673179EFE7B9C26E93C7A9D652AE15AA4FA5638C7FA7E4654A9FB9560CAF6937892C0F1F8F850171026AA6B8D3A76F071E86F0D6751C444527260761F92E285EB8EE5C8736DD9F4B7515F9D078719F0D443AF8AC288620589D5E8FAD97C8BF07A7A2DAFB5B75B30E8AE58C672236E62839E42F7ECC89CF477553D1E5D6C093AFABDA11D5FC2051B9F9B68121F12A8B96A82FEC53846E2D50DD7BABE456E410CC2AEA9ED73E40E49AC96A06C4D7E86B88DEBD798745240301751B97C1E0EBB3794D1CEA1A1D23F68916487CCBE381DB4117FA4E1BBD81C79FA36FAEA1575A0C867E3B8C7BC8F5CDC12EB8D66385320F4E148CF772E5269B392CA449FAF1514A28F0E026C59EE839EF25C096EAB42125E26569594AD13385682A01A79236B30BFC9E3A0D963488F5598DBF89AB88E9C1DF2716FFA48F0064D1EC743508894C68CB6EB302702B20BE2BA25B6F354DC852E73A69BE77EB86835774383E003E901AE2BADB66214D5E87DD800907FA7A5E0C72318F53FB8A586F3F1E9E751423CD83D67C8BE09F7A21973A222E3E37ECD0AAFD9F31C3A6EAE1A9B98F6BAD5E4D44BD0040376E4D2F1A5C5B733457CFF936D562E72E470C16B7FF6A70A1A4BF694A36772D28029CA31D7BDB22CE9D5ACA862FCB3801B154CA529B4BBA0D4304CAA479B0537A965C78D12C01F51C4928CB182115B166EA8927853C42DB7E383234946C6C8EB5AF902FB00568677F76799DE03BCFDDBED7DA95D351D10A10A3F68E062D5668E2EF98FF2846F721F2A53FF7EF94F2695E6F4FC60FBEA97C7A21DF1565109C369F443B901807AC4E5C4847E23FC371E7E6B57D70ECEEF10FA82E0CBD5520B513D7D82E684ABDA3E4313F6EFE4BC963F57924E0F77B74F75F67A0E1D3356DE2494ECF09CAF0D813D239AE5CA5D6E480A41CDF7CCB5C17AD
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:22:35 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_sha2_256s() {
use fips205::slh_dsa_sha2_256s::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
let mut rnd = TestRng::new();
let sk_seed = "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148032DCD739936737F2D";
let sk_prf = "B505D7CFAD1B497499323C8686325E4792F267AAFA3F87CA60D01CB54F29202A";
let pk_seed = "3E784CCB7EBCDCFD45542B7F6AF778742E0F4479175084AA488B3B74340678AA";
let opt_rand = "EE716762C15E3B72AA7650A63B9A510040B03C0FE70475C0463BBC45A0BA5B79";
rnd.push(&decode(opt_rand).unwrap());
rnd.push(&decode(pk_seed).unwrap());
rnd.push(&decode(sk_prf).unwrap());
rnd.push(&decode(sk_seed).unwrap());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("4A8AE2C2F3438CEB6209BE57224A493BA5E5F91E5B65EADEEB5A8343306AAF64BEF70BB5FA0DB96AF563A6CBA8A19733F08E16857436C1631033A51CA7E1CA258153F63CDF170F6512804D9D7933C5F65CDBD819D91FEB8FF20B9CBB7104CF86F10075D3A6FA38979AF475B9E7D4062D7B6015D12EA9024946DFCAB5F45CA5425C6931E52816087F9DAECB8747BBD71EA50B436183F51B4BEF8D61437E670E2C10DB8ADAA21B4EB646470C2EE2AAFC91D9D73600B629ECFE3151C841F2A4C194F07C8F1633ED2CC16301F57918F60964E4C9C44684F7732A80E1C6CDECC2833E0B1EA32C98DB6E4CD9BAD3D7A272D227CF1ACB9806E578DFCA10322F5FFF7798350E0EA996E9B96B06F41E217D091A096386D346E8FB334BCC3FB86C0A6B9DDB2E8C7033D87C91BC4A3486463C8BF00A76C6294A1939B44590E7D92997BD8C65199342F1179793696954C09F2BBDB93AA459C5CD6EF6FDAFB21F75232BA337BE5331606DA59FB07449E7D020FFCD0A306A97166332F5ABF6A46E520A88E994FAC603277E84F70F3D5EC20F289B252569271DD7DAEA22C92289E5745F975ADD69091D6B3A7961E3558A444D1B7CBB6D09B8B503762366F08E31DFA89B0406C67D54E352AC70FF0FAE12C74DF42543153E11799D866CC0ECD4B9902B289A544FF3D8D160872835648135FE946D98032CF5F9C60419A6EC4277D4C9C40517C141AE68465BB061F10B68D975CA65B9036A527FD548BDB14D41B4B4804AB82434241E361E0B5D0FB3FBDABB8C241BBA5DCACD0428C745D5A48CE5D4FDBBB24A45D8A48E6F76284A11F0E8B5B4B5491489E4A256BCF43C8F2340FE19C1314209618A5E7A9C63AD0ACEEBFD0F0F6840D2DB2079511850B1D565FF9EA40E055D40D459855F1A98CD28F8C563186AAF00541F8B6302C12772DA4256C08476FC49B2A7796349A21EC6B7EC517169264F7E8F1DD239A472D816D709D06FCB299998282CD1729A4AD652829419BC5FDCC4EA11B3CC049873CDCF7C4AD5C968E68929840E31132E83B6A100E03F0AD4B801A932D1917E5782788661EB365F57AFBD8E922DC31833150E5AC5543F2D4C7CA61B6195A3B91EB9E1BF8326EC345021C1D8C793C90B6888E27F78EE49C89088BC8A4524163AA73E3B34893D2FA9858F0BC72901BD18D261BF24F7E0D5764E42B0B12AC6E03F9C0E0807FC0F3113995DEDDAC083B939E6332A8B9F883976CD21D910CACDA410B18712434DDBC02565FCB782BA466AC49E8F43DE25E7FC5FCBCD3A22CFAFE81E0B340B6A91DDDC5F28A17977FA7F7DB6B9F4654525D8F2613662A6201BE8FE2064675BFE7A7653126832D37568FD8CDCF452BAF2509C38E75DD35C5BC003A8E26760FD07906790DF537A33F703D0FA30D4858E0FCDA1ECA09617A3D5E6980714B33E76989823B5A9C18F3B7DEC87155010394C40EBBD0918AE04DBBF7D1E273EFB536EFDF7F0036E7CB1EC98D8DC712570D1E588CF00FB8FA6985A70A4A9EA1E67B474C0F32C73350BEE497404274D6FD059204669570D50B04562025E841470C796799F9A79AEC181A2CA8E908E70D4FCFE6FAC8456B854B46A1F34A5861DA345E45C50001AE0BC355AB5F675765B587173E3B25CD2CFB93B5311BFE6814C8AFC954ED9A670300ADADEB8F393ADDAB5CAD3480695EC565B78C7C537760FC0AF9E536FAAC1864F095DEBDC840B3BDBD37842A8D4D084B782661AD2B4D2F40B4BE7BF7668149AC2948E0C2BC44D9F037161BB7C78F4CE2193DE336DB4F5282681137E844010ECA592CBEC572FC3D6DE9F2F25E650D51D20EE429B8539384BE17A5240D7D270869247FFB3FAF9DE652161658E94175B4E6B4E07C166265F651975895D70FE7987FE1FEE716A21EF43D87A55764517162A0FB3148B9158E21347FFE925261D9AA534D95E57A8443D9EFCE2085CC85EA433918451661C27201D056D08900662616AFF66AE67A3C95DF871A11BA42706EC4D44649DA25B3CA6E1F872B9CCFE557AE7D16F9A3C70B2512AB8AD41C2116C9008980088D8A5E07639B77FF7882773D08D941364F787EA374388CA8DA6B38BBA5EC15C94B553E5B79FCD67044F29B958DECD54512EE2895BFCE022957F57D3036661916C681B490197889E90E3819928126C37C1269B798E0E12A3F9F55093B2CE1A5F8CFE288A1C70EDDF1DF1DB40F09248881B4D7213A57F14E7435DB29DBC8632AD5FF077F1876BF8BE7FCE94788992CB6BCB86931946330F3274BF8CCF3234C6E158296281C72F3927A3EED59F5A9A64B445E7FEEB7C366780E8D4C97366726C24CB9EE399FED64F8B7571FBE3A50D2E726A99B12986483A452F59FD7FADECFF8F0165F51A5AB7A038095E8CEB0DD0960CFCE2138BAC278DA638F2848A13F11E846C8F03A631F719B4427C271648061398C03E073B30FACC2BDC360D9A9EAB13E583588A6D345EEA7A3CF9A7106F29E1BF376F8157B841AC5667583A2CC0E05F4BCB6730CD5B86C798E32254A3C41C5499BC7B3C3ADCC7E9E0D63D5E5CA559047CCE16B7E3F9FFFFEA0E36E52E7B6851C86D909E5DC6B90642038E32FFD6B285F79BCB7F7F294421C075E50ACAB3E81D21193FD374156644B4D7E338B127139BBE5181908BD25D5DF27CD92C810B1B0B733F0C68F40AD3C8C8A78748E01E67D7907091850CACC0EFEC04DE4E8EDA9ADD96714D4E150D827EF383DF1EFD1ABCA432F94A1AC4295531AC6A12239690488F3C28B8CB813F0C2D8614D4C6CFED11DE934999EE572BDA029E7AAB10AE33AECBBB89E3C4147567FDD730D93DE833825C18FD3730218980553C9A9F255E6CB394197297D7DFDEB19E688FAC821F76A53C9BF68CC523AC8A047D5E8F2
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:22:35 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}
#[test]
fn vector_slh_dsa_sha2_256f() {
use fips205::slh_dsa_sha2_256f::KG;
let m = decode("D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8").unwrap();
let mut rnd = TestRng::new();
let sk_seed = "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148032DCD739936737F2D";
let sk_prf = "B505D7CFAD1B497499323C8686325E4792F267AAFA3F87CA60D01CB54F29202A";
let pk_seed = "3E784CCB7EBCDCFD45542B7F6AF778742E0F4479175084AA488B3B74340678AA";
let opt_rand = "EE716762C15E3B72AA7650A63B9A510040B03C0FE70475C0463BBC45A0BA5B79";
rnd.push(&decode(opt_rand).unwrap());
rnd.push(&decode(pk_seed).unwrap());
rnd.push(&decode(sk_prf).unwrap());
rnd.push(&decode(sk_seed).unwrap());
let (pk, sk) = KG::try_keygen_with_rng_vt(&mut rnd).unwrap();
let sig_act = sk.try_sign_with_rng_ct(&mut rnd, &m, true).unwrap();
let sig_exp = decode("4A8AE2C2F3438CEB6209BE57224A493BA5E5F91E5B65EADEEB5A8343306AAF64C29A8D7A46B9748CCCFC0666C089F85D99A83E65C0D9EF9F997A93DC7361BAB38FCDC322F9A1428212E6CCA080BB62B7BB728E5D3B0E40E04AB7D4D3BDC2136A297EE79F8AED38F0FAEF46D10AF529C871D5A12EA1F978E753ECE5CC16A94DE30A2077D070A85D01EB35962A30803A60225C9FD6BAD91E3989E5C3C220A3E0BBB00F37CCBD3BD16CF01F9E80FB818AA04CEC364D1C4E66AC55CFC97C71973EA1418CE96D91782080E2D3BF727D635E4D35BB45FC7F948AFD082DDC697DA9BCD3248D5703E61D3CCA7A7F32C98EB260D78C14EF40C1EC5395DCB0751EC4F8ECD5B5139811E26F6DAAF4B62355BFB62F62B6B946BDC02BF1D5388E279F918504C7A99F446E8B13E510C41F19C17B656592164C5B5ADB64E6C73B3136D901B328034EE5C736FCFE36D36EEBD9EE29B496477A435A6A599E31B96354D74024DA0CAE5412A5210AA8FB58B3A969AFBF94BDB62B3F42E2811AB853359651A06278B478830991E729BAF74F46A8991943E5F77680DB5F8EE0BED282B3EE13B533BA679DC18E43B6B1851E6BDF402AB44601E53A79A28E17FD80353EBBBB53F91805C415392153E7EE787E5C53CD1C3764EA35535D43AD9A88C1190CA6F70B5B2843819C23629E1571F1A48F530CD2F510DBCA1537B635333F1F17FE75FB49302F0E00625D144748E028F71630BBC98EAC9DF503BA18E41F60B0A8878746FEFAF3B3BB03346EA26732787DA895F39297002CD28DFA07F924662ECB3DE5AD3D7C11B993EF4145BD9DDECF5E5B1064620C3CADC00295F94E5D4AE27182A4CE577BBB7B3EEFCA0DE50ED0DAA8C16D2166F010368DBC9C17D074F33110E4B28E311195A1B423D1FAF4AE1665E2243704F7EE39D41350B7B3E8AA8FD8C2655B19A015ED926CAE7AAD6C5B731590FF3D1964929B668D76D6B3EBF98FDD06225835975B496E97658C503F3F419EC66AE130E2ABBF98BDBA329CACBB0730B6D72332C9FC892C0CB6988E0DC03A8370565EB03E042B385704D633B334068766C184D1A7AADE355A4E0AF7F9703B4043A28957DDCD5A62F59B0223397DF3E3A94E2131E94452E5D113BC3432F79D1023C4BF16C21ED7FA136318AEDBE4F3AFDAF41D4B8A5E3A1931CDD75A030D420F25852FE98141E714B012352E473DB1305FD67D613DD9DB5C489125DE54696292C8E4D5C83E998C89CAA1DC6908E1B8C13B0CD870E9D2E151462DE4E120B309A11EA29305B678D570841E7B339565DBE2BDCC8466F211923D09B30B8DDDC10E3F65002FA4C602A8487782E63E54DBEC0E77F164DED3FD806CCAF1DC83DD8FD31C21F9E025613270D660ABC1D45DF3F57EC187AE0454993D48B7F35459FF7B6CC0E25FC0536D85310F235753B567E1A72565F214558DCBA1348C1F3FDA74677A1D7DA8DF433F3AA6F2C92226FA14BFAA3DB4E7289F377D4F1F9A5308F97F105FAE153C3E2A048798A17FA0A4C3073E62FED51ECC52F42E2403302F97E80124667C4C07940DCF7C96CC20EF96720FB8CFD1A9F78DCDE54235CAA26DC8BE1D2E6B7985945E195CEDF3487FF492A0FC61E44087943CCF093B9C1ACF689B2FF77E4D1DED1B372B712D7489E9244CF94D2362599554572BB4E0EFB2A93EAA6C8297C997FDAF09AA4D31B51C494C4AD06E78ED144FD5F365E2EA3C295A006D806566E20649117E9B006150584D31016DB182F5DF74775873DBCF1153E0F5E49902460667F7DEF85C6E9DBB3F70D65B3E71C6A52BC7B76934DC518AEEA0300C5902E87E6FBD57AB1DBAA6852FC991C20ABA3F116E60379B2DC5ABA5966BC83D1C2F175AD982D4777F4C9B40D6AD48D58C2B077C751BB44410D9864202B4264476C30FBEF498726FFC012E2B691D1671F5A9B6FBDD6BD2D066A0A4FACD4FA9746FFC0C4B347BB9BAE6C1D9C82288AED1FEC614ED5F4E15BC89B70A1DA19CD456E37FF5AD858DA2BC0A7C99B4A83B28FEDE2F62D2B0585CA8C05BD47E3A30B3869E750FCF08E52A30E773FDDF26BFB6132F905F5C174EB025D9FC1A832F0F05699B009522E3BB8AD3D587942DDEA53EFFB9324D28D448CCFB0F09696BC2F83C9A895A38C50415490393D9E2830D5430215D66AAAEC750B0F7D1B275386E78765705EDC2CF150C991EC91ABD10B8C5E1926963BCDF7C6E328659AE1862291BE48728B7D15143DDFF6A5C357BF0D14C98E5B9E678CC4F506C73A6488116BD25E2902EDDED67D3FECAC421722371B3D11636FF79E51138B49C87569BF1EF7540840EC24266F9168C03FCB7C630458A3869BD36D5D187AA90BC13D91689F329469FE8842D3809296C2A5CC890667DEAEA0830D3D6DC72329067271D7E40D94DEDD3542A2A7FBB45FD249E844A614706F311750E15849219EAE4C24E412A87CC16AFF4D0580C0239DD601889303D561C15CD9DBB73D1639247C0AD4C77A1E11BF2D187BD83FBE74A6019854586EE72419444E27814D2D163FF6F58CA869447609A51507C675743D32693669FE29B275AFD87377118B020EDE0962ACFB8ED06A3C5AA8BCAE9C8917123F9AE1AAFF4D629029876D2C61AC1994787E6B97B0DF5E670CE9E38237FD76D72865D676CC570B3876660A88F4322F6D40BE34F82FB22A46CD1334DD40ADFF9796EB9BE64AF2097F57D08C3B46451AA5251BE8017F8FD2C493978FBD118DA453E1AB9F04A5C8C373703AF94AB6589B52509200E203427085D2B4860F3A7C64D5181D578721A686DA2DD81E7F3CB93C460A3B162C6F9493EB4FFFD1086D9BE720EBC4050A066C877FDF47E90164ABC59BA0687E447C1D2FBF676929D20193368C4DCE8229EBC6A87E50DB70EF
assert_eq!(sig_act.len(), sig_exp.len());
assert_eq!(sig_act, *sig_exp);
let result = pk.try_verify_vt(&m, &sig_act).unwrap();
2024-02-10 00:22:35 +00:00
assert!(result, "Signature did not verify!");
2024-02-09 23:43:59 +00:00
}