diff options
author | Jesse Luehrs <doy@tozt.net> | 2015-03-23 00:16:26 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2015-03-23 00:16:26 -0400 |
commit | 70532c0df77f67820f88a9118a00071902f4ffdf (patch) | |
tree | 989645029c61932d018f10ca3d8c0d8070a40100 /src/aes.rs | |
parent | b4e18078b1c742b7d973ac61422407d9871725fd (diff) | |
download | matasano-70532c0df77f67820f88a9118a00071902f4ffdf.tar.gz matasano-70532c0df77f67820f88a9118a00071902f4ffdf.zip |
let find_block_size work even if the function has a prefix padding
Diffstat (limited to 'src/aes.rs')
-rw-r--r-- | src/aes.rs | 12 |
1 files changed, 11 insertions, 1 deletions
@@ -240,6 +240,7 @@ fn count_duplicate_blocks (input: &[u8], block_size: usize) -> usize { } fn find_block_size<F> (f: &F) -> usize where F: Fn(&[u8]) -> Vec<u8> { + 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: &F) -> usize where F: Fn(&[u8]) -> Vec<u8> { .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: &F) -> usize where F: Fn(&[u8]) -> Vec<u8> { } } +fn find_fixed_prefix_len<F> (f: &F) -> usize where F: Fn(&[u8]) -> Vec<u8> { + let ciphertext1 = f(b""); + let ciphertext2 = f(b"A"); + return shared_prefix_len(ciphertext1.iter(), ciphertext2.iter()); +} + fn shared_prefix_len<I> (i1: I, i2: I) -> usize where I: Iterator, <I as Iterator>::Item: PartialEq { return i1 .zip(i2) |