//! RC4 (used by PDF security handler revisions 2–4). Encryption and decryption are the same. pub fn rc4(key: &[u8], data: &[u8]) -> Vec { if key.is_empty() { return data.to_vec(); } let mut s: [u8; 256] = std::array::from_fn(|i| i as u8); let mut j: u8 = 0; for i in 0..256 { j = j.wrapping_add(s[i]).wrapping_add(key[i % key.len()]); s.swap(i, j as usize); } let (mut i, mut j) = (0u8, 0u8); data.iter() .map(|b| { i = i.wrapping_add(1); j = j.wrapping_add(s[i as usize]); s.swap(i as usize, j as usize); b ^ s[s[i as usize].wrapping_add(s[j as usize]) as usize] }) .collect() }