stage
This commit is contained in:
96
problems/p15/src/main.rs
Normal file
96
problems/p15/src/main.rs
Normal 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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user