simple_comms/protocol/
padding.rs1pub fn add_padding_with_scheme<F>(data: &[u8], block_size: usize, padding_fn: F) -> Vec<u8>
2where
3 F: Fn(usize) -> Vec<u8>,
4{
5 if !(1..=255).contains(&block_size) {
6 panic!("Block size must be between 1 and 255 inclusive");
7 }
8 let padding_len = block_size - (data.len() % block_size);
9 let mut padded_data = data.to_vec();
10 padded_data.extend(padding_fn(padding_len));
11 padded_data
12}
13
14pub fn remove_padding_with_scheme<F>(
15 padded_data: &[u8],
16 block_size: usize,
17 validate_fn: F,
18) -> Result<Vec<u8>, String>
19where
20 F: Fn(&[u8]) -> Result<usize, String>,
21{
22 if padded_data.is_empty() {
23 return Err("Data is empty, no padding to remove".to_string());
24 }
25
26 let padding_len = validate_fn(&padded_data)?;
27
28 if padding_len > block_size || padding_len > padded_data.len() {
29 return Err("Invalid padding length".to_string());
30 }
31
32 let actual_data_len = padded_data.len() - padding_len;
33
34 Ok(padded_data[..actual_data_len].to_vec())
35}
36
37pub fn pkcs7_padding(padding_len: usize) -> Vec<u8> {
38 vec![padding_len as u8; padding_len]
39}
40
41pub fn pkcs7_validation(padded: &[u8]) -> Result<usize, String> {
42 let padding_len = *padded.last().unwrap() as usize;
43 if padding_len == 0 || padding_len > padded.len() {
44 return Err("Invalid padding length".to_string());
45 }
46
47 if !padded[padded.len() - padding_len..]
48 .iter()
49 .all(|&byte| byte as usize == padding_len)
50 {
51 return Err("Invalid padding bytes".to_string());
52 }
53
54 Ok(padding_len)
55}
56
57pub fn x_padding(padding_len: usize) -> Vec<u8> {
58 vec![8; padding_len]
59}
60
61pub fn x_trim_validation(padded: &[u8]) -> Result<usize, String> {
62 let padding_len = padded.iter().rev().take_while(|&&byte| byte == 8).count();
63 Ok(padding_len)
64}