zuc/internal/
stream_cipher.rs

1use 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}