//! Test vectors from . #![allow(clippy::unwrap_used, reason = "tests")] use hkdf::{GenericHkdf, HmacImpl}; use hmac::{Hmac, SimpleHmac}; #[derive(Copy, Clone, Debug)] struct TestVector { ikm: &'static [u8], salt: &'static [u8], info: &'static [u8], prk: &'static [u8], okm: &'static [u8], } fn test(tvs: &[TestVector]) { let mut buf = [0u8; 128]; for tv in tvs { let salt = if tv.salt.is_empty() { None } else { Some(tv.salt) }; let (prk2, hkdf) = GenericHkdf::::extract(salt, tv.ikm); 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_dst, tv.okm); okm_dst.fill(0); let hkdf = GenericHkdf::::from_prk(tv.prk).unwrap(); assert!(hkdf.expand(tv.info, okm_dst).is_ok()); assert_eq!(okm_dst, tv.okm); } } 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::>(TEST_VECTORS); test::>(TEST_VECTORS); } }; } new_test!(rfc5869_sha1, sha1::Sha1); new_test!(rfc5869_sha256, sha2::Sha256);