Fuses: Difference between revisions
Documenting Mariko ipatches |
No edit summary |
||
(7 intermediate revisions by 2 users not shown) | |||
Line 3,730: | Line 3,730: | ||
==== IROM patch 6 ==== | ==== IROM patch 6 ==== | ||
This patch sanitizes the crypto context right before receiving a RCM message. | This patch sanitizes the crypto context right before receiving a RCM message. | ||
<syntaxhighlight lang="c"> | |||
u32 FUSE_PRIVATEKEYDISABLE = 0x7000F828; | |||
u32 SE1_CRYPTO_KEYTABLE_ADDR = 0x7001231C; | |||
u32 SE2_CRYPTO_KEYTABLE_ADDR = 0x7041231C; | |||
u32 SE1_CRYPTO_KEYTABLE_DATA = 0x70012320; | |||
u32 SE2_CRYPTO_KEYTABLE_DATA = 0x70412320; | |||
// Hide the private key fuses | |||
*(u32 *)FUSE_PRIVATEKEYDISABLE = 0x1; | |||
u32 crypto_keytable_val = 0xE0; | |||
// Clear SE1/SE2 keyslot 0xE (contains the SBK) | |||
for (int i = 0; i < 0x7; i++) { | |||
*(u32 *)SE1_CRYPTO_KEYTABLE_ADDR = crypto_keytable_val; | |||
*(u32 *)SE1_CRYPTO_KEYTABLE_DATA = 0; | |||
*(u32 *)SE2_CRYPTO_KEYTABLE_ADDR = crypto_keytable_val; | |||
*(u32 *)SE2_CRYPTO_KEYTABLE_DATA = 0; | |||
crypto_keytable_val++; | |||
} | |||
crypto_keytable_val = 0xF0; | |||
// Clear SE1/SE2 keyslot 0xF (contains the SSK) | |||
for (int i = 0; i < 0x07; i++) { | |||
*(u32 *)SE1_CRYPTO_KEYTABLE_ADDR = crypto_keytable_val; | |||
*(u32 *)SE1_CRYPTO_KEYTABLE_DATA = 0; | |||
*(u32 *)SE2_CRYPTO_KEYTABLE_ADDR = crypto_keytable_val; | |||
*(u32 *)SE2_CRYPTO_KEYTABLE_DATA = 0; | |||
crypto_keytable_val++; | |||
} | |||
crypto_keytable_val = 0xC0; | |||
// Clear SE1/SE2 keyslot 0xC (contains the KEK) | |||
for (int i = 0; i < 0x7; i++) { | |||
*(u32 *)SE1_CRYPTO_KEYTABLE_ADDR = crypto_keytable_val; | |||
*(u32 *)SE1_CRYPTO_KEYTABLE_DATA = 0; | |||
*(u32 *)SE2_CRYPTO_KEYTABLE_ADDR = crypto_keytable_val; | |||
*(u32 *)SE2_CRYPTO_KEYTABLE_DATA = 0; | |||
crypto_keytable_val++; | |||
} | |||
u8 se_instance = 0; // SE1 | |||
u8 se_src_key_slot = 0xD; | |||
u8 se_src_key_size = 0; // 128 bits | |||
u8 se_dst_key_slot = 0xD; | |||
u8 se_dst_key_size = 0; // 128 bits | |||
u8 *se_src_key_data = 0x40004164; | |||
// Overwrite SE1 keyslot 0xD (contains the BEK) | |||
se_decrypt_key_into_key_slot(se_instance, se_src_key_slot, se_src_key_size, se_dst_key_slot, se_dst_key_size, se_src_key_data); | |||
se_instance = 1; // SE2 | |||
// Overwrite SE2 keyslot 0xD (contains the BEK) | |||
se_decrypt_key_into_key_slot(se_instance, se_src_key_slot, se_src_key_size, se_dst_key_slot, se_dst_key_size, se_src_key_data); | |||
/* | |||
Untranslated instructions: | |||
LDR R0, =0x4000FC20 | |||
MOV R8, R0 | |||
*/ | |||
return; | |||
</syntaxhighlight> | |||
==== IROM patch 7 ==== | ==== IROM patch 7 ==== | ||
Line 3,824: | Line 3,892: | ||
| 17.0.0-18.1.0 | | 17.0.0-18.1.0 | ||
| 19 | | 19 | ||
| 1 | |||
|- | |||
| 19.0.0-19.0.1 | |||
| 20 | |||
| 1 | |||
|- | |||
| 20.0.0-20.1.5 | |||
| 21 | |||
| 1 | | 1 | ||
|} | |} |