mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-29 00:59:56 -06:00
* base for potentially re-encrypting modcrypt, doesn't seem to be required? but can also serve to decrypt it
* revise SD IRQ behavior (fixing potential hang when loading DS games)
This commit is contained in:
@ -398,7 +398,7 @@ void Update()
|
||||
{
|
||||
Ctx.Iv[13] = 0x00;
|
||||
Ctx.Iv[14] = 0x00;
|
||||
Ctx.Iv[15] = 0x00;_printhex(Ctx.Iv, 16);
|
||||
Ctx.Iv[15] = 0x00;
|
||||
AES_CTR_xcrypt_buffer(&Ctx, CurMAC, 16);
|
||||
|
||||
//printf("FINAL MAC: "); _printhexR(CurMAC, 16);
|
||||
@ -505,4 +505,63 @@ void WriteKeyY(u32 slot, u32 offset, u32 val, u32 mask)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// utility
|
||||
|
||||
void GetModcryptKey(u8* romheader, u8* key)
|
||||
{
|
||||
if ((romheader[0x01C] & 0x04) || (romheader[0x1BF] & 0x80))
|
||||
{
|
||||
// dev key
|
||||
memcpy(key, &romheader[0x000], 16);
|
||||
return;
|
||||
}
|
||||
|
||||
u8 oldkeys[16*3];
|
||||
memcpy(&oldkeys[16*0], KeyX[0], 16);
|
||||
memcpy(&oldkeys[16*1], KeyY[0], 16);
|
||||
memcpy(&oldkeys[16*2], KeyNormal[0], 16);
|
||||
|
||||
KeyX[0][8] = romheader[0x00C];
|
||||
KeyX[0][9] = romheader[0x00D];
|
||||
KeyX[0][10] = romheader[0x00E];
|
||||
KeyX[0][11] = romheader[0x00F];
|
||||
KeyX[0][12] = romheader[0x00F];
|
||||
KeyX[0][13] = romheader[0x00E];
|
||||
KeyX[0][14] = romheader[0x00D];
|
||||
KeyX[0][15] = romheader[0x00C];
|
||||
|
||||
memcpy(KeyY[0], &romheader[0x350], 16);
|
||||
|
||||
DeriveNormalKey(0);
|
||||
memcpy(key, KeyNormal[0], 16);
|
||||
|
||||
memcpy(KeyX[0], &oldkeys[16*0], 16);
|
||||
memcpy(KeyY[0], &oldkeys[16*1], 16);
|
||||
memcpy(KeyNormal[0], &oldkeys[16*2], 16);
|
||||
}
|
||||
|
||||
void ApplyModcrypt(u8* data, u32 len, u8* key, u8* iv)
|
||||
{
|
||||
u8 key_rev[16], iv_rev[16];
|
||||
u8 data_rev[16];
|
||||
u8 oldkeys[16*2];
|
||||
memcpy(&oldkeys[16*0], Ctx.RoundKey, 16);
|
||||
memcpy(&oldkeys[16*1], Ctx.Iv, 16);
|
||||
|
||||
Swap16(key_rev, key);
|
||||
Swap16(iv_rev, iv);
|
||||
AES_init_ctx_iv(&Ctx, key_rev, iv_rev);
|
||||
|
||||
for (u32 i = 0; i < len; i += 16)
|
||||
{
|
||||
Swap16(data_rev, &data[i]);
|
||||
AES_CTR_xcrypt_buffer(&Ctx, data_rev, 16);
|
||||
Swap16(&data[i], data_rev);
|
||||
}
|
||||
|
||||
memcpy(Ctx.RoundKey, &oldkeys[16*0], 16);
|
||||
memcpy(Ctx.Iv, &oldkeys[16*1], 16);
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user