chiark / gitweb /
own hmac, tests, pass
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 1 Aug 2021 00:12:35 +0000 (01:12 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 1 Aug 2021 00:12:35 +0000 (01:12 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/utils.rs

index a47b84802b595aacd4c2452a9197a3ec0ba2fe4e..868dd1108cb26f7d204609ba76ba2619390d3ba8 100644 (file)
@@ -19,13 +19,15 @@ impl<T,E> Result<T,E> where AE: From<E> {
 use sha2::Digest as _;
 
 type HmacH = sha2::Sha256;
+const HMAC_B: usize = 64;
 const HMAC_L: usize = 32;
 
-fn token_hmac(key: &[u8], message: &[u8]) -> [u8; HMAC_L] {
+pub fn token_hmac(key: &[u8], message: &[u8]) -> [u8; HMAC_L] {
   let key = {
-    let mut padded = [0; HMAC_L];
-    if key.len() > HMAC_L {
-      padded = HmacH::digest(key).into();
+    let mut padded = [0; HMAC_B];
+    if key.len() > padded.len() {
+      let digest: [u8; HMAC_L] = HmacH::digest(key).into();
+      padded[0..HMAC_L].copy_from_slice(&digest);
     } else {
       padded[0.. key.len()].copy_from_slice(key);
     }
@@ -34,6 +36,8 @@ fn token_hmac(key: &[u8], message: &[u8]) -> [u8; HMAC_L] {
   let mut ikey = key;  for k in &mut ikey { *k ^= 0x36; }
   let mut okey = key;  for k in &mut okey { *k ^= 0x5C; }
 
+//dbg!(&key, &ikey, &okey);
+
   let h1 = HmacH::new()
     .chain(&ikey)
     .chain(message)
@@ -129,7 +133,7 @@ fn hmac_test_vectors(){
 "#;
   let vectors = regex_replace_all!{
     r#"\(.*\)"#,
-    vectors,
+    vectors.trim_end(),
     |_| "",
   };
   let vectors = regex_replace_all!{