dec_cryptor/
parallel_handler.rs1use aes::Aes256;
2use ctr::cipher::{KeyIvInit, StreamCipher, StreamCipherSeek};
3use ctr::Ctr128BE;
4use rayon::prelude::*;
5
6pub type Aes256Ctr = Ctr128BE<Aes256>;
8
9const PARALLEL_THRESHOLD: usize = 16 * 1024;
12
13pub fn ctr_apply_in_parts(
22 key: &[u8],
23 iv: &[u8],
24 data: &mut [u8],
25 stream_offset: usize
26) -> Result<(), String> {
27 let total_len = data.len();
28 if total_len == 0 {
29 return Ok(());
30 }
31
32 let num_parts = crate::crypto_utils::get_parts();
33
34 if num_parts <= 1 || total_len < PARALLEL_THRESHOLD {
35 let mut cipher = Aes256Ctr::new(key.into(), iv.into());
37 cipher.seek(stream_offset as u128);
38 cipher.apply_keystream(data);
39 return Ok(());
40 }
41
42 let chunk_size = (total_len + num_parts - 1) / num_parts;
44
45 let mut chunks: Vec<&mut [u8]> = data.chunks_mut(chunk_size).collect();
47
48 chunks.par_iter_mut()
50 .enumerate() .for_each(|(chunk_index, chunk)| {
52 let mut cipher = Aes256Ctr::new(key.into(), iv.into());
55
56 let offset = stream_offset + chunk_index * chunk_size;
58
59 cipher.seek(offset as u128);
61
62 cipher.apply_keystream(chunk);
64 });
65
66 Ok(())
67}