zuc/internal/
stream_cipher.rs1use super::keystream::Keystream;
2
3use stdx::slice::SliceExt as _;
4
5pub fn xor_inplace(zuc: &mut impl Keystream<Word = u32>, data: &mut [u8], bitlen: usize) {
6 assert!(bitlen <= data.len() * 8);
7
8 for chunk in data.as_chunks_mut_::<4>().0 {
9 let k = zuc.next_key().to_be_bytes();
10 for i in 0..4 {
11 chunk[i] ^= k[i];
12 }
13 }
14
15 {
16 let i = data.len() / 4 * 4;
17 let k = zuc.next_key().to_be_bytes();
18 for j in 0..data.len() % 4 {
19 data[i + j] ^= k[j];
20 }
21 }
22
23 if bitlen % 8 != 0 {
24 data[bitlen / 8] &= 0xFF << (8 - bitlen % 8);
25 }
26
27 for i in bitlen / 8 + 1..data.len() {
28 data[i] = 0;
29 }
30}