keyhog-scanner 0.5.40

keyhog-scanner: high-performance SIMD-accelerated secret detection engine
Documentation
use keyhog_core::{Chunk, ChunkMetadata, DetectorSpec, PatternSpec, Severity};
use keyhog_scanner::CompiledScanner;

fn demo_scanner() -> CompiledScanner {
    CompiledScanner::compile(vec![DetectorSpec {
        tests: Vec::new(),
        id: "demo-token".into(),
        name: "Demo Token".into(),
        service: "demo".into(),
        severity: Severity::High,
        patterns: vec![PatternSpec {
            regex: "abc".into(),
            description: None,
            group: None,
            client_safe: false,
        }],
        companions: vec![],
        verify: None,
        keywords: vec!["abc".into()],
        min_confidence: None,
        ..Default::default()
    }])
    .unwrap()
}

fn chunk(data: &str) -> Chunk {
    Chunk {
        data: data.into(),
        metadata: ChunkMetadata::default(),
    }
}

#[test]
fn backend_does_not_report_matches_across_chunk_boundaries() {
    let scanner = demo_scanner();
    let chunks = vec![chunk("ab"), chunk("c")];

    let matches = scanner
        .scan_chunks_with_backend(&chunks, keyhog_scanner::hw_probe::ScanBackend::CpuFallback);

    assert!(matches.iter().all(Vec::is_empty));
}

#[test]
fn backend_reports_matches_inside_a_single_chunk() {
    let scanner = demo_scanner();

    let matches = scanner.scan_with_backend(
        &chunk("abc"),
        keyhog_scanner::hw_probe::ScanBackend::CpuFallback,
    );

    assert_eq!(matches.len(), 1);
    assert_eq!(matches[0].credential.as_ref(), "abc");
}