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::Sha0)
}
#[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::Sha0)
}
#[cfg(test)]
mod tests {
use crate::sha0;
use alloc::vec::Vec;
#[test]
fn abc_test() {
assert_eq!(
sha0::compute_hash(b"abc"),
[
0x01, 0x64, 0xb8, 0xa9, 0x14, 0xcd, 0x2a, 0x5e, 0x74, 0xc4, 0xf7, 0xff, 0x08, 0x2c,
0x4d, 0x97, 0xf1, 0xed, 0xf8, 0x80
]
);
}
#[test]
fn slightly_longer_test() {
let input = b"abcdbcdecdefdefgefghfghighi\
jhijkijkljklmklmnlmnomnopnopq";
assert_eq!(
sha0::compute_hash(input),
[
0xd2, 0x51, 0x6e, 0xe1, 0xac, 0xfa, 0x5b, 0xaf, 0x33, 0xdf, 0xc1, 0xc4, 0x71, 0xe4,
0x38, 0x44, 0x9e, 0xf1, 0x34, 0xc8
]
);
}
#[test]
fn padding_length_tests() {
assert_eq!(sha0::padding_length_for_input_length(0), 64);
assert_eq!(sha0::padding_length_for_input_length(1), 63);
assert_eq!(sha0::padding_length_for_input_length(2), 62);
assert_eq!(sha0::padding_length_for_input_length(3), 61);
assert_eq!(sha0::padding_length_for_input_length(4), 60);
assert_eq!(sha0::padding_length_for_input_length(50), 14);
assert_eq!(sha0::padding_length_for_input_length(54), 10);
assert_eq!(sha0::padding_length_for_input_length(55), 9);
assert_eq!(sha0::padding_length_for_input_length(56), 64 + 8);
assert_eq!(sha0::padding_length_for_input_length(57), 64 + 7);
assert_eq!(sha0::padding_length_for_input_length(62), 64 + 2);
assert_eq!(sha0::padding_length_for_input_length(63), 64 + 1);
assert_eq!(sha0::padding_length_for_input_length(64), 64);
assert_eq!(sha0::padding_length_for_input_length(128), 64);
assert_eq!(sha0::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 = sha0::compute_hash(secret);
let appended_str = b"&waffle=liege";
let combined_hash = sha0::extend_hash(hash, secret.len(), appended_str);
let mut concatenation = Vec::<u8>::new();
concatenation.extend_from_slice(secret);
let padding = sha0::padding_for_length(secret.len());
concatenation.extend_from_slice(padding.as_slice());
concatenation.extend_from_slice(appended_str);
assert_eq!(combined_hash, sha0::compute_hash(concatenation.as_slice()));
}
}