mirror of
https://github.com/Decscots/Lockpick_RCM
synced 2024-11-15 06:56:35 +00:00
se: Hardcode internal se vars, add HMAC-SHA256
This commit is contained in:
parent
5f100fef8a
commit
5d44ef0af6
3 changed files with 48 additions and 11 deletions
|
@ -94,17 +94,15 @@ static int _se_wait()
|
||||||
|
|
||||||
static int _se_execute(u32 op, void *dst, u32 dst_size, const void *src, u32 src_size)
|
static int _se_execute(u32 op, void *dst, u32 dst_size, const void *src, u32 src_size)
|
||||||
{
|
{
|
||||||
se_ll_t *ll_dst = NULL, *ll_src = NULL;
|
se_ll_t *ll_dst = (se_ll_t *)0xECFFFFE0, *ll_src = (se_ll_t *)0xECFFFFF0;
|
||||||
|
|
||||||
if (dst)
|
if (dst)
|
||||||
{
|
{
|
||||||
ll_dst = (se_ll_t *)malloc(sizeof(se_ll_t));
|
|
||||||
_se_ll_init(ll_dst, (u32)dst, dst_size);
|
_se_ll_init(ll_dst, (u32)dst, dst_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src)
|
if (src)
|
||||||
{
|
{
|
||||||
ll_src = (se_ll_t *)malloc(sizeof(se_ll_t));
|
|
||||||
_se_ll_init(ll_src, (u32)src, src_size);
|
_se_ll_init(ll_src, (u32)src, src_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,11 +118,6 @@ static int _se_execute(u32 op, void *dst, u32 dst_size, const void *src, u32 src
|
||||||
|
|
||||||
bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY);
|
bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY);
|
||||||
|
|
||||||
if (src)
|
|
||||||
free(ll_src);
|
|
||||||
if (dst)
|
|
||||||
free(ll_dst);
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -428,7 +421,7 @@ int se_calc_sha256(void *dst, const void *src, u32 src_size)
|
||||||
int res;
|
int res;
|
||||||
// Setup config for SHA256, size = BITS(src_size).
|
// Setup config for SHA256, size = BITS(src_size).
|
||||||
SE(SE_CONFIG_REG_OFFSET) = SE_CONFIG_ENC_MODE(MODE_SHA256) | SE_CONFIG_ENC_ALG(ALG_SHA) | SE_CONFIG_DST(DST_HASHREG);
|
SE(SE_CONFIG_REG_OFFSET) = SE_CONFIG_ENC_MODE(MODE_SHA256) | SE_CONFIG_ENC_ALG(ALG_SHA) | SE_CONFIG_DST(DST_HASHREG);
|
||||||
SE(SE_SHA_CONFIG_REG_OFFSET) = SHA_ENABLE;
|
SE(SE_SHA_CONFIG_REG_OFFSET) = SHA_INIT_ENABLE;
|
||||||
SE(SE_SHA_MSG_LENGTH_REG_OFFSET) = (u32)(src_size << 3);
|
SE(SE_SHA_MSG_LENGTH_REG_OFFSET) = (u32)(src_size << 3);
|
||||||
SE(SE_SHA_MSG_LENGTH_REG_OFFSET + 4 * 1) = 0;
|
SE(SE_SHA_MSG_LENGTH_REG_OFFSET + 4 * 1) = 0;
|
||||||
SE(SE_SHA_MSG_LENGTH_REG_OFFSET + 4 * 2) = 0;
|
SE(SE_SHA_MSG_LENGTH_REG_OFFSET + 4 * 2) = 0;
|
||||||
|
@ -448,3 +441,46 @@ int se_calc_sha256(void *dst, const void *src, u32 src_size)
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int se_calc_hmac_sha256(void *dst, const void *src, u32 src_size, const void *key, u32 key_size) {
|
||||||
|
int res = 0;
|
||||||
|
u8 *secret = (u8 *)malloc(0x40);
|
||||||
|
u8 *ipad = (u8 *)malloc(0x40 + src_size);
|
||||||
|
u8 *opad = (u8 *)malloc(0x60);
|
||||||
|
|
||||||
|
if (key_size > 0x40)
|
||||||
|
{
|
||||||
|
if (!se_calc_sha256(secret, key, key_size))
|
||||||
|
goto out;
|
||||||
|
memset(secret + 0x20, 0, 0x20);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(secret, key, key_size);
|
||||||
|
memset(secret + key_size, 0, 0x40 - key_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 *secret32 = (u32 *)secret;
|
||||||
|
u32 *ipad32 = (u32 *)ipad;
|
||||||
|
u32 *opad32 = (u32 *)opad;
|
||||||
|
for (u32 i = 0; i < 0x10; i++)
|
||||||
|
{
|
||||||
|
ipad32[i] = secret32[i] ^ 0x36363636;
|
||||||
|
opad32[i] = secret32[i] ^ 0x5C5C5C5C;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(ipad + 0x40, src, src_size);
|
||||||
|
if (!se_calc_sha256(dst, ipad, 0x40 + src_size))
|
||||||
|
goto out;
|
||||||
|
memcpy(opad + 0x40, dst, 0x20);
|
||||||
|
if (!se_calc_sha256(dst, opad, 0x60))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
res = 1;
|
||||||
|
|
||||||
|
out:;
|
||||||
|
free(secret);
|
||||||
|
free(ipad);
|
||||||
|
free(opad);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
|
@ -35,5 +35,6 @@ int se_aes_xts_crypt_sec(u32 ks1, u32 ks2, u32 enc, u64 sec, void *dst, const vo
|
||||||
int se_aes_xts_crypt(u32 ks1, u32 ks2, u32 enc, u64 sec, void *dst, const void *src, u32 secsize, u32 num_secs);
|
int se_aes_xts_crypt(u32 ks1, u32 ks2, u32 enc, u64 sec, void *dst, const void *src, u32 secsize, u32 num_secs);
|
||||||
int se_aes_cmac(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size);
|
int se_aes_cmac(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size);
|
||||||
int se_calc_sha256(void *dst, const void *src, u32 src_size);
|
int se_calc_sha256(void *dst, const void *src, u32 src_size);
|
||||||
|
int se_calc_hmac_sha256(void *dst, const void *src, u32 src_size, const void *key, u32 key_size);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -231,8 +231,8 @@
|
||||||
#define SE_SPARE_0_REG_OFFSET 0x80c
|
#define SE_SPARE_0_REG_OFFSET 0x80c
|
||||||
|
|
||||||
#define SE_SHA_CONFIG_REG_OFFSET 0x200
|
#define SE_SHA_CONFIG_REG_OFFSET 0x200
|
||||||
#define SHA_DISABLE 0
|
#define SHA_INIT_DISABLE 0
|
||||||
#define SHA_ENABLE 1
|
#define SHA_INIT_ENABLE 1
|
||||||
|
|
||||||
#define SE_SHA_MSG_LENGTH_REG_OFFSET 0x204
|
#define SE_SHA_MSG_LENGTH_REG_OFFSET 0x204
|
||||||
#define SE_SHA_MSG_LEFT_REG_OFFSET 0x214
|
#define SE_SHA_MSG_LEFT_REG_OFFSET 0x214
|
||||||
|
|
Loading…
Reference in a new issue