aea_tools/
segment_info.rs1use crate::crypto::aes_aead_decrypt;
2use anyhow::Result;
3
4#[derive(Clone)]
5pub struct SegmentInfo {
6 pub decompressed_size: u32,
7 pub compressed_size: u32,
8 pub checksum: [u8; 32],
9}
10
11impl SegmentInfo {
12 pub fn decrypt_segment_info(
13 next_cluster_hmac: &[u8; 32],
14 segment_hmacs: &[u8],
15 encrypted_segment_info: Vec<u8>,
16 chek: &[u8; 80],
17 expected_hmac: &[u8; 32],
18 ) -> Result<Vec<SegmentInfo>> {
19 let mut ad = Vec::new();
20 ad.extend_from_slice(next_cluster_hmac);
21 ad.extend_from_slice(segment_hmacs);
22
23 let segment_info_bytes =
24 aes_aead_decrypt(chek, &encrypted_segment_info, &ad, expected_hmac)?;
25 let segment_info_chunks = segment_info_bytes.chunks(40);
26 let segment_info: Vec<SegmentInfo> = segment_info_chunks
27 .map(|chunk| SegmentInfo {
28 decompressed_size: u32::from_le_bytes(chunk[0..4].try_into().unwrap()),
29 compressed_size: u32::from_le_bytes(chunk[4..8].try_into().unwrap()),
30 checksum: chunk[8..40].try_into().unwrap(),
31 })
32 .collect();
33 Ok(segment_info)
34 }
35}