1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//! # Example
//!
//! ```rust
//! # extern crate pkcs7;
//! const BLOCK_SIZE: usize = 16;
//!
//! let un_padded = b"This is a test.";
//!
//! let mut buffer = un_padded.to_vec();
//! pkcs7::pad(&mut buffer, BLOCK_SIZE as u8);
//!
//! assert_eq!(buffer.len() % BLOCK_SIZE, 0);
//!
//! pkcs7::un_pad(&mut buffer);
//!
//! assert_eq!(buffer.as_slice(), un_padded);
//! ```

use std::iter::repeat;

pub fn pad(buffer: &mut Vec<u8>, block_size: u8) {
    let block_size = block_size as usize;

    let padding_size = block_size - (buffer.len() % block_size);
    buffer.extend(repeat(padding_size as u8).take(padding_size));
}

pub fn un_pad(buffer: &mut Vec<u8>) {
    if let Some(&pad_len) = buffer.last() {
        let len = buffer.len();
        buffer.truncate(len - pad_len as usize);
    }
}