use {
crate::{
error::AppleCodesignError,
macho::{AppleSignable, DigestType},
},
goblin::mach::MachO,
};
pub fn compute_paged_hashes(
data: &[u8],
hash: DigestType,
page_size: usize,
) -> Result<Vec<Vec<u8>>, AppleCodesignError> {
data.chunks(page_size)
.map(|chunk| hash.digest(chunk))
.collect::<Result<Vec<_>, AppleCodesignError>>()
}
pub fn compute_code_hashes(
macho: &MachO,
hash_type: DigestType,
page_size: Option<usize>,
) -> Result<Vec<Vec<u8>>, AppleCodesignError> {
let page_size = page_size.unwrap_or(4096);
Ok(macho
.digestable_segment_data()
.into_iter()
.map(|data| compute_paged_hashes(data, hash_type, page_size))
.collect::<Result<Vec<_>, AppleCodesignError>>()?
.into_iter()
.flatten()
.collect::<Vec<_>>())
}