happy-cracking 0.5.0

A fast, comprehensive CTF toolkit for cryptographic encoding/decoding, classic ciphers, hash operations, and analysis tools
Documentation
use happy_cracking::crypto::strings;

#[test]
fn test_extract_flag_from_noise() {
    let mut data = vec![0x00, 0x01, 0x02, 0xFF, 0xFE];
    data.extend_from_slice(b"flag{strings_are_useful}");
    data.extend_from_slice(&[0x00, 0x80, 0x90]);
    let found = strings::extract_ascii(&data, 4).unwrap();
    assert!(found.iter().any(|s| s == "flag{strings_are_useful}"));
}

#[test]
fn test_min_len_filtering() {
    let mut data = vec![0x00];
    data.extend_from_slice(b"abc");
    data.push(0x00);
    data.extend_from_slice(b"abcd");
    data.push(0x00);
    let found = strings::extract_ascii(&data, 4).unwrap();
    assert!(found.iter().any(|s| s == "abcd"));
    assert!(!found.iter().any(|s| s == "abc"));
}

#[test]
fn test_empty_input() {
    let found = strings::extract_ascii(&[], 4).unwrap();
    assert!(found.is_empty());
}

#[test]
fn test_utf16le_extraction() {
    let data = [0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00];
    let found = strings::extract_utf16le(&data, 4).unwrap();
    assert!(found.iter().any(|s| s == "Hello"));
}

#[test]
fn test_utf16le_flag() {
    let mut data = vec![0xFF, 0xFE];
    for &b in b"flag{utf16}" {
        data.push(b);
        data.push(0x00);
    }
    let found = strings::extract_utf16le(&data, 4).unwrap();
    assert!(found.iter().any(|s| s == "flag{utf16}"));
}

#[test]
fn test_ascii_min_len_zero_errors() {
    assert!(strings::extract_ascii(b"hello", 0).is_err());
}

#[test]
fn test_utf16le_min_len_zero_errors() {
    assert!(strings::extract_utf16le(b"hello", 0).is_err());
}