1
0
This commit is contained in:
2025-06-20 11:23:21 +08:00
commit b5601aef8c
47 changed files with 1829 additions and 0 deletions

96
problems/p15/src/main.rs Normal file
View File

@@ -0,0 +1,96 @@
use anyhow::{Result, anyhow};
fn pkcs7_unpadding(input: &[u8]) -> Result<Vec<u8>> {
if input.is_empty() {
return Err(anyhow!("Input cannot be empty"));
}
let padding_length = *input.last().unwrap();
if padding_length == 0 || padding_length > input.len() as u8 {
return Err(anyhow!("Invalid PKCS#7 padding"));
}
for &byte in input.iter().rev().take(padding_length as usize) {
if byte != padding_length {
return Err(anyhow!("Invalid PKCS#7 padding"));
}
}
Ok(input[..input.len() - padding_length as usize].to_vec())
}
fn main() {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_valid_padding() {
let padded = vec![1, 2, 3, 4, 4, 4, 4, 4];
let result = pkcs7_unpadding(&padded).unwrap();
assert_eq!(result, vec![1, 2, 3, 4]);
}
#[test]
fn test_single_byte_padding() {
let padded = vec![1, 2, 3, 4, 5, 1];
let result = pkcs7_unpadding(&padded).unwrap();
assert_eq!(result, vec![1, 2, 3, 4, 5]);
}
#[test]
fn test_full_block_padding() {
let padded = vec![8, 8, 8, 8, 8, 8, 8, 8];
let result = pkcs7_unpadding(&padded).unwrap();
assert_eq!(result, Vec::<u8>::new());
}
#[test]
fn test_empty_input() {
let result = pkcs7_unpadding(&[]);
assert!(result.is_err());
assert_eq!(result.unwrap_err().to_string(), "Input cannot be empty");
}
#[test]
fn test_invalid_padding_value() {
let padded = vec![1, 2, 3, 4, 3, 4, 4];
let result = pkcs7_unpadding(&padded);
assert!(result.is_err());
assert_eq!(result.unwrap_err().to_string(), "Invalid PKCS#7 padding");
}
#[test]
fn test_zero_padding() {
let padded = vec![1, 2, 3, 0];
let result = pkcs7_unpadding(&padded);
assert!(result.is_err());
}
#[test]
fn test_padding_length_exceeds_data() {
let padded = vec![1, 2, 10];
let result = pkcs7_unpadding(&padded);
assert!(result.is_err());
}
#[test]
fn test_ice_ice_baby_valid() {
let padded = b"ICE ICE BABY\x04\x04\x04\x04".to_vec();
let result = pkcs7_unpadding(&padded).unwrap();
assert_eq!(result, b"ICE ICE BABY");
}
#[test]
fn test_ice_ice_baby_invalid_value() {
let padded = b"ICE ICE BABY\x05\x05\x05\x05".to_vec();
let result = pkcs7_unpadding(&padded);
assert!(result.is_err());
assert_eq!(result.unwrap_err().to_string(), "Invalid PKCS#7 padding");
}
#[test]
fn test_ice_ice_baby_invalid_sequence() {
let padded = b"ICE ICE BABY\x01\x02\x03\x04".to_vec();
let result = pkcs7_unpadding(&padded);
assert!(result.is_err());
assert_eq!(result.unwrap_err().to_string(), "Invalid PKCS#7 padding");
}
}