1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use aes::Aes256;
use ofb::{
stream_cipher::{NewStreamCipher, SyncStreamCipher},
Ofb,
};
#[derive(Debug, PartialEq, Eq)]
pub enum Algorithm {
Aes(Aes),
Xor(Xor),
}
impl Algorithm {
pub fn encrypt(&self, buffer: &mut [u8]) {
match self {
Algorithm::Aes(Aes { iv, key }) => Aes::encrypt(buffer, iv, key),
Algorithm::Xor(Xor { key }) => Xor::encrypt(buffer, key),
}
}
pub fn decrypt(&self, buffer: &mut [u8]) {
match self {
Algorithm::Aes(Aes { iv, key }) => Aes::decrypt(buffer, iv, key),
Algorithm::Xor(Xor { key }) => Xor::decrypt(buffer, key),
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct Aes {
pub iv: &'static [u8],
pub key: &'static [u8],
}
impl Aes {
#[inline(always)]
pub fn encrypt(buffer: &mut [u8], iv: &[u8], key: &[u8]) {
let mut cipher = Ofb::<Aes256>::new_var(key, iv).expect("create cipher (Ofb<Aes256>)");
cipher.apply_keystream(buffer);
}
#[inline(always)]
pub fn decrypt(buffer: &mut [u8], iv: &[u8], key: &[u8]) {
Self::encrypt(buffer, iv, key);
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct Xor {
pub key: &'static [u8],
}
impl Xor {
#[inline(always)]
pub fn encrypt(buffer: &mut [u8], key: &[u8]) {
buffer
.iter_mut()
.zip(key.iter().cycle())
.for_each(|(byte, key)| *byte ^= *key)
}
#[inline(always)]
pub fn decrypt(buffer: &mut [u8], key: &[u8]) {
Self::encrypt(buffer, key);
}
}