diff options
Diffstat (limited to 'utils/imxtools/sbtools/misc.c')
-rw-r--r-- | utils/imxtools/sbtools/misc.c | 41 |
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 | |||
309 | enum 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 | } | ||