From 342a34b9e9062e88b80f3e5cc8db392f3752511e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 1 Aug 2021 01:03:17 +0100 Subject: [PATCH] own hmac, tests, fail Signed-off-by: Ian Jackson --- src/prelude.rs | 2 +- src/utils.rs | 117 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 117 insertions(+), 2 deletions(-) diff --git a/src/prelude.rs b/src/prelude.rs index 8794519..392faea 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -18,7 +18,7 @@ pub use std::path::{Path, PathBuf}; pub use std::panic; pub use std::process; pub use std::pin::Pin; -pub use std::str::FromStr; +pub use std::str::{self, FromStr}; pub use std::sync::Arc; pub use std::task::Poll; diff --git a/src/utils.rs b/src/utils.rs index 95498f9..a47b848 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -21,7 +21,6 @@ use sha2::Digest as _; type HmacH = sha2::Sha256; const HMAC_L: usize = 32; -#[throws(AE)] fn token_hmac(key: &[u8], message: &[u8]) -> [u8; HMAC_L] { let key = { let mut padded = [0; HMAC_L]; @@ -45,3 +44,119 @@ fn token_hmac(key: &[u8], message: &[u8]) -> [u8; HMAC_L] { .finalize(); h2.into() } + +#[test] +fn hmac_test_vectors(){ + let vectors = r#" + Key = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b + 0b0b0b0b (20 bytes) + Data = 4869205468657265 ("Hi There") + + HMAC-SHA-256 = b0344c61d8db38535ca8afceaf0bf12b + 881dc200c9833da726e9376c2e32cff7 + + + Key = 4a656665 ("Jefe") + Data = 7768617420646f2079612077616e7420 ("what do ya want ") + 666f72206e6f7468696e673f ("for nothing?") + + HMAC-SHA-256 = 5bdcc146bf60754e6a042426089575c7 + 5a003f089d2739839dec58b964ec3843 + + + Key = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaa (20 bytes) + Data = dddddddddddddddddddddddddddddddd + dddddddddddddddddddddddddddddddd + dddddddddddddddddddddddddddddddd + dddd (50 bytes) + + HMAC-SHA-256 = 773ea91e36800e46854db8ebd09181a7 + 2959098b3ef8c122d9635514ced565fe + + + Key = 0102030405060708090a0b0c0d0e0f10 + 111213141516171819 (25 bytes) + Data = cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd + cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd + cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd + cdcd (50 bytes) + + HMAC-SHA-256 = 82558a389a443c0ea4cc819899f2083a + 85f0faa3e578f8077a2e3ff46729665b + + + + Key = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaa (131 bytes) + Data = 54657374205573696e67204c61726765 ("Test Using Large") + 72205468616e20426c6f636b2d53697a ("r Than Block-Siz") + 65204b6579202d2048617368204b6579 ("e Key - Hash Key") + 204669727374 (" First") + + HMAC-SHA-256 = 60e431591ee0b67f0d8a26aacbf5b77f + 8e0bc6213728c5140546040f0ee37f54 + + Key = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaa (131 bytes) + Data = 54686973206973206120746573742075 ("This is a test u") + 73696e672061206c6172676572207468 ("sing a larger th") + 616e20626c6f636b2d73697a65206b65 ("an block-size ke") + 7920616e642061206c61726765722074 ("y and a larger t") + 68616e20626c6f636b2d73697a652064 ("han block-size d") + 6174612e20546865206b6579206e6565 ("ata. The key nee") + 647320746f2062652068617368656420 ("ds to be hashed ") + 6265666f7265206265696e6720757365 ("before being use") + 642062792074686520484d414320616c ("d by the HMAC al") + 676f726974686d2e ("gorithm.") + + HMAC-SHA-256 = 9b09ffa71b942fcb27635fbcd5b0e944 + bfdc63644f0713938a7f51535c3a35e2 +"#; + let vectors = regex_replace_all!{ + r#"\(.*\)"#, + vectors, + |_| "", + }; + let vectors = regex_replace_all!{ + r#" *\n "#, + &vectors, + |_| "", + }; + let vectors = regex_replace_all!{ + r#"\s*\n"#, + &vectors, + |_| "\n", + }; + let mut lines = vectors.split('\n'); + assert_eq!( lines.next().unwrap(), "" ); + let mut get = |prefix| { + let l = lines.next()?; + dbg!(l); + let b = l.strip_prefix(prefix).unwrap().as_bytes().chunks(2) + .map(|s| str::from_utf8(s).unwrap()) + .map(|s| { assert_eq!(s.len(), 2); u8::from_str_radix(s,16).unwrap() }) + .collect::>(); + Some(b) + }; + while let Some(key) = get(" Key = ") { + let data = get(" Data = ").unwrap(); + let exp = get(" HMAC-SHA-256 = ").unwrap(); + let got = token_hmac(&key, &data); + assert_eq!(&got[..], &exp); + } +} -- 2.30.2