Skip to content

Commit c000697

Browse files
committed
carry data with manifest in directory partitions
Signed-off-by: Daniel Maslowski <[email protected]>
1 parent 909b6ef commit c000697

File tree

3 files changed

+34
-19
lines changed

3 files changed

+34
-19
lines changed

src/dir/gen2.rs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ pub struct Header {
197197
#[derive(Serialize, Deserialize, Clone, Debug)]
198198
#[repr(C)]
199199
pub struct Directory {
200-
pub manifest: Manifest,
200+
pub manifest: (Manifest, Vec<u8>),
201201
pub header: Header,
202202
pub modules: Vec<Module>,
203203
pub offset: usize,
@@ -210,7 +210,7 @@ impl Display for Directory {
210210
let n = &self.name;
211211
let o = self.offset;
212212
let s = self.size;
213-
let m = self.manifest;
213+
let (m, _) = self.manifest;
214214
write!(f, "{n} @ {o:08x}, {s} bytes, {m}")
215215
}
216216
}
@@ -222,32 +222,36 @@ impl Directory {
222222
let Ok(manifest) = Manifest::new(data) else {
223223
return Err("cannot parse Gen 2 directory manifest".to_string());
224224
};
225-
let count = manifest.header.entries as usize;
226-
let d = &data[man::MANIFEST_SIZE..];
227-
let Ok((header, _)) = Header::read_from_prefix(d) else {
225+
226+
let data_len = manifest.data_len();
227+
let mdata = &data[man::MANIFEST_SIZE..man::MANIFEST_SIZE + data_len];
228+
229+
let Ok((header, _)) = Header::read_from_prefix(mdata) else {
228230
return Err("cannot parse ME FW Gen 2 directory header".to_string());
229231
};
230-
let pos = man::MANIFEST_SIZE + HEADER_SIZE;
231-
let m = &data[pos..pos + 4];
232+
let name = match from_utf8(&header.name) {
233+
Ok(n) => n.trim_end_matches('\0').to_string(),
234+
Err(_) => format!("{:02x?}", header.name),
235+
};
232236

237+
// Check magic bytes of first entry.
238+
let pos = HEADER_SIZE;
239+
let m = &mdata[pos..pos + 4];
233240
if !m.eq(MODULE_MAGIC_BYTES) {
234241
return Err(format!(
235242
"entry magic not found, got {m:02x?}, wanted {MODULE_MAGIC_BYTES:02x?} ({MODULE_MAGIC})"
236243
));
237244
}
238-
239-
let slice = &data[pos..];
245+
// Parse the entries themselves.
246+
let slice = &mdata[pos..];
247+
let count = manifest.header.entries as usize;
240248
let Ok((r, _)) = Ref::<_, [Entry]>::from_prefix_with_elems(slice, count) else {
241249
return Err(format!(
242250
"cannot parse ME FW Gen 2 directory entries @ {:08x}",
243251
pos
244252
));
245253
};
246254
let entries = r.to_vec();
247-
let name = match from_utf8(&header.name) {
248-
Ok(n) => n.trim_end_matches('\0').to_string(),
249-
Err(_) => format!("{:02x?}", header.name),
250-
};
251255

252256
// Check for consistency and wrap entries with additional information.
253257
let modules = entries
@@ -295,7 +299,7 @@ impl Directory {
295299

296300
let size = data.len();
297301
Ok(Self {
298-
manifest,
302+
manifest: (manifest, mdata.to_vec()),
299303
header,
300304
modules,
301305
offset,

src/dir/gen3.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ impl Display for CPDEntry {
104104
#[repr(C)]
105105
pub struct CodePartitionDirectory {
106106
pub header: CPDHeader,
107-
pub manifest: Result<Manifest, String>,
107+
pub manifest: Result<(Manifest, Vec<u8>), String>,
108108
pub entries: Vec<CPDEntry>,
109109
pub offset: usize,
110110
pub size: usize,
@@ -125,7 +125,7 @@ impl Display for CodePartitionDirectory {
125125
let n = &self.name;
126126
let l1 = format!("{n} @ {o:08x}, checksum or version: {checksum:08x}");
127127
let l2 = match &self.manifest {
128-
Ok(m) => {
128+
Ok((m, _)) => {
129129
let h = stringify_vec(m.hash_key());
130130
let m = format!("{m}");
131131
let kh = format!("Key hash: {h}");
@@ -173,7 +173,17 @@ impl CodePartitionDirectory {
173173
let manifest = {
174174
if let Some(e) = entries.iter().find(|e| e.name() == manifest_name) {
175175
let o = e.flags_and_offset.offset() as usize;
176-
Manifest::new(&data[o..])
176+
let end = o + e.size as usize;
177+
match Manifest::new(&data[o..end]) {
178+
Ok(m) => {
179+
// The manifest carries additional data after its header
180+
// and key material.
181+
let header_len = m.header_len();
182+
let mdata = data[o + header_len..end].to_vec();
183+
Ok((m, mdata))
184+
}
185+
Err(e) => Err(e),
186+
}
177187
} else {
178188
Err("no manifest found".to_string())
179189
}

src/part/partitions.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ impl Partitions {
7979
if let Some(Gen2Partition::Dir(d)) =
8080
parts.iter().find(|p| matches!(p, Gen2Partition::Dir(_)))
8181
{
82-
Some(d.dir.manifest.header.version)
82+
let (m, _) = d.dir.manifest;
83+
Some(m.header.version)
8384
} else {
8485
None
8586
}
@@ -88,7 +89,7 @@ impl Partitions {
8889
if let Some(Gen3Partition::Dir(d)) =
8990
parts.iter().find(|p| matches!(p, Gen3Partition::Dir(_)))
9091
{
91-
if let Ok(m) = d.cpd.manifest {
92+
if let Ok((m, _)) = d.cpd.manifest {
9293
Some(m.header.version)
9394
} else {
9495
None

0 commit comments

Comments
 (0)