use rulefire::{
yara::{compiler::compile_rule, parser::parse_source},
CompiledRuleIndex, PatternMapping,
};
#[test]
fn parity_integer_at() {
let source = r#"
rule test_int16 {
condition:
int16(0) == 0x5a4d
}
rule test_uint32be {
condition:
uint32be(4) == 0x01020304
}
"#;
let rules = parse_source(source, "test.yar").unwrap();
let entries: Vec<_> = rules
.iter()
.map(|rule| rulefire::RuleEntry {
name: rule.name.clone(),
tags: rule.tags.clone(),
strings: rule.strings.iter().map(|s| s.identifier.clone()).collect(),
})
.collect();
let programs: Vec<_> = rules
.iter()
.map(compile_rule)
.collect::<Result<Vec<_>, _>>()
.unwrap();
let ps = warpstate::PatternSet::builder()
.literal("dummy")
.build()
.unwrap();
let index = CompiledRuleIndex::build(
entries,
vec![],
PatternMapping {
pattern_to_rules: vec![],
rule_list: vec![],
string_local_ids: vec![],
},
programs,
ps,
);
let file_bytes = b"MZ\x00\x00\x01\x02\x03\x04\x00";
let cpu_hits = index.scan_cpu(file_bytes).unwrap();
assert_eq!(cpu_hits.len(), 2, "CPU should hit both rules");
let gpu_hits = index.scan(file_bytes).unwrap();
assert_eq!(gpu_hits.len(), 2, "GPU should hit both rules");
assert_eq!(cpu_hits, gpu_hits, "CPU and GPU results must match");
}