Validate more file I/O calls

This commit is contained in:
shchmue 2019-10-07 13:18:14 -06:00
parent 0024f049b6
commit 5d1386cc10

View File

@ -175,7 +175,8 @@ void dump_keys() {
if (pkg1_id->kb >= KB_FIRMWARE_VERSION_700) { if (pkg1_id->kb >= KB_FIRMWARE_VERSION_700) {
sd_mount(); sd_mount();
if (!f_stat("sd:/sept/payload.bak", NULL)) { if (!f_stat("sd:/sept/payload.bak", NULL)) {
f_unlink("sd:/sept/payload.bin"); if (f_unlink("sd:/sept/payload.bin"))
gfx_printf("%kNote: no payload.bin already in /sept\n", colors[(color_idx++) % 6]);
f_rename("sd:/sept/payload.bak", "sd:/sept/payload.bin"); f_rename("sd:/sept/payload.bak", "sd:/sept/payload.bin");
} }
@ -188,16 +189,27 @@ void dump_keys() {
goto get_tsec; goto get_tsec;
} }
// backup post-reboot payload // backup post-reboot payload
if (!f_stat("sd:/sept/payload.bin", NULL)) if (!f_stat("sd:/sept/payload.bin", NULL)) {
f_rename("sd:/sept/payload.bin", "sd:/sept/payload.bak"); if (f_rename("sd:/sept/payload.bin", "sd:/sept/payload.bak")) {
EPRINTF("Unable to backup payload.bin.");
goto out_wait;
}
}
// write self to payload.bin to run again when sept finishes // write self to payload.bin to run again when sept finishes
f_open(&fp, "sd:/sept/payload.bin", FA_CREATE_NEW | FA_WRITE);
u32 payload_size = *(u32 *)(IPL_LOAD_ADDR + 0x84) - IPL_LOAD_ADDR; u32 payload_size = *(u32 *)(IPL_LOAD_ADDR + 0x84) - IPL_LOAD_ADDR;
f_write(&fp, (u8 *)IPL_LOAD_ADDR, payload_size, NULL); if (f_open(&fp, "sd:/sept/payload.bin", FA_CREATE_NEW | FA_WRITE)) {
EPRINTF("Unable to open /sept/payload.bin to write.");
goto out_wait;
}
if (f_write(&fp, (u8 *)IPL_LOAD_ADDR, payload_size, NULL)) {
EPRINTF("Unable to write self to /sept/payload.bin.");
fclose(&fp);
goto out_wait;
}
f_close(&fp); f_close(&fp);
gfx_printf("%k\nFirmware 7.x or higher detected.\n\n", colors[(color_idx++) % 6]); gfx_printf("%k\nFirmware 7.x or higher detected.\n\n", colors[(color_idx++) % 6]);
gfx_printf("%kRenamed /sept/payload.bin", colors[(color_idx++) % 6]); gfx_printf("%kRenamed /sept/payload.bin", colors[(color_idx++) % 6]);
gfx_printf("\n to /sept/payload.bak\n\n", colors[(color_idx++) % 6]); gfx_printf("\n to /sept/payload.bak\n\n");
gfx_printf("%kCopied self to /sept/payload.bin\n", colors[(color_idx++) % 6]); gfx_printf("%kCopied self to /sept/payload.bin\n", colors[(color_idx++) % 6]);
sdmmc_storage_end(&storage); sdmmc_storage_end(&storage);
if (!reboot_to_sept((u8 *)tsec_ctxt.fw, tsec_ctxt.size, pkg1_id->kb)) if (!reboot_to_sept((u8 *)tsec_ctxt.fw, tsec_ctxt.size, pkg1_id->kb))
@ -959,7 +971,8 @@ dismount:
nx_emmc_gpt_free(&gpt); nx_emmc_gpt_free(&gpt);
key_output: ; key_output: ;
char *text_buffer = (char *)calloc(1, _titlekey_count * 68 < 0x3000 ? 0x3000 : _titlekey_count * 68 + 1); u32 text_buffer_size = _titlekey_count * 68 < 0x3000 ? 0x3000 : _titlekey_count * 68 + 1;
char *text_buffer = (char *)calloc(1, text_buffer_size);
SAVE_KEY("aes_kek_generation_source", aes_kek_generation_source, 0x10); SAVE_KEY("aes_kek_generation_source", aes_kek_generation_source, 0x10);
SAVE_KEY("aes_key_generation_source", aes_key_generation_source, 0x10); SAVE_KEY("aes_key_generation_source", aes_key_generation_source, 0x10);
@ -1026,7 +1039,10 @@ key_output: ;
gfx_printf("%kLockpick totally done in %d us\n\n", colors[(color_idx++) % 6], end_time - begin_time); gfx_printf("%kLockpick totally done in %d us\n\n", colors[(color_idx++) % 6], end_time - begin_time);
gfx_printf("%kFound through master_key_%02x.\n\n", colors[(color_idx++) % 6], MAX_KEY - 1); gfx_printf("%kFound through master_key_%02x.\n\n", colors[(color_idx++) % 6], MAX_KEY - 1);
f_mkdir("sd:/switch"); if (f_mkdir("sd:/switch")) {
EPRINTF("Unable to create /switch folder on SD.\nNo keyfiles written.");
goto free_buffers;
}
char keyfile_path[30] = "sd:/switch/"; char keyfile_path[30] = "sd:/switch/";
if (!(fuse_read_odm(4) & 3)) if (!(fuse_read_odm(4) & 3))
sprintf(&keyfile_path[11], "prod.keys"); sprintf(&keyfile_path[11], "prod.keys");
@ -1038,8 +1054,8 @@ key_output: ;
EPRINTF("Unable to save keys to SD."); EPRINTF("Unable to save keys to SD.");
if (_titlekey_count == 0) if (_titlekey_count == 0)
goto out_wait; goto free_buffers;
memset(text_buffer, 0, _titlekey_count * 68 + 1); memset(text_buffer, 0, text_buffer_size);
for (u32 i = 0; i < _titlekey_count; i++) { for (u32 i = 0; i < _titlekey_count; i++) {
for (u32 j = 0; j < 0x10; j++) for (u32 j = 0; j < 0x10; j++)
sprintf(&text_buffer[i * 68 + j * 2], "%02x", rights_ids[i * 0x10 + j]); sprintf(&text_buffer[i * 68 + j * 2], "%02x", rights_ids[i * 0x10 + j]);
@ -1053,6 +1069,8 @@ key_output: ;
gfx_printf("%kWrote %d bytes to %s\n", colors[(color_idx++) % 6], (u32)fno.fsize, keyfile_path); gfx_printf("%kWrote %d bytes to %s\n", colors[(color_idx++) % 6], (u32)fno.fsize, keyfile_path);
} else } else
EPRINTF("Unable to save titlekeys to SD."); EPRINTF("Unable to save titlekeys to SD.");
free_buffers:
free(rights_ids); free(rights_ids);
free(titlekeys); free(titlekeys);
free(text_buffer); free(text_buffer);