diff options
-rw-r--r-- | utils/imxtools/sbtools/sb.c | 22 | ||||
-rw-r--r-- | utils/imxtools/sbtools/sb.h | 11 | ||||
-rw-r--r-- | utils/imxtools/sbtools/sbtoelf.c | 11 |
3 files changed, 30 insertions, 14 deletions
diff --git a/utils/imxtools/sbtools/sb.c b/utils/imxtools/sbtools/sb.c index bea0438cca..385c5e5ded 100644 --- a/utils/imxtools/sbtools/sb.c +++ b/utils/imxtools/sbtools/sb.c | |||
@@ -646,14 +646,14 @@ static uint32_t guess_alignment(uint32_t off) | |||
646 | return a; | 646 | return a; |
647 | } | 647 | } |
648 | 648 | ||
649 | struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, | 649 | struct sb_file_t *sb_read_file(const char *filename, unsigned flags, void *u, |
650 | generic_printf_t cprintf, enum sb_error_t *err) | 650 | generic_printf_t cprintf, enum sb_error_t *err) |
651 | { | 651 | { |
652 | return sb_read_file_ex(filename, 0, -1, raw_mode, u, cprintf, err); | 652 | return sb_read_file_ex(filename, 0, -1, flags, u, cprintf, err); |
653 | } | 653 | } |
654 | 654 | ||
655 | struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, bool raw_mode, void *u, | 655 | struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, |
656 | generic_printf_t cprintf, enum sb_error_t *err) | 656 | unsigned flags, void *u, generic_printf_t cprintf, enum sb_error_t *err) |
657 | { | 657 | { |
658 | #define fatal(e, ...) \ | 658 | #define fatal(e, ...) \ |
659 | do { if(err) *err = e; \ | 659 | do { if(err) *err = e; \ |
@@ -678,7 +678,7 @@ struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t si | |||
678 | } | 678 | } |
679 | fclose(f); | 679 | fclose(f); |
680 | 680 | ||
681 | struct sb_file_t *ret = sb_read_memory(buf, read_size, raw_mode, u, cprintf, err); | 681 | struct sb_file_t *ret = sb_read_memory(buf, read_size, flags, u, cprintf, err); |
682 | free(buf); | 682 | free(buf); |
683 | return ret; | 683 | return ret; |
684 | 684 | ||
@@ -704,7 +704,7 @@ static void sb_printer(void *user, const char *fmt, ...) | |||
704 | va_end(args); | 704 | va_end(args); |
705 | } | 705 | } |
706 | 706 | ||
707 | struct sb_file_t *sb_read_memory(void *_buf, size_t filesize, bool raw_mode, void *u, | 707 | struct sb_file_t *sb_read_memory(void *_buf, size_t filesize, unsigned flags, void *u, |
708 | generic_printf_t cprintf, enum sb_error_t *err) | 708 | generic_printf_t cprintf, enum sb_error_t *err) |
709 | { | 709 | { |
710 | struct sb_file_t *sb_file = NULL; | 710 | struct sb_file_t *sb_file = NULL; |
@@ -935,7 +935,7 @@ struct sb_file_t *sb_read_memory(void *_buf, size_t filesize, bool raw_mode, voi | |||
935 | } | 935 | } |
936 | 936 | ||
937 | /* sections */ | 937 | /* sections */ |
938 | if(!raw_mode) | 938 | if(!(flags & SB_RAW_MODE)) |
939 | { | 939 | { |
940 | sb_file->nr_sections = sb_header->nr_sections; | 940 | sb_file->nr_sections = sb_header->nr_sections; |
941 | sb_file->sections = xmalloc(sb_file->nr_sections * sizeof(struct sb_section_t)); | 941 | sb_file->sections = xmalloc(sb_file->nr_sections * sizeof(struct sb_section_t)); |
@@ -1132,6 +1132,14 @@ struct sb_file_t *sb_read_memory(void *_buf, size_t filesize, bool raw_mode, voi | |||
1132 | sha_1_output(&sha_1_params, computed_sha1); | 1132 | sha_1_output(&sha_1_params, computed_sha1); |
1133 | if(memcmp(decrypted_block, computed_sha1, 20) == 0) | 1133 | if(memcmp(decrypted_block, computed_sha1, 20) == 0) |
1134 | printf(RED, " Ok\n"); | 1134 | printf(RED, " Ok\n"); |
1135 | else if(flags & SB_IGNORE_SHA1) | ||
1136 | { | ||
1137 | /* some weird images produced by some buggy tools have wrong SHA-1, | ||
1138 | * this probably gone unnoticed because the bootloader ignores the SH1-1 | ||
1139 | * anyway */ | ||
1140 | printf(RED, " Failed\n"); | ||
1141 | cprintf(u, true, GREY, "Warning: SHA-1 mismatch ignored per flags\n"); | ||
1142 | } | ||
1135 | else | 1143 | else |
1136 | { | 1144 | { |
1137 | printf(RED, " Failed\n"); | 1145 | printf(RED, " Failed\n"); |
diff --git a/utils/imxtools/sbtools/sb.h b/utils/imxtools/sbtools/sb.h index 67d0d8c423..cf826362de 100644 --- a/utils/imxtools/sbtools/sb.h +++ b/utils/imxtools/sbtools/sb.h | |||
@@ -234,14 +234,17 @@ enum sb_error_t | |||
234 | SB_LAST_CRYPTO_ERROR = SB_FIRST_CRYPTO_ERROR - CRYPTO_NUM_ERRORS, | 234 | SB_LAST_CRYPTO_ERROR = SB_FIRST_CRYPTO_ERROR - CRYPTO_NUM_ERRORS, |
235 | }; | 235 | }; |
236 | 236 | ||
237 | #define SB_RAW_MODE (1 << 0) /* read image in raw mode (aka bootloader-like) */ | ||
238 | #define SB_IGNORE_SHA1 (1 << 1) /* ignore SHA-1 mismatch */ | ||
239 | |||
237 | enum sb_error_t sb_write_file(struct sb_file_t *sb, const char *filename, void *u, | 240 | enum sb_error_t sb_write_file(struct sb_file_t *sb, const char *filename, void *u, |
238 | generic_printf_t printf); | 241 | generic_printf_t printf); |
239 | struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, | 242 | struct sb_file_t *sb_read_file(const char *filename, unsigned flags, void *u, |
240 | generic_printf_t printf, enum sb_error_t *err); | 243 | generic_printf_t printf, enum sb_error_t *err); |
241 | /* use size_t(-1) to use maximum size */ | 244 | /* use size_t(-1) to use maximum size */ |
242 | struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, bool raw_mode, void *u, | 245 | struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, |
243 | generic_printf_t printf, enum sb_error_t *err); | 246 | unsigned flags, void *u, generic_printf_t printf, enum sb_error_t *err); |
244 | struct sb_file_t *sb_read_memory(void *buffer, size_t size, bool raw_mode, void *u, | 247 | struct sb_file_t *sb_read_memory(void *buffer, size_t size, unsigned flags, void *u, |
245 | generic_printf_t printf, enum sb_error_t *err); | 248 | generic_printf_t printf, enum sb_error_t *err); |
246 | 249 | ||
247 | uint64_t sb_generate_timestamp(void); | 250 | uint64_t sb_generate_timestamp(void); |
diff --git a/utils/imxtools/sbtools/sbtoelf.c b/utils/imxtools/sbtools/sbtoelf.c index 578135d7ca..86c37f3e4c 100644 --- a/utils/imxtools/sbtools/sbtoelf.c +++ b/utils/imxtools/sbtools/sbtoelf.c | |||
@@ -263,13 +263,14 @@ static void usage(void) | |||
263 | printf(" -s/--no-simpl Prevent elf files from being simplified*\n"); | 263 | printf(" -s/--no-simpl Prevent elf files from being simplified*\n"); |
264 | printf(" -x Use default sb1 key\n"); | 264 | printf(" -x Use default sb1 key\n"); |
265 | printf(" -b Brute force key\n"); | 265 | printf(" -b Brute force key\n"); |
266 | printf(" --ignore-sha1 Ignore SHA-1 mismatch*\n"); | ||
266 | printf("Options marked with a * are for debug purpose only\n"); | 267 | printf("Options marked with a * are for debug purpose only\n"); |
267 | exit(1); | 268 | exit(1); |
268 | } | 269 | } |
269 | 270 | ||
270 | int main(int argc, char **argv) | 271 | int main(int argc, char **argv) |
271 | { | 272 | { |
272 | bool raw_mode = false; | 273 | unsigned flags = 0; |
273 | const char *loopback = NULL; | 274 | const char *loopback = NULL; |
274 | bool force_sb1 = false; | 275 | bool force_sb1 = false; |
275 | bool force_sb2 = false; | 276 | bool force_sb2 = false; |
@@ -288,6 +289,7 @@ int main(int argc, char **argv) | |||
288 | {"v1", no_argument, 0, '1'}, | 289 | {"v1", no_argument, 0, '1'}, |
289 | {"v2", no_argument, 0, '2'}, | 290 | {"v2", no_argument, 0, '2'}, |
290 | {"no-simpl", no_argument, 0, 's'}, | 291 | {"no-simpl", no_argument, 0, 's'}, |
292 | {"ignore-sha1", no_argument, 0, 254}, | ||
291 | {0, 0, 0, 0} | 293 | {0, 0, 0, 0} |
292 | }; | 294 | }; |
293 | 295 | ||
@@ -339,7 +341,7 @@ int main(int argc, char **argv) | |||
339 | break; | 341 | break; |
340 | } | 342 | } |
341 | case 'r': | 343 | case 'r': |
342 | raw_mode = true; | 344 | flags |= SB_RAW_MODE; |
343 | break; | 345 | break; |
344 | case 'a': | 346 | case 'a': |
345 | { | 347 | { |
@@ -364,6 +366,9 @@ int main(int argc, char **argv) | |||
364 | case 'b': | 366 | case 'b': |
365 | brute_force = true; | 367 | brute_force = true; |
366 | break; | 368 | break; |
369 | case 254: | ||
370 | flags |= SB_IGNORE_SHA1; | ||
371 | break; | ||
367 | default: | 372 | default: |
368 | bug("Internal error: unknown option '%c'\n", c); | 373 | bug("Internal error: unknown option '%c'\n", c); |
369 | } | 374 | } |
@@ -390,7 +395,7 @@ int main(int argc, char **argv) | |||
390 | if(force_sb2 || ver == SB_VERSION_2) | 395 | if(force_sb2 || ver == SB_VERSION_2) |
391 | { | 396 | { |
392 | enum sb_error_t err; | 397 | enum sb_error_t err; |
393 | struct sb_file_t *file = sb_read_file(sb_filename, raw_mode, NULL, generic_std_printf, &err); | 398 | struct sb_file_t *file = sb_read_file(sb_filename, flags, NULL, generic_std_printf, &err); |
394 | if(file == NULL) | 399 | if(file == NULL) |
395 | { | 400 | { |
396 | color(OFF); | 401 | color(OFF); |