summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/aes.rs27
-rw-r--r--src/lib.rs1
2 files changed, 28 insertions, 0 deletions
diff --git a/src/aes.rs b/src/aes.rs
index f38bb6a..1774f02 100644
--- a/src/aes.rs
+++ b/src/aes.rs
@@ -1,6 +1,8 @@
use openssl;
use std::collections::HashSet;
+use primitives::fixed_xor;
+
pub fn decrypt_aes_128_ecb (bytes: &[u8], key: &[u8]) -> Vec<u8> {
return openssl::crypto::symm::decrypt(
openssl::crypto::symm::Type::AES_128_ECB,
@@ -10,6 +12,31 @@ pub fn decrypt_aes_128_ecb (bytes: &[u8], key: &[u8]) -> Vec<u8> {
)
}
+pub fn decrypt_aes_128_cbc (bytes: &[u8], key: &[u8], iv: &[u8]) -> Vec<u8> {
+ let mut prev = iv.clone();
+ let mut plaintext = vec![];
+ for block in bytes.chunks(16) {
+ // XXX not sure what's going on here - decrypt_aes_128_ecb doesn't
+ // decrypt the last block?
+ let double_block: Vec<u8> = block
+ .iter()
+ .chain(block.iter()).map(|x| *x)
+ .collect();
+ let plaintext_block = fixed_xor(
+ &decrypt_aes_128_ecb(&double_block[..], key)[..],
+ prev
+ );
+ for &c in &plaintext_block[..16] {
+ plaintext.push(c);
+ }
+ prev = block.clone();
+ }
+ let padding = plaintext[plaintext.len() - 1];
+ let new_len = plaintext.len() - padding as usize;
+ plaintext.truncate(new_len);
+ return plaintext;
+}
+
pub fn find_aes_128_ecb_encrypted_string (inputs: &[Vec<u8>]) -> Vec<u8> {
let mut max_dups = 0;
let mut found = vec![];
diff --git a/src/lib.rs b/src/lib.rs
index 028faa7..14e896a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -8,6 +8,7 @@ mod primitives;
mod xor;
pub use aes::decrypt_aes_128_ecb;
+pub use aes::decrypt_aes_128_cbc;
pub use aes::find_aes_128_ecb_encrypted_string;
pub use base64::to_base64;
pub use primitives::fixed_xor;