mirror of
https://github.com/CTCaer/hekate
synced 2025-01-21 22:36:08 +00:00
hos: Tiny refactoring
This commit is contained in:
parent
9da0e0358b
commit
d825be5eb2
6 changed files with 23 additions and 20 deletions
|
@ -165,7 +165,7 @@ int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// If content is experimental and experimental flag is not enabled, skip it.
|
// If content is experimental and experimental flag is not enabled, skip it.
|
||||||
if ((curr_fss_cnt[i].flags0 & CNT_FLAG0_EXPERIMENTAL) && !ctxt->fss0_enable_experimental)
|
if ((curr_fss_cnt[i].flags0 & CNT_FLAG0_EXPERIMENTAL) && !ctxt->fss0_experimental)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Parse content.
|
// Parse content.
|
||||||
|
|
|
@ -854,13 +854,11 @@ int hos_launch(ini_sec_t *cfg)
|
||||||
if (!pkg2_hdr)
|
if (!pkg2_hdr)
|
||||||
{
|
{
|
||||||
_hos_crit_error("Pkg2 decryption failed!");
|
_hos_crit_error("Pkg2 decryption failed!");
|
||||||
if (kb >= KB_FIRMWARE_VERSION_700)
|
EPRINTFARGS("Is hekate%s updated?", kb >= KB_FIRMWARE_VERSION_700 ? " or Sept" : "");
|
||||||
{
|
|
||||||
EPRINTF("Is Sept updated?");
|
|
||||||
|
|
||||||
// Clear EKS slot, in case something went wrong with sept keygen.
|
// Clear EKS slot, in case something went wrong with sept keygen.
|
||||||
|
if (kb >= KB_FIRMWARE_VERSION_700)
|
||||||
hos_eks_clear(kb);
|
hos_eks_clear(kb);
|
||||||
}
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
else if (kb >= KB_FIRMWARE_VERSION_700)
|
else if (kb >= KB_FIRMWARE_VERSION_700)
|
||||||
|
@ -964,7 +962,7 @@ int hos_launch(ini_sec_t *cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rebuild and encrypt package2.
|
// Rebuild and encrypt package2.
|
||||||
pkg2_build_encrypt((void *)PKG2_LOAD_ADDR, ctxt.kernel, ctxt.kernel_size, &kip1_info, ctxt.new_pkg2, kb);
|
pkg2_build_encrypt((void *)PKG2_LOAD_ADDR, &ctxt, &kip1_info);
|
||||||
|
|
||||||
gfx_puts("Rebuilt & loaded pkg2\n");
|
gfx_puts("Rebuilt & loaded pkg2\n");
|
||||||
|
|
||||||
|
|
|
@ -97,6 +97,7 @@ typedef struct _launch_ctxt_t
|
||||||
|
|
||||||
void *kernel;
|
void *kernel;
|
||||||
u32 kernel_size;
|
u32 kernel_size;
|
||||||
|
|
||||||
link_t kip1_list;
|
link_t kip1_list;
|
||||||
char* kip1_patches;
|
char* kip1_patches;
|
||||||
|
|
||||||
|
@ -105,7 +106,7 @@ typedef struct _launch_ctxt_t
|
||||||
bool debugmode;
|
bool debugmode;
|
||||||
bool stock;
|
bool stock;
|
||||||
bool atmosphere;
|
bool atmosphere;
|
||||||
bool fss0_enable_experimental;
|
bool fss0_experimental;
|
||||||
bool emummc_forced;
|
bool emummc_forced;
|
||||||
|
|
||||||
exo_ctxt_t exo_ctx;
|
exo_ctxt_t exo_ctx;
|
||||||
|
|
|
@ -253,7 +253,7 @@ static int _config_fss(launch_ctxt_t *ctxt, const char *value)
|
||||||
{
|
{
|
||||||
if (!strcmp("fss0experimental", kv->key))
|
if (!strcmp("fss0experimental", kv->key))
|
||||||
{
|
{
|
||||||
ctxt->fss0_enable_experimental = *kv->val == '1';
|
ctxt->fss0_experimental = *kv->val == '1';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1410,9 +1410,11 @@ DPRINTF("adding kip1 '%s' @ %08X (%08X)\n", ki->kip1->name, (u32)ki->kip1, ki->s
|
||||||
return ini1_size;
|
return ini1_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pkg2_build_encrypt(void *dst, void *kernel, u32 kernel_size, link_t *kips_info, bool new_pkg2, u8 kb)
|
void pkg2_build_encrypt(void *dst, void *hos_ctxt, link_t *kips_info)
|
||||||
{
|
{
|
||||||
u8 *pdst = (u8 *)dst;
|
u8 *pdst = (u8 *)dst;
|
||||||
|
launch_ctxt_t * ctxt = (launch_ctxt_t *)hos_ctxt;
|
||||||
|
u32 kernel_size = ctxt->kernel_size;
|
||||||
|
|
||||||
// Signature.
|
// Signature.
|
||||||
memset(pdst, 0, 0x100);
|
memset(pdst, 0, 0x100);
|
||||||
|
@ -1427,23 +1429,25 @@ void pkg2_build_encrypt(void *dst, void *kernel, u32 kernel_size, link_t *kips_i
|
||||||
hdr->bl_ver = 0;
|
hdr->bl_ver = 0;
|
||||||
hdr->pkg2_ver = 0xFF;
|
hdr->pkg2_ver = 0xFF;
|
||||||
|
|
||||||
if (!new_pkg2)
|
if (!ctxt->new_pkg2)
|
||||||
hdr->base = 0x10000000;
|
hdr->base = 0x10000000;
|
||||||
else
|
else
|
||||||
hdr->base = 0x60000;
|
hdr->base = 0x60000;
|
||||||
DPRINTF("kernel @ %08X (%08X)\n", (u32)kernel, kernel_size);
|
DPRINTF("kernel @ %08X (%08X)\n", (u32)ctxt->kernel, kernel_size);
|
||||||
|
|
||||||
pdst += sizeof(pkg2_hdr_t);
|
pdst += sizeof(pkg2_hdr_t);
|
||||||
|
|
||||||
// Kernel.
|
// Kernel.
|
||||||
memcpy(pdst, kernel, kernel_size);
|
memcpy(pdst, ctxt->kernel, kernel_size);
|
||||||
if (!new_pkg2)
|
if (!ctxt->new_pkg2)
|
||||||
hdr->sec_off[PKG2_SEC_KERNEL] = 0x10000000;
|
hdr->sec_off[PKG2_SEC_KERNEL] = 0x10000000;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Set new INI1 offset to kernel.
|
// Set new INI1 offset to kernel.
|
||||||
*(u32 *)(pdst + pkg2_newkern_ini1_val) = kernel_size;
|
*(u32 *)(pdst + pkg2_newkern_ini1_val) = kernel_size;
|
||||||
kernel_size += _pkg2_ini1_build(pdst + kernel_size, hdr, kips_info, new_pkg2);
|
|
||||||
|
// Build INI1 for new Package2.
|
||||||
|
kernel_size += _pkg2_ini1_build(pdst + kernel_size, hdr, kips_info, ctxt->new_pkg2);
|
||||||
hdr->sec_off[PKG2_SEC_KERNEL] = 0x60000;
|
hdr->sec_off[PKG2_SEC_KERNEL] = 0x60000;
|
||||||
}
|
}
|
||||||
hdr->sec_size[PKG2_SEC_KERNEL] = kernel_size;
|
hdr->sec_size[PKG2_SEC_KERNEL] = kernel_size;
|
||||||
|
@ -1451,10 +1455,10 @@ DPRINTF("kernel @ %08X (%08X)\n", (u32)kernel, kernel_size);
|
||||||
pdst += kernel_size;
|
pdst += kernel_size;
|
||||||
DPRINTF("kernel encrypted\n");
|
DPRINTF("kernel encrypted\n");
|
||||||
|
|
||||||
// INI1.
|
/// Build INI1 for old Package2.
|
||||||
u32 ini1_size = 0;
|
u32 ini1_size = 0;
|
||||||
if (!new_pkg2)
|
if (!ctxt->new_pkg2)
|
||||||
ini1_size = _pkg2_ini1_build(pdst, hdr, kips_info, new_pkg2);
|
ini1_size = _pkg2_ini1_build(pdst, hdr, kips_info, false);
|
||||||
DPRINTF("INI1 encrypted\n");
|
DPRINTF("INI1 encrypted\n");
|
||||||
|
|
||||||
// Calculate SHA256 over encrypted Kernel and INI1.
|
// Calculate SHA256 over encrypted Kernel and INI1.
|
||||||
|
@ -1466,7 +1470,7 @@ DPRINTF("INI1 encrypted\n");
|
||||||
(void *)pk2_hash_data, hdr->sec_size[PKG2_SEC_INI1]);
|
(void *)pk2_hash_data, hdr->sec_size[PKG2_SEC_INI1]);
|
||||||
|
|
||||||
//Encrypt header.
|
//Encrypt header.
|
||||||
u8 key_ver = kb ? kb + 1 : 0;
|
u8 key_ver = ctxt->pkg1_id->kb ? ctxt->pkg1_id->kb + 1 : 0;
|
||||||
*(u32 *)hdr->ctr = 0x100 + sizeof(pkg2_hdr_t) + kernel_size + ini1_size;
|
*(u32 *)hdr->ctr = 0x100 + sizeof(pkg2_hdr_t) + kernel_size + ini1_size;
|
||||||
hdr->ctr[4] = key_ver;
|
hdr->ctr[4] = key_ver;
|
||||||
se_aes_crypt_ctr(pkg2_keyslot, hdr, sizeof(pkg2_hdr_t), hdr, sizeof(pkg2_hdr_t), hdr);
|
se_aes_crypt_ctr(pkg2_keyslot, hdr, sizeof(pkg2_hdr_t), hdr, sizeof(pkg2_hdr_t), hdr);
|
||||||
|
|
|
@ -155,6 +155,6 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames);
|
||||||
|
|
||||||
const pkg2_kernel_id_t *pkg2_identify(u8 *hash);
|
const pkg2_kernel_id_t *pkg2_identify(u8 *hash);
|
||||||
pkg2_hdr_t *pkg2_decrypt(void *data, u8 kb);
|
pkg2_hdr_t *pkg2_decrypt(void *data, u8 kb);
|
||||||
void pkg2_build_encrypt(void *dst, void *kernel, u32 kernel_size, link_t *kips_info, bool new_pkg2, u8 kb);
|
void pkg2_build_encrypt(void *dst, void *hos_ctxt, link_t *kips_info);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue