#![allow(deprecated)]
use std::mem;
use aes::Aes256;
use aes::cipher::{BlockCipherDecrypt, BlockCipherEncrypt, KeyInit};
pub fn ige_encrypt(buffer: &mut [u8], key: &[u8; 32], iv: &[u8; 32]) {
assert_eq!(buffer.len() % 16, 0);
let cipher = Aes256::new(key.into());
let mut iv1: [u8; 16] = iv[0..16].try_into().unwrap();
let mut iv2: [u8; 16] = iv[16..32].try_into().unwrap();
let mut next_iv2 = [0u8; 16];
for block in buffer.chunks_mut(16) {
next_iv2.copy_from_slice(block);
for i in 0..16 {
block[i] ^= iv1[i]
}
cipher.encrypt_block(block.try_into().unwrap());
for i in 0..16 {
block[i] ^= iv2[i]
}
iv1.copy_from_slice(block);
mem::swap(&mut iv2, &mut next_iv2);
}
}
pub fn ige_decrypt(buffer: &mut [u8], key: &[u8; 32], iv: &[u8; 32]) {
assert_eq!(buffer.len() % 16, 0);
let cipher = Aes256::new(key.into());
let mut iv1: [u8; 16] = iv[0..16].try_into().unwrap();
let mut iv2: [u8; 16] = iv[16..32].try_into().unwrap();
let mut next_iv1 = [0u8; 16];
for block in buffer.chunks_mut(16) {
next_iv1.copy_from_slice(block);
for i in 0..16 {
block[i] ^= iv2[i]
}
cipher.decrypt_block(block.try_into().unwrap());
for i in 0..16 {
block[i] ^= iv1[i]
}
mem::swap(&mut iv1, &mut next_iv1);
iv2.copy_from_slice(block);
}
}