int main(int argc, char **argv) { char *cmd_filename = NULL; char *output_filename = NULL; struct crypto_key_t real_key; struct crypto_key_t crypto_iv; real_key.method = CRYPTO_NONE; crypto_iv.method = CRYPTO_NONE; while(1) { static struct option long_options[] = { {"help", no_argument, 0, '?'}, {"debug", no_argument, 0, 'd'}, {"add-key", required_argument, 0, 'a'}, {"real-key", required_argument, 0, 'r'}, {"crypto-iv", required_argument, 0, 'i'}, {0, 0, 0, 0} }; int c = getopt_long(argc, argv, "?do:c:k:za:", long_options, NULL); if(c == -1) break; switch(c) { case 'd': g_debug = true; break; case '?': usage(); break; case 'o': output_filename = optarg; break; case 'c': cmd_filename = optarg; break; case 'k': { if(!add_keys_from_file(optarg)) bug("Cannot keys from %s\n", optarg); break; } case 'z': { add_keys(&g_zero_key, 1); break; } case 'a': case 'r': case 'i': { struct crypto_key_t key; char *s = optarg; if(!parse_key(&s, &key)) bug("Invalid key/iv specified as argument"); if(*s != 0) bug("Trailing characters after key/iv specified as argument"); if(c == 'r') memcpy(&real_key, &key, sizeof(key)); else if(c == 'i') memcpy(&crypto_iv, &key, sizeof(key)); else add_keys(&key, 1); break; } default: abort(); } } if(!cmd_filename) bug("You must specify a command file\n"); if(!output_filename) bug("You must specify an output file\n"); g_extern = &argv[optind]; g_extern_count = argc - optind; if(g_debug) { printf("key: %d\n", g_nr_keys); for(int i = 0; i < g_nr_keys; i++) { printf(" "); print_key(&g_key_array[i], true); } for(int i = 0; i < g_extern_count; i++) printf("extern(%d)=%s\n", i, g_extern[i]); } struct cmd_file_t *cmd_file = db_parse_file(cmd_filename); struct sb_file_t *sb_file = apply_cmd_file(cmd_file); db_free(cmd_file); if(real_key.method == CRYPTO_KEY) { sb_file->override_real_key = true; memcpy(sb_file->real_key, real_key.u.key, 16); } if(crypto_iv.method == CRYPTO_KEY) { sb_file->override_crypto_iv = true; memcpy(sb_file->crypto_iv, crypto_iv.u.key, 16); } /* fill with default parameters since there is no command file support for them */ sb_file->drive_tag = 0; sb_file->first_boot_sec_id = sb_file->sections[0].identifier; sb_file->flags = 0; sb_file->minor_version = 1; sb_write_file(sb_file, output_filename); sb_free(sb_file); clear_keys(); return 0; }
int main(int argc, char **argv) { char *cmd_filename = NULL; char *output_filename = NULL; struct crypto_key_t real_key; struct crypto_key_t crypto_iv; memset(&real_key, 0, sizeof(real_key)); memset(&crypto_iv, 0, sizeof(crypto_iv)); real_key.method = CRYPTO_NONE; crypto_iv.method = CRYPTO_NONE; if(argc == 1) usage(); while(1) { static struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"debug", no_argument, 0, 'd'}, {"add-key", required_argument, 0, 'a'}, {"real-key", required_argument, 0, 'r'}, {"crypto-iv", required_argument, 0, 'i'}, {0, 0, 0, 0} }; int c = getopt_long(argc, argv, "hdo:c:k:za:", long_options, NULL); if(c == -1) break; switch(c) { case 'd': g_debug = true; break; case 'h': usage(); break; case 'o': output_filename = optarg; break; case 'c': cmd_filename = optarg; break; case 'k': { if(!add_keys_from_file(optarg)) bug("Cannot keys from %s\n", optarg); break; } case 'z': { struct crypto_key_t g_zero_key; sb_get_zero_key(&g_zero_key); add_keys(&g_zero_key, 1); break; } case 'a': case 'r': case 'i': { struct crypto_key_t key; char *s = optarg; if(!parse_key(&s, &key)) bug("Invalid key/iv specified as argument"); if(*s != 0) bug("Trailing characters after key/iv specified as argument"); if(c == 'r') memcpy(&real_key, &key, sizeof(key)); else if(c == 'i') memcpy(&crypto_iv, &key, sizeof(key)); else add_keys(&key, 1); break; } default: bug("Internal error: unknown option '%c'\n", c); } } if(!cmd_filename) bug("You must specify a command file\n"); if(!output_filename) bug("You must specify an output file\n"); g_extern = &argv[optind]; g_extern_count = argc - optind; if(g_debug) { printf("key: %d\n", g_nr_keys); for(int i = 0; i < g_nr_keys; i++) { printf(" "); print_key(NULL, misc_std_printf, &g_key_array[i], true); } for(int i = 0; i < g_extern_count; i++) printf("extern(%d)=%s\n", i, g_extern[i]); } struct cmd_file_t *cmd_file = db_parse_file(cmd_filename); if(cmd_file == NULL) bug("Error parsing command file\n"); struct sb_file_t *sb_file = apply_cmd_file(cmd_file); db_free(cmd_file); if(real_key.method == CRYPTO_KEY) { sb_file->override_real_key = true; memcpy(sb_file->real_key, real_key.u.key, 16); } if(crypto_iv.method == CRYPTO_KEY) { sb_file->override_crypto_iv = true; memcpy(sb_file->crypto_iv, crypto_iv.u.key, 16); } sb_write_file(sb_file, output_filename, 0, generic_std_printf); sb_free(sb_file); clear_keys(); return 0; }