added SHA1
This commit is contained in:
parent
e9ab63efe4
commit
40e2593a5e
2 changed files with 29 additions and 13 deletions
|
@ -39,7 +39,7 @@ fn pad(message: impl AsRef<[u8]>) -> Vec<u8> {
|
||||||
message
|
message
|
||||||
}
|
}
|
||||||
|
|
||||||
fn step([mut a, b, c, d, e]: [u32; 5], words: &[u32], i: usize) -> [u32; 5] {
|
fn step([a, b, c, d, e]: [u32; 5], words: &[u32], i: usize) -> [u32; 5] {
|
||||||
let (k, f) = match i {
|
let (k, f) = match i {
|
||||||
0..=19 => (K1, F1),
|
0..=19 => (K1, F1),
|
||||||
20..=39 => (K2, F2),
|
20..=39 => (K2, F2),
|
||||||
|
@ -48,19 +48,22 @@ fn step([mut a, b, c, d, e]: [u32; 5], words: &[u32], i: usize) -> [u32; 5] {
|
||||||
_ => panic!("step function should not be called with index outside of range 0..80"),
|
_ => panic!("step function should not be called with index outside of range 0..80"),
|
||||||
};
|
};
|
||||||
|
|
||||||
a = a
|
[
|
||||||
.rotate_left(5)
|
a.rotate_left(5)
|
||||||
.wrapping_add(f(b, c, d))
|
.wrapping_add(f(b, c, d))
|
||||||
.wrapping_add(e)
|
.wrapping_add(e)
|
||||||
.wrapping_add(k)
|
.wrapping_add(k)
|
||||||
.wrapping_add(words[i]);
|
.wrapping_add(words[i]),
|
||||||
|
a,
|
||||||
[e, a, b.rotate_left(30), c, d]
|
b.rotate_left(30),
|
||||||
|
c,
|
||||||
|
d,
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Computes the SHA1 digest of the input bytes.
|
/// Computes the SHA1 digest of the input bytes.
|
||||||
///
|
///
|
||||||
/// Returns a `Digest<20>` which implements `Display` in order to get at hexadecimal-string representation.
|
/// Returns a 20-byte long `Digest` which implements `Display` in order to get at hexadecimal-string representation.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
|
@ -78,8 +81,13 @@ pub fn hash(message: impl AsRef<[u8]>) -> Digest<20> {
|
||||||
let buffer = padded
|
let buffer = padded
|
||||||
.array_chunks::<64>()
|
.array_chunks::<64>()
|
||||||
.map(|chunk| bytes_to_words_be(*chunk))
|
.map(|chunk| bytes_to_words_be(*chunk))
|
||||||
.fold([H0, H1, H2, H3, H4], |[a, b, c, d, e], words| {
|
.fold([H0, H1, H2, H3, H4], |[a, b, c, d, e], mut words| {
|
||||||
// extend 16 words to 80 words
|
// extend 16 words to 80 words
|
||||||
|
for i in 16..80 {
|
||||||
|
words.push(
|
||||||
|
(words[i - 3] ^ words[i - 8] ^ words[i - 14] ^ words[i - 16]).rotate_left(1),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// initialize state
|
// initialize state
|
||||||
let mut state = [a, b, c, d, e];
|
let mut state = [a, b, c, d, e];
|
||||||
|
@ -127,6 +135,14 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn sha1_hash() {
|
fn sha1_hash() {
|
||||||
// panic!();
|
assert_eq!(
|
||||||
|
hash("").to_string(),
|
||||||
|
"da39a3ee5e6b4b0d3255bfef95601890afd80709"
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
hash("abc").to_string(),
|
||||||
|
"a9993e364706816aba3e25717850c26c9cd0d89d"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#![feature(array_chunks)]
|
#![feature(array_chunks)]
|
||||||
// lints
|
// lints
|
||||||
#![deny(missing_docs)]
|
#![deny(missing_docs)]
|
||||||
#![warn(clippy::all, clippy::pedantic, clippy::nursery, clippy::cargo)]
|
#![warn(clippy::all, clippy::pedantic, clippy::cargo)]
|
||||||
#![allow(
|
#![allow(
|
||||||
clippy::unreadable_literal,
|
clippy::unreadable_literal,
|
||||||
clippy::missing_panics_doc,
|
clippy::missing_panics_doc,
|
||||||
|
|
Loading…
Reference in a new issue