glow_control_lib/util/
rc4.rs

1pub 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// Function to create a challenge response