Fix md5 padding for large inputs and add tests
This commit is contained in:
parent
f6744d3120
commit
4a107ff15f
@ -47,9 +47,10 @@ pub fn digest<B>(message: B) -> [u8; 16]
|
||||
let message = message.as_ref();
|
||||
let message_len = message.len();
|
||||
|
||||
let pad_len = 56 - (message_len % 56);
|
||||
let pad_len = 64 - (message_len + 8) % 64;
|
||||
|
||||
let input = [&message[..], &PADDING[..pad_len], &(message_len * 8).to_le_bytes()].concat();
|
||||
assert_eq!(input.len() % 64, 0, "Input length is not multiple of 64");
|
||||
|
||||
// Start state
|
||||
let mut a0 = 0x67452301_u32;
|
||||
@ -58,9 +59,10 @@ pub fn digest<B>(message: B) -> [u8; 16]
|
||||
let mut d0 = 0x10325476_u32;
|
||||
|
||||
for block in input.chunks(BLOCK_SIZE) {
|
||||
let m = block.chunks(4).map(|c| {
|
||||
u32::from_le_bytes(c.try_into().unwrap())
|
||||
}).collect::<Vec<_>>();
|
||||
let mut m = [0u32; 16];
|
||||
for (index, chunk) in block.chunks(BLOCK_SIZE / 16).enumerate() {
|
||||
m[index] = u32::from_le_bytes(chunk.try_into().unwrap());
|
||||
}
|
||||
|
||||
let (mut a, mut b, mut c, mut d) = (a0, b0, c0, d0);
|
||||
|
||||
@ -99,3 +101,42 @@ pub fn hexdigest<B>(message: B) -> String
|
||||
acc
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn input_below_block_size() {
|
||||
let dig = digest("abc");
|
||||
let expect = [0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0, 0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72];
|
||||
assert_eq!(dig, expect);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn input_requiring_full_padding() {
|
||||
let dig = digest("abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh");
|
||||
let expect = [0x6F, 0xB1, 0xBD, 0xC4, 0xB5, 0x9E, 0x00, 0x6F, 0xC6, 0x16, 0x5D, 0xED, 0xCE, 0xEE, 0xCD, 0x0E];
|
||||
assert_eq!(dig, expect);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn input_at_block_size() {
|
||||
let dig = digest("abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh");
|
||||
let expect = [0x66, 0x03, 0xAE, 0x35, 0x36, 0xDB, 0x4D, 0x48, 0x77, 0x9B, 0x5A, 0x7A, 0xA9, 0x4C, 0x0C, 0x99];
|
||||
assert_eq!(dig, expect);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn input_over_block_size() {
|
||||
let dig = digest("abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh");
|
||||
let expect = [0x9C, 0xF4, 0x4C, 0xED, 0x66, 0x66, 0x84, 0xF3, 0x7B, 0x48, 0x93, 0x18, 0xD6, 0x77, 0x64, 0x4A];
|
||||
assert_eq!(dig, expect);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn converts_digest_to_hexadecimal_string() {
|
||||
let dig = hexdigest("abc");
|
||||
assert_eq!(dig, "900150983cd24fb0d6963f7d28e17f72");
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user