pkg2: do not hash kernel/ini1 if exo

This commit is contained in:
CTCaer 2022-01-20 13:34:18 +02:00
parent 836530d4e3
commit 6ac9d79282
3 changed files with 14 additions and 11 deletions

View file

@ -1071,7 +1071,7 @@ int hos_launch(ini_sec_t *cfg)
} }
// Rebuild and encrypt package2. // Rebuild and encrypt package2.
pkg2_build_encrypt((void *)PKG2_LOAD_ADDR, &ctxt, &kip1_info); pkg2_build_encrypt((void *)PKG2_LOAD_ADDR, &ctxt, &kip1_info, is_exo);
// Configure Exosphere if secmon is replaced. // Configure Exosphere if secmon is replaced.
if (is_exo) if (is_exo)

View file

@ -742,7 +742,7 @@ 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 *hos_ctxt, link_t *kips_info) void pkg2_build_encrypt(void *dst, void *hos_ctxt, link_t *kips_info, bool is_exo)
{ {
u8 *pdst = (u8 *)dst; u8 *pdst = (u8 *)dst;
launch_ctxt_t * ctxt = (launch_ctxt_t *)hos_ctxt; launch_ctxt_t * ctxt = (launch_ctxt_t *)hos_ctxt;
@ -807,13 +807,16 @@ DPRINTF("kernel encrypted\n");
ini1_size = _pkg2_ini1_build(pdst, hdr, kips_info, false); 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. if (!is_exo) // Not needed on Exosphere 1.0.0 and up.
u8 *pk2_hash_data = (u8 *)dst + 0x100 + sizeof(pkg2_hdr_t); {
se_calc_sha256_oneshot(&hdr->sec_sha256[0x20 * PKG2_SEC_KERNEL], // Calculate SHA256 over encrypted Kernel and INI1.
(void *)pk2_hash_data, hdr->sec_size[PKG2_SEC_KERNEL]); u8 *pk2_hash_data = (u8 *)dst + 0x100 + sizeof(pkg2_hdr_t);
pk2_hash_data += hdr->sec_size[PKG2_SEC_KERNEL]; se_calc_sha256_oneshot(&hdr->sec_sha256[SE_SHA_256_SIZE * PKG2_SEC_KERNEL],
se_calc_sha256_oneshot(&hdr->sec_sha256[0x20 * PKG2_SEC_INI1], (void *)pk2_hash_data, hdr->sec_size[PKG2_SEC_KERNEL]);
(void *)pk2_hash_data, hdr->sec_size[PKG2_SEC_INI1]); pk2_hash_data += hdr->sec_size[PKG2_SEC_KERNEL];
se_calc_sha256_oneshot(&hdr->sec_sha256[SE_SHA_256_SIZE * PKG2_SEC_INI1],
(void *)pk2_hash_data, hdr->sec_size[PKG2_SEC_INI1]);
}
// Encrypt header. // Encrypt header.
*(u32 *)hdr->ctr = 0x100 + sizeof(pkg2_hdr_t) + kernel_size + ini1_size; *(u32 *)hdr->ctr = 0x100 + sizeof(pkg2_hdr_t) + kernel_size + ini1_size;

View file

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2018 naehrwert * Copyright (c) 2018 naehrwert
* Copyright (c) 2018-2020 CTCaer * Copyright (c) 2018-2022 CTCaer
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
@ -156,6 +156,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, bool is_exo); pkg2_hdr_t *pkg2_decrypt(void *data, u8 kb, bool is_exo);
void pkg2_build_encrypt(void *dst, void *hos_ctxt, link_t *kips_info); void pkg2_build_encrypt(void *dst, void *hos_ctxt, link_t *kips_info, bool is_exo);
#endif #endif