diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/passwordmaker/hmac.rs | 27 | ||||
-rw-r--r-- | src/passwordmaker/mod.rs | 4 |
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 |