forked from len0rd/rockbox
sbtools: add option to ignore sha1 errors
Change-Id: I6bf9e4671e57f8ff3f436660e8ecb561027a036c
This commit is contained in:
parent
6957966c86
commit
3c558127b8
3 changed files with 30 additions and 14 deletions
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue