1
0
Fork 0
forked from len0rd/rockbox

sbtools: add option to ignore sha1 errors

Change-Id: I6bf9e4671e57f8ff3f436660e8ecb561027a036c
This commit is contained in:
Amaury Pouly 2014-09-07 12:12:09 +02:00
parent 6957966c86
commit 3c558127b8
3 changed files with 30 additions and 14 deletions

View file

@ -646,14 +646,14 @@ static uint32_t guess_alignment(uint32_t off)
return a; return a;
} }
struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, struct sb_file_t *sb_read_file(const char *filename, unsigned flags, void *u,
generic_printf_t cprintf, enum sb_error_t *err) generic_printf_t cprintf, enum sb_error_t *err)
{ {
return sb_read_file_ex(filename, 0, -1, raw_mode, u, cprintf, err); return sb_read_file_ex(filename, 0, -1, flags, u, cprintf, err);
} }
struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, bool raw_mode, void *u, struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size,
generic_printf_t cprintf, enum sb_error_t *err) unsigned flags, void *u, generic_printf_t cprintf, enum sb_error_t *err)
{ {
#define fatal(e, ...) \ #define fatal(e, ...) \
do { if(err) *err = e; \ 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
} }
fclose(f); fclose(f);
struct sb_file_t *ret = sb_read_memory(buf, read_size, raw_mode, u, cprintf, err); struct sb_file_t *ret = sb_read_memory(buf, read_size, flags, u, cprintf, err);
free(buf); free(buf);
return ret; return ret;
@ -704,7 +704,7 @@ static void sb_printer(void *user, const char *fmt, ...)
va_end(args); va_end(args);
} }
struct sb_file_t *sb_read_memory(void *_buf, size_t filesize, bool raw_mode, void *u, struct sb_file_t *sb_read_memory(void *_buf, size_t filesize, unsigned flags, void *u,
generic_printf_t cprintf, enum sb_error_t *err) generic_printf_t cprintf, enum sb_error_t *err)
{ {
struct sb_file_t *sb_file = NULL; 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
} }
/* sections */ /* sections */
if(!raw_mode) if(!(flags & SB_RAW_MODE))
{ {
sb_file->nr_sections = sb_header->nr_sections; sb_file->nr_sections = sb_header->nr_sections;
sb_file->sections = xmalloc(sb_file->nr_sections * sizeof(struct sb_section_t)); 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
sha_1_output(&sha_1_params, computed_sha1); sha_1_output(&sha_1_params, computed_sha1);
if(memcmp(decrypted_block, computed_sha1, 20) == 0) if(memcmp(decrypted_block, computed_sha1, 20) == 0)
printf(RED, " Ok\n"); printf(RED, " Ok\n");
else if(flags & SB_IGNORE_SHA1)
{
/* some weird images produced by some buggy tools have wrong SHA-1,
* this probably gone unnoticed because the bootloader ignores the SH1-1
* anyway */
printf(RED, " Failed\n");
cprintf(u, true, GREY, "Warning: SHA-1 mismatch ignored per flags\n");
}
else else
{ {
printf(RED, " Failed\n"); printf(RED, " Failed\n");

View file

@ -234,14 +234,17 @@ enum sb_error_t
SB_LAST_CRYPTO_ERROR = SB_FIRST_CRYPTO_ERROR - CRYPTO_NUM_ERRORS, SB_LAST_CRYPTO_ERROR = SB_FIRST_CRYPTO_ERROR - CRYPTO_NUM_ERRORS,
}; };
#define SB_RAW_MODE (1 << 0) /* read image in raw mode (aka bootloader-like) */
#define SB_IGNORE_SHA1 (1 << 1) /* ignore SHA-1 mismatch */
enum sb_error_t sb_write_file(struct sb_file_t *sb, const char *filename, void *u, enum sb_error_t sb_write_file(struct sb_file_t *sb, const char *filename, void *u,
generic_printf_t printf); generic_printf_t printf);
struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, struct sb_file_t *sb_read_file(const char *filename, unsigned flags, void *u,
generic_printf_t printf, enum sb_error_t *err); generic_printf_t printf, enum sb_error_t *err);
/* use size_t(-1) to use maximum size */ /* use size_t(-1) to use maximum size */
struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, bool raw_mode, void *u, struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size,
generic_printf_t printf, enum sb_error_t *err); unsigned flags, void *u, generic_printf_t printf, enum sb_error_t *err);
struct sb_file_t *sb_read_memory(void *buffer, size_t size, bool raw_mode, void *u, struct sb_file_t *sb_read_memory(void *buffer, size_t size, unsigned flags, void *u,
generic_printf_t printf, enum sb_error_t *err); generic_printf_t printf, enum sb_error_t *err);
uint64_t sb_generate_timestamp(void); uint64_t sb_generate_timestamp(void);

View file

@ -263,13 +263,14 @@ static void usage(void)
printf(" -s/--no-simpl Prevent elf files from being simplified*\n"); printf(" -s/--no-simpl Prevent elf files from being simplified*\n");
printf(" -x Use default sb1 key\n"); printf(" -x Use default sb1 key\n");
printf(" -b Brute force key\n"); printf(" -b Brute force key\n");
printf(" --ignore-sha1 Ignore SHA-1 mismatch*\n");
printf("Options marked with a * are for debug purpose only\n"); printf("Options marked with a * are for debug purpose only\n");
exit(1); exit(1);
} }
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
bool raw_mode = false; unsigned flags = 0;
const char *loopback = NULL; const char *loopback = NULL;
bool force_sb1 = false; bool force_sb1 = false;
bool force_sb2 = false; bool force_sb2 = false;
@ -288,6 +289,7 @@ int main(int argc, char **argv)
{"v1", no_argument, 0, '1'}, {"v1", no_argument, 0, '1'},
{"v2", no_argument, 0, '2'}, {"v2", no_argument, 0, '2'},
{"no-simpl", no_argument, 0, 's'}, {"no-simpl", no_argument, 0, 's'},
{"ignore-sha1", no_argument, 0, 254},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
@ -339,7 +341,7 @@ int main(int argc, char **argv)
break; break;
} }
case 'r': case 'r':
raw_mode = true; flags |= SB_RAW_MODE;
break; break;
case 'a': case 'a':
{ {
@ -364,6 +366,9 @@ int main(int argc, char **argv)
case 'b': case 'b':
brute_force = true; brute_force = true;
break; break;
case 254:
flags |= SB_IGNORE_SHA1;
break;
default: default:
bug("Internal error: unknown option '%c'\n", c); bug("Internal error: unknown option '%c'\n", c);
} }
@ -390,7 +395,7 @@ int main(int argc, char **argv)
if(force_sb2 || ver == SB_VERSION_2) if(force_sb2 || ver == SB_VERSION_2)
{ {
enum sb_error_t err; enum sb_error_t err;
struct sb_file_t *file = sb_read_file(sb_filename, raw_mode, NULL, generic_std_printf, &err); struct sb_file_t *file = sb_read_file(sb_filename, flags, NULL, generic_std_printf, &err);
if(file == NULL) if(file == NULL)
{ {
color(OFF); color(OFF);