Add FSS0 support
This commit is contained in:
parent
64d7e5cebd
commit
4a69ea1922
3 changed files with 68 additions and 50 deletions
|
@ -79,31 +79,6 @@ typedef struct _fss_content_t
|
||||||
char name[0x10];
|
char name[0x10];
|
||||||
} fss_content_t;
|
} fss_content_t;
|
||||||
|
|
||||||
static void _update_r2p(const char *path)
|
|
||||||
{
|
|
||||||
char *r2p_path = malloc(256);
|
|
||||||
u32 path_len = strlen(path);
|
|
||||||
strcpy(r2p_path, path);
|
|
||||||
|
|
||||||
while(path_len)
|
|
||||||
{
|
|
||||||
if ((r2p_path[path_len - 1] == '/') || (r2p_path[path_len - 1] == 0x5C))
|
|
||||||
{
|
|
||||||
r2p_path[path_len] = 0;
|
|
||||||
strcat(r2p_path, "reboot_payload.bin");
|
|
||||||
u8 *r2p_payload = sd_file_read(r2p_path, NULL);
|
|
||||||
|
|
||||||
is_ipl_updated(r2p_payload, r2p_path, h_cfg.updater2p ? true : false);
|
|
||||||
|
|
||||||
free(r2p_payload);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
path_len--;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(r2p_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt)
|
int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt)
|
||||||
{
|
{
|
||||||
FIL fp;
|
FIL fp;
|
||||||
|
@ -224,8 +199,6 @@ out:
|
||||||
gfx_printf("Done!\n");
|
gfx_printf("Done!\n");
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
|
|
||||||
_update_r2p(path);
|
|
||||||
|
|
||||||
return (!sept_ctxt ? 1 : sept_used);
|
return (!sept_ctxt ? 1 : sept_used);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "sept.h"
|
#include "sept.h"
|
||||||
|
#include "../config/ini.h"
|
||||||
#include "../gfx/di.h"
|
#include "../gfx/di.h"
|
||||||
|
#include "../hos/fss.h"
|
||||||
#include "../hos/hos.h"
|
#include "../hos/hos.h"
|
||||||
#include "../libs/fatfs/ff.h"
|
#include "../libs/fatfs/ff.h"
|
||||||
#include "../mem/heap.h"
|
#include "../mem/heap.h"
|
||||||
|
@ -28,6 +30,7 @@
|
||||||
#include "../storage/nx_sd.h"
|
#include "../storage/nx_sd.h"
|
||||||
#include "../storage/sdmmc.h"
|
#include "../storage/sdmmc.h"
|
||||||
#include "../utils/btn.h"
|
#include "../utils/btn.h"
|
||||||
|
#include "../utils/list.h"
|
||||||
#include "../utils/types.h"
|
#include "../utils/types.h"
|
||||||
|
|
||||||
#include "../gfx/gfx.h"
|
#include "../gfx/gfx.h"
|
||||||
|
@ -65,42 +68,76 @@ extern void reloc_patcher(u32 payload_dst, u32 payload_src, u32 payload_size);
|
||||||
int reboot_to_sept(const u8 *tsec_fw, const u32 tsec_size, const u32 kb)
|
int reboot_to_sept(const u8 *tsec_fw, const u32 tsec_size, const u32 kb)
|
||||||
{
|
{
|
||||||
FIL fp;
|
FIL fp;
|
||||||
|
bool fss0_sept_used = false;
|
||||||
|
|
||||||
// Copy warmboot reboot code and TSEC fw.
|
// Copy warmboot reboot code and TSEC fw.
|
||||||
memcpy((u8 *)(SEPT_PK1T_ADDR - WB_RST_SIZE), (u8 *)warmboot_reboot, sizeof(warmboot_reboot));
|
memcpy((u8 *)(SEPT_PK1T_ADDR - WB_RST_SIZE), (u8 *)warmboot_reboot, sizeof(warmboot_reboot));
|
||||||
memcpy((void *)SEPT_PK1T_ADDR, tsec_fw, tsec_size);
|
memcpy((void *)SEPT_PK1T_ADDR, tsec_fw, tsec_size);
|
||||||
*(vu32 *)SEPT_TCSZ_ADDR = tsec_size;
|
*(vu32 *)SEPT_TCSZ_ADDR = tsec_size;
|
||||||
|
|
||||||
// Copy sept-primary.
|
LIST_INIT(ini_sections);
|
||||||
if (f_open(&fp, "sd:/sept/sept-primary.bin", FA_READ))
|
if (ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false))
|
||||||
goto error;
|
{
|
||||||
|
bool found = false;
|
||||||
|
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_sections, link)
|
||||||
|
{
|
||||||
|
// Only parse non config sections.
|
||||||
|
if (ini_sec->type == INI_CHOICE && strcmp(ini_sec->name, "config"))
|
||||||
|
{
|
||||||
|
LIST_FOREACH_ENTRY(ini_kv_t, kv, &ini_sec->kvs, link)
|
||||||
|
{
|
||||||
|
if (!strcmp("fss0", kv->key))
|
||||||
|
{
|
||||||
|
fss0_sept_t sept_ctxt;
|
||||||
|
sept_ctxt.kb = kb;
|
||||||
|
sept_ctxt.sept_primary = (void *)SEPT_STG1_ADDR;
|
||||||
|
sept_ctxt.sept_secondary = (void *)SEPT_STG2_ADDR;
|
||||||
|
fss0_sept_used = parse_fss(NULL, kv->val, &sept_ctxt);
|
||||||
|
|
||||||
if (f_read(&fp, (u8 *)SEPT_STG1_ADDR, f_size(&fp), NULL))
|
found = true;
|
||||||
{
|
break;
|
||||||
f_close(&fp);
|
}
|
||||||
goto error;
|
}
|
||||||
|
}
|
||||||
|
if (found)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
f_close(&fp);
|
|
||||||
|
|
||||||
// Copy sept-secondary.
|
|
||||||
if (kb < KB_FIRMWARE_VERSION_810)
|
if (!fss0_sept_used)
|
||||||
{
|
{
|
||||||
if (f_open(&fp, "sd:/sept/sept-secondary_00.enc", FA_READ))
|
// Copy sept-primary.
|
||||||
if (f_open(&fp, "sd:/sept/sept-secondary.enc", FA_READ)) // Try the deprecated version.
|
if (f_open(&fp, "sd:/sept/sept-primary.bin", FA_READ))
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (f_open(&fp, "sd:/sept/sept-secondary_01.enc", FA_READ))
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
|
||||||
|
|
||||||
if (f_read(&fp, (u8 *)SEPT_STG2_ADDR, f_size(&fp), NULL))
|
if (f_read(&fp, (u8 *)SEPT_STG1_ADDR, f_size(&fp), NULL))
|
||||||
{
|
{
|
||||||
|
f_close(&fp);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
f_close(&fp);
|
||||||
|
|
||||||
|
// Copy sept-secondary.
|
||||||
|
if (kb < KB_FIRMWARE_VERSION_810)
|
||||||
|
{
|
||||||
|
if (f_open(&fp, "sd:/sept/sept-secondary_00.enc", FA_READ))
|
||||||
|
if (f_open(&fp, "sd:/sept/sept-secondary.enc", FA_READ)) // Try the deprecated version.
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (f_open(&fp, "sd:/sept/sept-secondary_01.enc", FA_READ))
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f_read(&fp, (u8 *)SEPT_STG2_ADDR, f_size(&fp), NULL))
|
||||||
|
{
|
||||||
|
f_close(&fp);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
goto error;
|
|
||||||
}
|
}
|
||||||
f_close(&fp);
|
|
||||||
|
|
||||||
// Save auto boot config to sept payload, if any.
|
// Save auto boot config to sept payload, if any.
|
||||||
boot_cfg_t *tmp_cfg = malloc(sizeof(boot_cfg_t));
|
boot_cfg_t *tmp_cfg = malloc(sizeof(boot_cfg_t));
|
||||||
|
|
|
@ -304,7 +304,7 @@ get_tsec: ;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memcpy(master_key[kb-1], master_key[kb], 0x10);
|
memcpy(master_key[kb-1], master_key[kb], 0x10);
|
||||||
memcpy(master_key[kb], zeros, 0x10);
|
memset(master_key[kb], 0, 0x10);
|
||||||
}
|
}
|
||||||
if (_key_exists(temp_key)) {
|
if (_key_exists(temp_key)) {
|
||||||
EPRINTF("Unable to derive master key.");
|
EPRINTF("Unable to derive master key.");
|
||||||
|
@ -527,6 +527,8 @@ pkg2_done:
|
||||||
for (u32 j = 0; j < 3; j++) {
|
for (u32 j = 0; j < 3; j++) {
|
||||||
_generate_kek(8, fs_keys[2 + j], master_key[i], aes_kek_generation_source, NULL);
|
_generate_kek(8, fs_keys[2 + j], master_key[i], aes_kek_generation_source, NULL);
|
||||||
se_aes_crypt_block_ecb(8, 0, key_area_key[j][i], aes_key_generation_source);
|
se_aes_crypt_block_ecb(8, 0, key_area_key[j][i], aes_key_generation_source);
|
||||||
|
if (j == 2)
|
||||||
|
gfx_hexdump(i, key_area_key[j][i], 0x10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
se_aes_key_set(8, master_key[i], 0x10);
|
se_aes_key_set(8, master_key[i], 0x10);
|
||||||
|
@ -1088,8 +1090,14 @@ static void _save_key(const char *name, const void *data, u32 len, char *outbuf)
|
||||||
|
|
||||||
static void _save_key_family(const char *name, const void *data, u32 start_key, u32 num_keys, u32 len, char *outbuf) {
|
static void _save_key_family(const char *name, const void *data, u32 start_key, u32 num_keys, u32 len, char *outbuf) {
|
||||||
char temp_name[0x40] = {0};
|
char temp_name[0x40] = {0};
|
||||||
|
if (memcmp(name, "key_area_key_system", 19) == 0) {
|
||||||
|
gfx_hexdump(0, data, num_keys * 0x10);
|
||||||
|
}
|
||||||
for (u32 i = 0; i < num_keys; i++) {
|
for (u32 i = 0; i < num_keys; i++) {
|
||||||
sprintf(temp_name, "%s_%02x", name, i + start_key);
|
sprintf(temp_name, "%s_%02x", name, i + start_key);
|
||||||
|
if (memcmp(name, "key_area_key_system", 19) == 0) {
|
||||||
|
gfx_printf("attempt save key %x\n", i);
|
||||||
|
}
|
||||||
_save_key(temp_name, data + i * len, len, outbuf);
|
_save_key(temp_name, data + i * len, len, outbuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue