aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Grois <andi@grois.info>2023-01-20 21:03:08 +0100
committerAndreas Grois <andi@grois.info>2023-01-20 21:13:39 +0100
commit212f20c72d703908f6e81b5d569b33d9f5a6ee85 (patch)
tree35e135e437375640cefd62398ad9fabc300891ce /src
parenta55761caefadafbd88a743dd1f6d5811f6791b86 (diff)
Simplify HMAC function.v0.2.0
It's quite a bit faster, and easier to understand.
Diffstat (limited to 'src')
-rw-r--r--src/passwordmaker/hmac.rs27
-rw-r--r--src/passwordmaker/mod.rs4
2 files changed, 14 insertions, 17 deletions
diff --git a/src/passwordmaker/hmac.rs b/src/passwordmaker/hmac.rs
index 62b77fd..339f7ef 100644
--- a/src/passwordmaker/hmac.rs
+++ b/src/passwordmaker/hmac.rs
@@ -1,26 +1,23 @@
use crate::Hasher;
-pub(super) fn hmac<T, K, M>(key : K, data : M) -> T::Output
+pub(super) fn hmac<T, M>(key : &[u8], data : M) -> T::Output
where T : Hasher,
T::Output : AsRef<[u8]>,
- K : Iterator<Item=u8>,
M : Iterator<Item=u8>,
{
- let key = key.collect::<Vec<_>>();
+ //Sorry for this uglyness. key_hash is an Option because we don't want to compute it if we don't need it, but
+ //we also want to be able to reference it in case it's needed.
let key_hash = if key.len() > 64 { Some(T::hash(&key)) } else { None };
- let key = key_hash.as_ref().map(T::Output::as_ref).map(<&[u8]>::into_iter).unwrap_or_else(|| (&key).into_iter()).copied();
+ let key = key_hash.as_ref().map(T::Output::as_ref).map(<&[u8]>::into_iter)
+ .unwrap_or_else(|| (&key).into_iter()).copied();
- let key = key.chain(std::iter::repeat(0)); //if key[i] does not exist, use 0 instead.
+ let key = key
+ .chain(std::iter::repeat(0)) //if key[i] does not exist, use 0 instead.
+ .take(64); //and the pads have 64 bytes
- let mut inner_pad = [0u8;64];
- let mut outer_pad = [0u8;64];
+ let inner_pad = key.clone().map(|k| k ^ 0x36);
+ let outer_pad = key.map(|k| k ^ 0x5C);
- let pads = inner_pad.iter_mut().zip(outer_pad.iter_mut());
- for ((i,o),k) in pads.zip(key) {
- *i = k ^ 0x36;
- *o = k ^ 0x5C;
- }
-
- let hash = T::hash(&inner_pad.iter().copied().chain(data).collect::<Vec<_>>());
- T::hash(&outer_pad.iter().chain(hash.as_ref().iter()).copied().collect::<Vec<_>>())
+ let hash = T::hash(&inner_pad.chain(data).collect::<Vec<_>>());
+ T::hash(&outer_pad.chain(hash.as_ref().iter().copied()).collect::<Vec<_>>())
} \ No newline at end of file
diff --git a/src/passwordmaker/mod.rs b/src/passwordmaker/mod.rs
index db01a78..e266b2b 100644
--- a/src/passwordmaker/mod.rs
+++ b/src/passwordmaker/mod.rs
@@ -112,7 +112,7 @@ impl<'y, H : super::HasherList> super::PasswordMaker<'y, H>{
let data = leetified_data.as_deref().unwrap_or(data);
let key = yeet_upper_bytes(&key);
let data = yeet_upper_bytes(data);
- let hash = hmac::hmac::<H::MD5,_,_>(key, data);
+ let hash = hmac::hmac::<H::MD5,_>(&key.collect::<Vec<_>>(), data);
let grapheme_indices = hash.convert_to_base(characters.len());
GetGraphemesIterator { graphemes : characters, inner: GetGraphemesIteratorInner::V06(grapheme_indices)}
}
@@ -244,7 +244,7 @@ fn modern_hmac_to_grapheme_indices<T>(key : &str, data: &str, divisor : usize) -
where T:Hasher,
<T as Hasher>::Output: BaseConversion + AsRef<[u8]>
{
- hmac::hmac::<T,_,_>(key.bytes(), data.bytes()).convert_to_base(divisor)
+ hmac::hmac::<T,_>(key.as_bytes(), data.bytes()).convert_to_base(divisor)
}
fn modern_message_to_grapheme_indices<T>(data: &str, divisor : usize) -> <<T as Hasher>::Output as BaseConversion>::Output