use crate::sha01;
use alloc::vec::Vec;
#[must_use]
pub fn padding_for_length(input_length: usize) -> Vec<u8> {
sha01::padding_for_length(input_length)
}
#[must_use]
pub const fn padding_length_for_input_length(input_length: usize) -> usize {
sha01::padding_length_for_input_length(input_length)
}
#[must_use]
pub const fn compute_hash(input: &[u8]) -> [u8; 20] {
sha01::compute_hash(input, sha01::HashType::Sha1)
}
#[must_use]
pub const fn extend_hash(hash: [u8; 20], length: usize, additional_input: &[u8]) -> [u8; 20] {
sha01::extend_hash(hash, length, additional_input, sha01::HashType::Sha1)
}
#[cfg(test)]
mod tests {
use crate::sha1;
use alloc::vec::Vec;
#[test]
fn empty_hash() {
assert_eq!(
sha1::compute_hash(&[]),
[
0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60,
0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09
]
);
}
#[test]
fn a_test() {
assert_eq!(
sha1::compute_hash(b"a"),
[
0x86, 0xf7, 0xe4, 0x37, 0xfa, 0xa5, 0xa7, 0xfc, 0xe1, 0x5d, 0x1d, 0xdc, 0xb9, 0xea,
0xea, 0xea, 0x37, 0x76, 0x67, 0xb8
]
);
}
#[test]
fn quick_brown_fox_test() {
let s = b"The quick brown fox jumps over the lazy dog";
assert_eq!(
sha1::compute_hash(s),
[
0x2f, 0xd4, 0xe1, 0xc6, 0x7a, 0x2d, 0x28, 0xfc, 0xed, 0x84, 0x9e, 0xe1, 0xbb, 0x76,
0xe7, 0x39, 0x1b, 0x93, 0xeb, 0x12
]
);
}
#[test]
fn quick_brown_fox_test_2() {
let s = b"The quick brown fox jumps over the lazy cog";
assert_eq!(
sha1::compute_hash(s),
[
0xde, 0x9f, 0x2c, 0x7f, 0xd2, 0x5e, 0x1b, 0x3a, 0xfa, 0xd3, 0xe8, 0x5a, 0x0b, 0xd1,
0x7d, 0x9b, 0x10, 0x0d, 0xb4, 0xb3
]
);
}
#[test]
fn abc_test() {
let s = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\
abcdefghijklmnopqrstuvwxyz0123456789";
assert_eq!(
sha1::compute_hash(s),
[
0x76, 0x1c, 0x45, 0x7b, 0xf7, 0x3b, 0x14, 0xd2, 0x7e, 0x9e, 0x92, 0x65, 0xc4, 0x6f,
0x4b, 0x4d, 0xda, 0x11, 0xf9, 0x40
]
);
}
#[test]
fn long_test() {
assert_eq!(
sha1::compute_hash(&alloc::vec![b'a'; 1_000_000].into_boxed_slice()),
[
0x34, 0xaa, 0x97, 0x3c, 0xd4, 0xc4, 0xda, 0xa4, 0xf6, 0x1e, 0xeb, 0x2b, 0xdb, 0xad,
0x27, 0x31, 0x65, 0x34, 0x01, 0x6f
]
);
}
#[test]
fn padding_length_tests() {
assert_eq!(sha1::padding_length_for_input_length(0), 64);
assert_eq!(sha1::padding_length_for_input_length(1), 63);
assert_eq!(sha1::padding_length_for_input_length(2), 62);
assert_eq!(sha1::padding_length_for_input_length(3), 61);
assert_eq!(sha1::padding_length_for_input_length(4), 60);
assert_eq!(sha1::padding_length_for_input_length(50), 14);
assert_eq!(sha1::padding_length_for_input_length(54), 10);
assert_eq!(sha1::padding_length_for_input_length(55), 9);
assert_eq!(sha1::padding_length_for_input_length(56), 64 + 8);
assert_eq!(sha1::padding_length_for_input_length(57), 64 + 7);
assert_eq!(sha1::padding_length_for_input_length(62), 64 + 2);
assert_eq!(sha1::padding_length_for_input_length(63), 64 + 1);
assert_eq!(sha1::padding_length_for_input_length(64), 64);
assert_eq!(sha1::padding_length_for_input_length(128), 64);
assert_eq!(sha1::padding_length_for_input_length(64 * 100_000), 64);
}
#[test]
fn test_hash_ext() {
let secret = b"count=10&lat=37.351&user_id=1&\
long=-119.827&waffle=eggo";
let hash = sha1::compute_hash(secret);
let appended_str = b"&waffle=liege";
let combined_hash = sha1::extend_hash(hash, secret.len(), appended_str);
let mut concatenation = Vec::<u8>::new();
concatenation.extend_from_slice(secret);
let padding = sha1::padding_for_length(secret.len());
concatenation.extend_from_slice(padding.as_slice());
concatenation.extend_from_slice(appended_str);
assert_eq!(combined_hash, sha1::compute_hash(concatenation.as_slice()));
}
}