summaryrefslogtreecommitdiff
path: root/utils/imxtools/sbtools/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/imxtools/sbtools/misc.c')
-rw-r--r--utils/imxtools/sbtools/misc.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/utils/imxtools/sbtools/misc.c b/utils/imxtools/sbtools/misc.c
index b9f5d21f7e..68c769808b 100644
--- a/utils/imxtools/sbtools/misc.c
+++ b/utils/imxtools/sbtools/misc.c
@@ -305,3 +305,44 @@ void color(color_t c)
305 if(g_color_enable) 305 if(g_color_enable)
306 printf("%s", (char *)c); 306 printf("%s", (char *)c);
307} 307}
308
309enum sb_version_guess_t guess_sb_version(const char *filename)
310{
311#define ret(x) do { fclose(f); return x; } while(0)
312 FILE *f = fopen(filename, "rb");
313 if(f == NULL)
314 ret(SB_VERSION_ERR);
315 // check signature
316 uint8_t sig[4];
317 if(fseek(f, 20, SEEK_SET))
318 ret(SB_VERSION_UNK);
319 if(fread(sig, 4, 1, f) != 1)
320 ret(SB_VERSION_UNK);
321 if(memcmp(sig, "STMP", 4) != 0)
322 ret(SB_VERSION_UNK);
323 // check header size (v1)
324 uint32_t hdr_size;
325 if(fseek(f, 8, SEEK_SET))
326 ret(SB_VERSION_UNK);
327 if(fread(&hdr_size, 4, 1, f) != 1)
328 ret(SB_VERSION_UNK);
329 if(hdr_size == 0x34)
330 ret(SB_VERSION_1);
331 // check header params relationship
332 struct
333 {
334 uint16_t nr_keys; /* Number of encryption keys */
335 uint16_t key_dict_off; /* Offset to key dictionary (in blocks) */
336 uint16_t header_size; /* In blocks */
337 uint16_t nr_sections; /* Number of sections */
338 uint16_t sec_hdr_size; /* Section header size (in blocks) */
339 } __attribute__((packed)) u;
340 if(fseek(f, 0x28, SEEK_SET))
341 ret(SB_VERSION_UNK);
342 if(fread(&u, sizeof(u), 1, f) != 1)
343 ret(SB_VERSION_UNK);
344 if(u.sec_hdr_size == 1 && u.header_size == 6 && u.key_dict_off == u.header_size + u.nr_sections)
345 ret(SB_VERSION_2);
346 ret(SB_VERSION_UNK);
347#undef ret
348}