jwt_hack/utils/
compression.rs

1use anyhow::{anyhow, Result};
2use flate2::read::{DeflateDecoder, DeflateEncoder};
3use flate2::Compression;
4use std::io::Read;
5
6/// Compresses data using DEFLATE compression algorithm
7pub fn compress_deflate(data: &[u8]) -> Result<Vec<u8>> {
8    let mut encoder = DeflateEncoder::new(data, Compression::default());
9    let mut compressed = Vec::new();
10    encoder
11        .read_to_end(&mut compressed)
12        .map_err(|e| anyhow!("Failed to compress data: {}", e))?;
13    Ok(compressed)
14}
15
16/// Decompresses data using DEFLATE decompression algorithm
17pub fn decompress_deflate(compressed_data: &[u8]) -> Result<Vec<u8>> {
18    let mut decoder = DeflateDecoder::new(compressed_data);
19    let mut decompressed = Vec::new();
20    decoder
21        .read_to_end(&mut decompressed)
22        .map_err(|e| anyhow!("Failed to decompress data: {}", e))?;
23    Ok(decompressed)
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29
30    #[test]
31    fn test_compress_decompress_round_trip() {
32        let original_data = b"Hello, World! This is a test string for compression. This needs to be long enough to actually compress well. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
33
34        // Compress the data
35        let compressed = compress_deflate(original_data).expect("Failed to compress data");
36
37        // Decompress the data
38        let decompressed = decompress_deflate(&compressed).expect("Failed to decompress data");
39
40        // Verify round-trip integrity
41        assert_eq!(original_data, decompressed.as_slice());
42    }
43
44    #[test]
45    fn test_compress_empty_data() {
46        let empty_data = b"";
47        let compressed = compress_deflate(empty_data).expect("Failed to compress empty data");
48        let decompressed =
49            decompress_deflate(&compressed).expect("Failed to decompress empty data");
50        assert_eq!(empty_data, decompressed.as_slice());
51    }
52
53    #[test]
54    fn test_compress_small_data() {
55        let small_data = b"a";
56        let compressed = compress_deflate(small_data).expect("Failed to compress small data");
57        let decompressed =
58            decompress_deflate(&compressed).expect("Failed to decompress small data");
59        assert_eq!(small_data, decompressed.as_slice());
60    }
61
62    #[test]
63    fn test_decompress_invalid_data() {
64        let invalid_data = b"this is not compressed data";
65        let result = decompress_deflate(invalid_data);
66        assert!(result.is_err(), "Decompressing invalid data should fail");
67    }
68
69    #[test]
70    fn test_compress_json_payload() {
71        let json_payload =
72            br#"{"sub":"1234567890","name":"John Doe","iat":1516239022,"exp":1516239922}"#;
73
74        let compressed = compress_deflate(json_payload).expect("Failed to compress JSON payload");
75        let decompressed =
76            decompress_deflate(&compressed).expect("Failed to decompress JSON payload");
77
78        assert_eq!(json_payload, decompressed.as_slice());
79    }
80}