use crate::signatures::common::{SignatureError, SignatureResult, CONFIDENCE_MEDIUM};
use crate::structures::cab::parse_cab_header;
pub const DESCRIPTION: &str = "Microsoft Cabinet archive";
pub fn cab_magic() -> Vec<Vec<u8>> {
vec![b"MSCF\x00\x00\x00\x00".to_vec()]
}
pub fn cab_parser(file_data: &[u8], offset: usize) -> Result<SignatureResult, SignatureError> {
if let Ok(cab_header) = parse_cab_header(&file_data[offset..]) {
let available_data = file_data.len() - offset;
if cab_header.total_size <= available_data {
return Ok(SignatureResult {
description: format!(
"{}, file count: {}, folder count: {}, header size: {}, total size: {} bytes",
DESCRIPTION,
cab_header.file_count,
cab_header.folder_count,
cab_header.header_size,
cab_header.total_size
),
offset,
size: cab_header.total_size,
confidence: CONFIDENCE_MEDIUM,
..Default::default()
});
}
}
Err(SignatureError)
}