use alloc::vec::Vec;
pub fn pad(data: &[u8]) -> Vec<u8> {
let data_size = data.len();
let block_count = (data_size + 9 + 63) / 64;
let padded_size = block_count * 64;
let mut buffer = Vec::with_capacity(padded_size);
buffer.extend_from_slice(data);
buffer.push(0x80);
let padding_needed = padded_size - data_size - 1 - 8;
buffer.resize(buffer.len() + padding_needed, 0);
let size_bits = (data_size as u64) * 8;
buffer.extend_from_slice(&size_bits.to_be_bytes());
debug_assert_eq!(buffer.len(), padded_size);
buffer
}
#[cfg(test)]
mod tests {
use alloc::vec;
use super::*;
#[test]
fn test_pad() {
let data = "Magic Number is 9774-8380-6896. It is advised to be kept secret."
.as_bytes()
.to_vec();
let padded = pad(&data);
assert_eq!(padded.len(), 128);
}
#[test]
fn test_pad_2() {
let data = "Magic Number is 9774-8380-6896. You must Keep it secret."
.as_bytes()
.to_vec();
let padded = pad(&data);
assert_eq!(padded.len(), 128);
}
#[test]
fn test_pad_3() {
let data = "Magic Number is 9774-8380-6896. You must keep it secret"
.as_bytes()
.to_vec();
let padded = pad(&data);
assert_eq!(padded.len(), 64);
}
#[test]
fn test_pad_empty() {
let data = "".as_bytes().to_vec();
let padded = pad(&data);
let mut expected = vec![0; 64];
expected[0] = 0x80;
assert_eq!(padded, expected);
}
}