use aes::cipher::BlockDecryptMut;
use aes::cipher::BlockEncryptMut;
use aes::cipher::KeyIvInit;
use sha1::Digest;
use sha1::Sha1;
type Aes128CbcDec = cbc::Decryptor<aes::Aes128>;
type Aes128CbcEnc = cbc::Encryptor<aes::Aes128>;
pub fn xe_crypt_sha(data: &[u8]) -> [u8; 20] {
let mut hasher = Sha1::new();
hasher.update(data);
hasher.finalize().into()
}
pub fn xe_crypt_aes_cbc_decrypt(key: &[u8; 16], iv: &[u8; 16], data: &mut [u8]) {
let aligned_len = data.len() & !0xF;
if aligned_len == 0 {
return;
}
let dec = Aes128CbcDec::new(key.into(), iv.into());
dec.decrypt_padded_mut::<aes::cipher::block_padding::NoPadding>(&mut data[..aligned_len])
.expect("AES-128-CBC decrypt should not fail on aligned data");
}
pub fn xe_crypt_aes_cbc_encrypt(key: &[u8; 16], iv: &[u8; 16], data: &mut [u8]) {
let aligned_len = data.len() & !0xF;
if aligned_len == 0 {
return;
}
let enc = Aes128CbcEnc::new(key.into(), iv.into());
enc.encrypt_padded_mut::<aes::cipher::block_padding::NoPadding>(&mut data[..aligned_len], aligned_len)
.expect("AES-128-CBC encrypt should not fail on aligned data");
}
pub fn xe_crypt_aes_ecb_decrypt(key: &[u8; 16], block: &mut [u8; 16]) {
let iv = [0u8; 16];
xe_crypt_aes_cbc_decrypt(key, &iv, block);
}
pub fn xe_crypt_aes_ecb_encrypt(key: &[u8; 16], block: &mut [u8; 16]) {
let iv = [0u8; 16];
xe_crypt_aes_cbc_encrypt(key, &iv, block);
}