glow_control_lib/util/
rc4.rs1pub struct Rc4 {
2 i: u8,
3 j: u8,
4 s: [u8; 256],
5}
6
7#[allow(clippy::needless_range_loop)]
8impl Rc4 {
9 pub fn new(key: &[u8]) -> Rc4 {
10 assert!(!key.is_empty() && key.len() <= 256);
11
12 let mut s = [0u8; 256];
13 for i in 0..256 {
14 s[i] = i as u8;
15 }
16
17 let mut j = 0u8;
18 for i in 0..256 {
19 j = j.wrapping_add(s[i]).wrapping_add(key[i % key.len()]);
20 s.swap(i, j as usize);
21 }
22
23 Rc4 { i: 0, j: 0, s }
24 }
25
26 pub fn apply_keystream(&mut self, data: &mut [u8]) {
27 for byte in data.iter_mut() {
28 self.i = self.i.wrapping_add(1);
29 self.j = self.j.wrapping_add(self.s[self.i as usize]);
30
31 self.s.swap(self.i as usize, self.j as usize);
32
33 let k =
34 self.s[(self.s[self.i as usize].wrapping_add(self.s[self.j as usize])) as usize];
35 *byte ^= k;
36 }
37 }
38}
39
40