From 70532c0df77f67820f88a9118a00071902f4ffdf Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 23 Mar 2015 00:16:26 -0400 Subject: let find_block_size work even if the function has a prefix padding --- src/aes.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src/aes.rs') diff --git a/src/aes.rs b/src/aes.rs index 5caaca1..c40d1c6 100644 --- a/src/aes.rs +++ b/src/aes.rs @@ -240,6 +240,7 @@ fn count_duplicate_blocks (input: &[u8], block_size: usize) -> usize { } fn find_block_size (f: &F) -> usize where F: Fn(&[u8]) -> Vec { + let fixed_prefix_len = find_fixed_prefix_len(f); let byte = b'A'; let mut prev = f(&[byte]); let mut len = 2; @@ -249,7 +250,10 @@ fn find_block_size (f: &F) -> usize where F: Fn(&[u8]) -> Vec { .collect(); let next = f(&prefix[..]); - let prefix_len = shared_prefix_len(prev.iter(), next.iter()); + let prefix_len = shared_prefix_len( + prev.iter().skip(fixed_prefix_len), + next.iter().skip(fixed_prefix_len) + ); if prefix_len > 0 { return prefix_len; } @@ -259,6 +263,12 @@ fn find_block_size (f: &F) -> usize where F: Fn(&[u8]) -> Vec { } } +fn find_fixed_prefix_len (f: &F) -> usize where F: Fn(&[u8]) -> Vec { + let ciphertext1 = f(b""); + let ciphertext2 = f(b"A"); + return shared_prefix_len(ciphertext1.iter(), ciphertext2.iter()); +} + fn shared_prefix_len (i1: I, i2: I) -> usize where I: Iterator, ::Item: PartialEq { return i1 .zip(i2) -- cgit v1.2.3-54-g00ecf