From fd6f9464cc25513f7ab56aaa04674c03d80a465c Mon Sep 17 00:00:00 2001 From: Felix Martin Date: Tue, 28 Jun 2022 13:28:12 -0400 Subject: [PATCH] Implement challenge 15 pkcs7 validation. --- src/bytes.rs | 16 ++++++++++++++++ src/main.rs | 2 ++ src/set2.rs | 23 +++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/src/bytes.rs b/src/bytes.rs index bdc20df..021c275 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -101,6 +101,22 @@ impl Bytes { } } + pub fn has_valid_pkcs7(&mut self, block_size: usize) -> bool { + if self.len() > 0 && self.len() % block_size != 0 { + return false; + } + let last_block_index = self.len() / block_size - 1; + let last_block = self.get_block(last_block_index, block_size).0; + let pad_byte_count = last_block[block_size - 1]; + for i in 0..(pad_byte_count as usize) { + let byte = last_block[block_size - 1 - i]; + if byte != pad_byte_count { + return false; + } + } + return true; + } + pub fn xor(Bytes(a): &Bytes, Bytes(b): &Bytes) -> Bytes { Bytes( Iterator::zip(a.iter(), b.iter()) diff --git a/src/main.rs b/src/main.rs index c5ed17b..60dea1f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,4 +21,6 @@ fn main() { set2::challenge12(); set2::challenge13(); set2::challenge14(); + set2::challenge15(); + set2::challenge16(); } diff --git a/src/set2.rs b/src/set2.rs index 11d6f0b..9855e6b 100644 --- a/src/set2.rs +++ b/src/set2.rs @@ -390,3 +390,26 @@ pub fn challenge14() { roundtrip_text.to_utf8()[..17].to_string() ); } + +pub fn challenge15() { + assert_eq!( + Bytes::from_utf8("ICE ICE BABY\u{4}\u{4}\u{4}").has_valid_pkcs7(16), + false + ); + assert_eq!( + Bytes::from_utf8("ICE ICE BABY\u{4}\u{4}\u{4}\u{4}").has_valid_pkcs7(16), + true + ); + assert_eq!( + Bytes::from_utf8("ICE ICE BABY\u{3}\u{3}\u{4}\u{4}").has_valid_pkcs7(16), + false + ); + let mut bytes = Bytes::from_utf8("ICE ICE BABY\u{3}\u{3}\u{4}\u{4}"); + bytes.pad_pkcs7(16); + assert_eq!(bytes.has_valid_pkcs7(16), true); + println!("[okay] Challenge 15: PKCS7 works"); +} + +pub fn challenge16() { + println!("[xxxx] Challenge 16: TBD"); +}