diff options
Diffstat (limited to 'utils/imxtools/sbtools/sbtoelf.c')
-rw-r--r-- | utils/imxtools/sbtools/sbtoelf.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/utils/imxtools/sbtools/sbtoelf.c b/utils/imxtools/sbtools/sbtoelf.c index 540d55acc1..e68f5e6e06 100644 --- a/utils/imxtools/sbtools/sbtoelf.c +++ b/utils/imxtools/sbtools/sbtoelf.c | |||
@@ -231,6 +231,7 @@ static void usage(void) | |||
231 | printf(" -2/--v2\tForce to read file as a version 2 file\n"); | 231 | printf(" -2/--v2\tForce to read file as a version 2 file\n"); |
232 | printf(" -s/--no-simpl\tPrevent elf files from being simplified*\n"); | 232 | printf(" -s/--no-simpl\tPrevent elf files from being simplified*\n"); |
233 | printf(" -x\t\tUse default sb1 key\n"); | 233 | printf(" -x\t\tUse default sb1 key\n"); |
234 | printf(" -b\tBrute force key\n"); | ||
234 | printf("Options marked with a * are for debug purpose only\n"); | 235 | printf("Options marked with a * are for debug purpose only\n"); |
235 | exit(1); | 236 | exit(1); |
236 | } | 237 | } |
@@ -308,6 +309,7 @@ int main(int argc, char **argv) | |||
308 | const char *loopback = NULL; | 309 | const char *loopback = NULL; |
309 | bool force_sb1 = false; | 310 | bool force_sb1 = false; |
310 | bool force_sb2 = false; | 311 | bool force_sb2 = false; |
312 | bool brute_force = false; | ||
311 | 313 | ||
312 | while(1) | 314 | while(1) |
313 | { | 315 | { |
@@ -325,7 +327,7 @@ int main(int argc, char **argv) | |||
325 | {0, 0, 0, 0} | 327 | {0, 0, 0, 0} |
326 | }; | 328 | }; |
327 | 329 | ||
328 | int c = getopt_long(argc, argv, "?do:k:zra:nl:f12xs", long_options, NULL); | 330 | int c = getopt_long(argc, argv, "?do:k:zra:nl:f12xsb", long_options, NULL); |
329 | if(c == -1) | 331 | if(c == -1) |
330 | break; | 332 | break; |
331 | switch(c) | 333 | switch(c) |
@@ -391,6 +393,9 @@ int main(int argc, char **argv) | |||
391 | case 's': | 393 | case 's': |
392 | g_elf_simplify = false; | 394 | g_elf_simplify = false; |
393 | break; | 395 | break; |
396 | case 'b': | ||
397 | brute_force = true; | ||
398 | break; | ||
394 | default: | 399 | default: |
395 | abort(); | 400 | abort(); |
396 | } | 401 | } |
@@ -442,6 +447,33 @@ int main(int argc, char **argv) | |||
442 | } | 447 | } |
443 | else if(force_sb1 || ver == SB_VERSION_1) | 448 | else if(force_sb1 || ver == SB_VERSION_1) |
444 | { | 449 | { |
450 | if(brute_force) | ||
451 | { | ||
452 | struct crypto_key_t key; | ||
453 | enum sb1_error_t err; | ||
454 | if(!sb1_brute_force(sb_filename, NULL, sb_printf, &err, &key)) | ||
455 | { | ||
456 | color(OFF); | ||
457 | printf("Brute force failed: %d\n", err); | ||
458 | return 1; | ||
459 | } | ||
460 | color(RED); | ||
461 | printf("Key found:"); | ||
462 | color(YELLOW); | ||
463 | for(int i = 0; i < 32; i++) | ||
464 | printf(" %08x", key.u.xor_key[i / 16].k[i % 16]); | ||
465 | color(OFF); | ||
466 | printf("\n"); | ||
467 | color(RED); | ||
468 | printf("Key: "); | ||
469 | color(YELLOW); | ||
470 | for(int i = 0; i < 128; i++) | ||
471 | printf("%02x", key.u.xor_key[i / 64].key[i % 64]); | ||
472 | color(OFF); | ||
473 | printf("\n"); | ||
474 | add_keys(&key, 1); | ||
475 | } | ||
476 | |||
445 | enum sb1_error_t err; | 477 | enum sb1_error_t err; |
446 | struct sb1_file_t *file = sb1_read_file(sb_filename, NULL, sb_printf, &err); | 478 | struct sb1_file_t *file = sb1_read_file(sb_filename, NULL, sb_printf, &err); |
447 | if(file == NULL) | 479 | if(file == NULL) |