summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2014-09-07 12:12:09 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2014-09-07 17:47:00 +0200
commit3c558127b83d162636fb27d2ded1f02c88413e37 (patch)
tree06440e649a657da8821f0e01de1a514bba2326b6 /utils
parent6957966c861498861008b27349dfbe209973a02f (diff)
downloadrockbox-3c558127b83d162636fb27d2ded1f02c88413e37.tar.gz
rockbox-3c558127b83d162636fb27d2ded1f02c88413e37.zip
sbtools: add option to ignore sha1 errors
Change-Id: I6bf9e4671e57f8ff3f436660e8ecb561027a036c
Diffstat (limited to 'utils')
-rw-r--r--utils/imxtools/sbtools/sb.c22
-rw-r--r--utils/imxtools/sbtools/sb.h11
-rw-r--r--utils/imxtools/sbtools/sbtoelf.c11
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
649struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, 649struct 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
655struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, bool raw_mode, void *u, 655struct 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
707struct sb_file_t *sb_read_memory(void *_buf, size_t filesize, bool raw_mode, void *u, 707struct 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
237enum sb_error_t sb_write_file(struct sb_file_t *sb, const char *filename, void *u, 240enum 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);
239struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, 242struct 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 */
242struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, bool raw_mode, void *u, 245struct 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);
244struct sb_file_t *sb_read_memory(void *buffer, size_t size, bool raw_mode, void *u, 247struct 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
247uint64_t sb_generate_timestamp(void); 250uint64_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
270int main(int argc, char **argv) 271int 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);