simple_comms/protocol/
padding.rs

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