1#![allow(deprecated)]
15
16use aes::Aes256;
17use aes::cipher::generic_array::GenericArray;
18use aes::cipher::{BlockDecrypt, BlockEncrypt, KeyInit};
19
20pub fn ige_encrypt(buffer: &mut [u8], key: &[u8; 32], iv: &[u8; 32]) {
23 assert_eq!(buffer.len() % 16, 0);
24 let cipher = Aes256::new(GenericArray::from_slice(key));
25
26 let mut iv1: [u8; 16] = iv[..16].try_into().unwrap();
27 let mut iv2: [u8; 16] = iv[16..].try_into().unwrap();
28 let mut next_iv2 = [0u8; 16];
29
30 for block in buffer.chunks_mut(16) {
31 next_iv2.copy_from_slice(block);
32 for i in 0..16 {
33 block[i] ^= iv1[i];
34 }
35 cipher.encrypt_block(GenericArray::from_mut_slice(block));
36 for i in 0..16 {
37 block[i] ^= iv2[i];
38 }
39 iv1.copy_from_slice(block);
40 std::mem::swap(&mut iv2, &mut next_iv2);
41 }
42}
43
44pub fn ctr_crypt(buffer: &mut [u8], key: &[u8; 32], iv: &[u8; 16]) {
47 use ctr::Ctr128BE;
48 use ctr::cipher::{KeyIvInit, StreamCipher};
49 let mut cipher =
50 Ctr128BE::<Aes256>::new(GenericArray::from_slice(key), GenericArray::from_slice(iv));
51 cipher.apply_keystream(buffer);
52}
53
54pub fn ctr_iv_at_offset(base_iv: &[u8; 16], byte_offset: u64) -> [u8; 16] {
57 let block_offset = byte_offset / 16;
58 let iv_int = u128::from_be_bytes(*base_iv);
59 iv_int.wrapping_add(block_offset as u128).to_be_bytes()
60}
61
62pub fn ige_decrypt(buffer: &mut [u8], key: &[u8; 32], iv: &[u8; 32]) {
65 assert_eq!(buffer.len() % 16, 0);
66 let cipher = Aes256::new(GenericArray::from_slice(key));
67
68 let mut iv1: [u8; 16] = iv[..16].try_into().unwrap();
69 let mut iv2: [u8; 16] = iv[16..].try_into().unwrap();
70 let mut next_iv1 = [0u8; 16];
71
72 for block in buffer.chunks_mut(16) {
73 next_iv1.copy_from_slice(block);
74 for i in 0..16 {
75 block[i] ^= iv2[i];
76 }
77 cipher.decrypt_block(GenericArray::from_mut_slice(block));
78 for i in 0..16 {
79 block[i] ^= iv1[i];
80 }
81 std::mem::swap(&mut iv1, &mut next_iv1);
82 iv2.copy_from_slice(block);
83 }
84}