Skip to main content

aea_tools/
segment_info.rs

1use 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}