From 930f0a7af93dd5c954e7c289be82eecdbeaa3585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=5BArtyom=20Pavlov=5D?= Date: Thu, 6 Nov 2025 04:02:58 +0300 Subject: [PATCH 1/2] hkdf: migrate RFC 5869 tests to blobby --- hkdf/tests/data/rfc5869_sha1.blb | Bin 0 -> 632 bytes hkdf/tests/data/rfc5869_sha256.blb | Bin 0 -> 569 bytes hkdf/tests/rfc5869.rs | 204 ++++++----------------------- 3 files changed, 37 insertions(+), 167 deletions(-) create mode 100644 hkdf/tests/data/rfc5869_sha1.blb create mode 100644 hkdf/tests/data/rfc5869_sha256.blb diff --git a/hkdf/tests/data/rfc5869_sha1.blb b/hkdf/tests/data/rfc5869_sha1.blb new file mode 100644 index 0000000000000000000000000000000000000000..2dd0b90d7f611321f555137f1697e2d6aeb15258 GIT binary patch literal 632 zcmWe(5aUJwDF#L+W)@a9b`DN1ZXS^jA3uHm^7Y&IA3rr_=SUneTE4%Zukgg{jxU?J zS7|SD4&jJmd?hXLIn$V}JM8_^wT(+YdN=7ubBboHJbUG1=-)+$^qf>GF0+3AF|9!X z#bjPSegQ!tVG&U=aS2H&X&G5Lc?Cr!WffI5bq!4|Z5>@beFH-yV-r&|a|=r=Ya3fT zdk04+XBSsDcMnf5Zy#Sj{|1GG#H8eu)U@=B%&hF3+`RmP!lL4m(z5c3%Bt#`+PeCN z#-`?$*0%PJ&aUpB-oE|`6DLicGIiSY88c_io-=pe`~?daEnc#8+42=DSFK*NcHR00 zg$)}wZQinV+x8thckSM@ci;X42M--Sa`f2o6DLodK6Ccm`3n~>UA}Vl+VvYZZ{5Cg z_ul;n4<9{#^7PsB7cXDEe)IO-dqjBs`u*qczyBItw;s&WGAM|2?=_gMc0@2r$>-O% z1{Ln>12}cJY8G)`LoI9O-!4_ zZ9MW8*F3&F{VlUk{oH>WW8x+in_X~`_i<);bpFGI3EV-Kx9A|E5ShimpmD3GtN8e@ za*e)YU!NbEUXiunvMyr?*TMA#Oq;JKUVIuf#OSc?=EvpuNJZhvuK@xm(x zX4?mrEtfqdba=1=put*qPTi6ypI4($zE*GJTzk7>;nuq$IuiwpSgyN%4&Y7BO8Vx{ hwRzW5k5$1}ls8=bRJVKC*Qe=L9I^#xp0D}i0RRiu9s~dY literal 0 HcmV?d00001 diff --git a/hkdf/tests/data/rfc5869_sha256.blb b/hkdf/tests/data/rfc5869_sha256.blb new file mode 100644 index 0000000000000000000000000000000000000000..5bf75c97efbe5024810a78d3ccae1d8e6ba27dc6 GIT binary patch literal 569 zcmd;Q6ywGU7^N5(nV4Bv+1NQaxwv^mK79Q2`ODXD-+%mcU@zx1)6p}!&wIz7_ek}w zDzDk-a|s;O&eYH91}>ggL8 z8X23InweWzT3OrJ+SxleIyt+zy19FJdU^Z!`uR5~BqSy!r=+H(XJlq&=j7()7Zes1 zmz0*3S5#J2*VNY4H#9aix3spkcXW1j_w@GlPnbAq@|3C5rq7r;YxbPE^X4yDxM=Z` zrOTGDSh;HTnzifJHz;h_xM}m2t=qQm*tu)>p1u3_A2@jE@R6g(j-NPr>hzhj=gwca zc|p1*kc>h+tq@7^QA?$_@>fB*e=U|Y7MCnDHP zicP?0&TG>xG4IP5L?*ZuGI~kcI~gW1he|W6VJc*L}q!K_%rI=()Igw zV?n?fAIbGAYa&^qW}Z6UR8)A{@mO3WALlKj(gYrT&K+julUJ@;e7o?B!O_ObH+Jm@ zeHgDE{Os&6+s??q;2`;4WwB0SwOGCJO4?5OTbDAZjcgge8 srO5~T3*#HK*leNS@35<1yiIYh?py`oslS$NlbUt{0A?2bmjD0& literal 0 HcmV?d00001 diff --git a/hkdf/tests/rfc5869.rs b/hkdf/tests/rfc5869.rs index af392f0..3ba3685 100644 --- a/hkdf/tests/rfc5869.rs +++ b/hkdf/tests/rfc5869.rs @@ -1,182 +1,52 @@ -use hex_literal::hex; -use hkdf::{Hkdf, hmac::EagerHash}; -use sha1::Sha1; -use sha2::Sha256; +//! Test vectors from https://tools.ietf.org/html/rfc5869 +use hkdf::{GenericHkdf, HmacImpl}; +use hmac::{Hmac, SimpleHmac}; -struct Test<'a> { - ikm: &'a [u8], - salt: &'a [u8], - info: &'a [u8], - prk: &'a [u8], - okm: &'a [u8], +#[derive(Copy, Clone, Debug)] +struct TestVector { + ikm: &'static [u8], + salt: &'static [u8], + info: &'static [u8], + prk: &'static [u8], + okm: &'static [u8], } -fn rfc_test(tests: &[Test]) { +fn test(tvs: &[TestVector]) { let mut buf = [0u8; 128]; - for test in tests.iter() { - let salt = if test.salt.is_empty() { + for tv in tvs { + let salt = if tv.salt.is_empty() { None } else { - Some(test.salt) + Some(tv.salt) }; - let (prk2, hkdf) = Hkdf::::extract(salt, test.ikm); - let okm = &mut buf[..test.okm.len()]; - assert!(hkdf.expand(test.info, okm).is_ok()); + let (prk2, hkdf) = GenericHkdf::::extract(salt, tv.ikm); + let okm = &mut buf[..tv.okm.len()]; + assert!(hkdf.expand(tv.info, okm).is_ok()); - assert_eq!(prk2[..], test.prk[..]); - assert_eq!(okm, test.okm); + assert_eq!(prk2[..], tv.prk[..]); + assert_eq!(okm, tv.okm); okm.fill(0); - let hkdf = Hkdf::::from_prk(test.prk).unwrap(); - assert!(hkdf.expand(test.info, okm).is_ok()); - assert_eq!(okm, test.okm); + let hkdf = GenericHkdf::::from_prk(tv.prk).unwrap(); + assert!(hkdf.expand(tv.info, okm).is_ok()); + assert_eq!(okm, tv.okm); } } -// Test Vectors from https://tools.ietf.org/html/rfc5869. -#[test] -fn test_rfc5869_sha256() { - rfc_test::(&[ - // Test Case 1 - Test { - ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), - salt: &hex!("000102030405060708090a0b0c"), - info: &hex!("f0f1f2f3f4f5f6f7f8f9"), - prk: &hex!( - "077709362c2e32df0ddc3f0dc47bba63" - "90b6c73bb50f9c3122ec844ad7c2b3e5" - ), - okm: &hex!( - "3cb25f25faacd57a90434f64d0362f2a" - "2d2d0a90cf1a5a4c5db02d56ecc4c5bf" - "34007208d5b887185865" - ), - }, - // Test Case 2 - Test { - ikm: &hex!( - "000102030405060708090a0b0c0d0e0f" - "101112131415161718191a1b1c1d1e1f" - "202122232425262728292a2b2c2d2e2f" - "303132333435363738393a3b3c3d3e3f" - "404142434445464748494a4b4c4d4e4f" - ), - salt: &hex!( - "606162636465666768696a6b6c6d6e6f" - "707172737475767778797a7b7c7d7e7f" - "808182838485868788898a8b8c8d8e8f" - "909192939495969798999a9b9c9d9e9f" - "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" - ), - info: &hex!( - "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" - "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" - "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" - "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" - ), - prk: &hex!( - "06a6b88c5853361a06104c9ceb35b45c" - "ef760014904671014a193f40c15fc244" - ), - okm: &hex!( - "b11e398dc80327a1c8e7f78c596a4934" - "4f012eda2d4efad8a050cc4c19afa97c" - "59045a99cac7827271cb41c65e590e09" - "da3275600c2f09b8367793a9aca3db71" - "cc30c58179ec3e87c14c01d5c1f3434f" - "1d87" - ), - }, - // Test Case 3 - Test { - ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), - salt: &hex!(""), - info: &hex!(""), - prk: &hex!( - "19ef24a32c717b167f33a91d6f648bdf" - "96596776afdb6377ac434c1c293ccb04" - ), - okm: &hex!( - "8da4e775a563c18f715f802a063c5a31" - "b8a11f5c5ee1879ec3454e5f3c738d2d" - "9d201395faa4b61a96c8" - ), - }, - ]); -} +macro_rules! new_test { + ($name:ident, $hash:ty) => { + #[test] + fn $name() { + blobby::parse_into_structs!( + include_bytes!(concat!("data/", stringify!($name), ".blb")); + static TEST_VECTORS: &[TestVector { ikm, salt, info, prk, okm }]; + ); -#[test] -fn test_rfc5869_sha1() { - rfc_test::(&[ - // Test Case 4 - Test { - ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b"), - salt: &hex!("000102030405060708090a0b0c"), - info: &hex!("f0f1f2f3f4f5f6f7f8f9"), - prk: &hex!("9b6c18c432a7bf8f0e71c8eb88f4b30baa2ba243"), - okm: &hex!( - "085a01ea1b10f36933068b56efa5ad81" - "a4f14b822f5b091568a9cdd4f155fda2" - "c22e422478d305f3f896" - ), - }, - // Test Case 5 - Test { - ikm: &hex!( - "000102030405060708090a0b0c0d0e0f" - "101112131415161718191a1b1c1d1e1f" - "202122232425262728292a2b2c2d2e2f" - "303132333435363738393a3b3c3d3e3f" - "404142434445464748494a4b4c4d4e4f" - ), - salt: &hex!( - "606162636465666768696a6b6c6d6e6f" - "707172737475767778797a7b7c7d7e7f" - "808182838485868788898a8b8c8d8e8f" - "909192939495969798999a9b9c9d9e9f" - "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" - ), - info: &hex!( - "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" - "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" - "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" - "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff" - ), - prk: &hex!("8adae09a2a307059478d309b26c4115a224cfaf6"), - okm: &hex!( - "0bd770a74d1160f7c9f12cd5912a06eb" - "ff6adcae899d92191fe4305673ba2ffe" - "8fa3f1a4e5ad79f3f334b3b202b2173c" - "486ea37ce3d397ed034c7f9dfeb15c5e" - "927336d0441f4c4300e2cff0d0900b52" - "d3b4" - ), - }, - // Test Case 6 - Test { - ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), - salt: &hex!(""), - info: &hex!(""), - prk: &hex!("da8c8a73c7fa77288ec6f5e7c297786aa0d32d01"), - okm: &hex!( - "0ac1af7002b3d761d1e55298da9d0506" - "b9ae52057220a306e07b6b87e8df21d0" - "ea00033de03984d34918" - ), - }, - // Test Case 7 - Test { - ikm: &hex!("0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c"), - salt: &hex!(""), // "Not Provided" - info: &hex!(""), - prk: &hex!("2adccada18779e7c2077ad2eb19d3f3e731385dd"), - okm: &hex!( - "2c91117204d745f3500d636a62f64f0a" - "b3bae548aa53d423b0d1f27ebba6f5e5" - "673a081d70cce7acfc48" - ), - }, - ]); + test::>(TEST_VECTORS); + test::>(TEST_VECTORS); + } + }; } + +new_test!(rfc5869_sha1, sha1::Sha1); +new_test!(rfc5869_sha256, sha2::Sha256); From 84b1a7801a2f572836f14809dabef1cdb267a083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=5BArtyom=20Pavlov=5D?= Date: Thu, 6 Nov 2025 04:05:23 +0300 Subject: [PATCH 2/2] rename variable --- hkdf/tests/rfc5869.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hkdf/tests/rfc5869.rs b/hkdf/tests/rfc5869.rs index 3ba3685..67ed921 100644 --- a/hkdf/tests/rfc5869.rs +++ b/hkdf/tests/rfc5869.rs @@ -20,16 +20,16 @@ fn test(tvs: &[TestVector]) { Some(tv.salt) }; let (prk2, hkdf) = GenericHkdf::::extract(salt, tv.ikm); - let okm = &mut buf[..tv.okm.len()]; - assert!(hkdf.expand(tv.info, okm).is_ok()); + let okm_dst = &mut buf[..tv.okm.len()]; + assert!(hkdf.expand(tv.info, okm_dst).is_ok()); assert_eq!(prk2[..], tv.prk[..]); - assert_eq!(okm, tv.okm); + assert_eq!(okm_dst, tv.okm); - okm.fill(0); + okm_dst.fill(0); let hkdf = GenericHkdf::::from_prk(tv.prk).unwrap(); - assert!(hkdf.expand(tv.info, okm).is_ok()); - assert_eq!(okm, tv.okm); + assert!(hkdf.expand(tv.info, okm_dst).is_ok()); + assert_eq!(okm_dst, tv.okm); } }