summaryrefslogtreecommitdiff
path: root/utils/imxtools/sbtools/sbtoelf.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/imxtools/sbtools/sbtoelf.c')
-rw-r--r--utils/imxtools/sbtools/sbtoelf.c34
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)