mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
AES暗号化対応
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@45 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
9489eeb559
commit
c3871ba1fa
@ -216,7 +216,7 @@ static u16 ReadAES(u32 block, void *dest, u16 count)
|
||||
{
|
||||
u32 offset = 0; // in bytes
|
||||
|
||||
//OS_TPrintf("ReadAES(%d, 0x%08X, %d) is calling.\n", block, dest, count);
|
||||
OS_TPrintf("ReadAES(%d, 0x%08X, %d) is calling.\n", block, dest, count);
|
||||
|
||||
MIi_NDmaPipeSetup( DMA_PIPE, (void*)SDIF_FI, (void*)REG_AES_IFIFO_ADDR, PIPE_SIZE );
|
||||
|
||||
@ -243,7 +243,7 @@ static u16 ReadAES(u32 block, void *dest, u16 count)
|
||||
while ( AES_GET_CNT_BITS( reg_AES_AES_CNT, IFIFO_CNT ) )
|
||||
{
|
||||
}
|
||||
if ( (offset & SECTOR_SIZE) == 0 )
|
||||
if ( (offset & (SECTOR_SIZE-1)) == 0 )
|
||||
{
|
||||
WaitFifoFull();
|
||||
if ( SDCARD_ErrStatus != SDMC_NORMAL )
|
||||
|
||||
@ -74,8 +74,6 @@ BOOL FATFS_OpenSpecifiedMenu( const char* menufile )
|
||||
#define HEADER_SIZE 0x1000
|
||||
#define AUTH_SIZE ROM_HEADER_SIGN_TARGET_SIZE
|
||||
|
||||
#define SLOT_SIZE 0x8000
|
||||
|
||||
#ifndef SDK_FINALROM
|
||||
#define PROFILE_PXI_SEND 1000000000
|
||||
#define PROFILE_PXI_RECV 2000000000
|
||||
@ -85,7 +83,7 @@ extern u32 pf_cnt;
|
||||
|
||||
static BOOL FATFS_LoadBuffer(u32 offset, u32 size)
|
||||
{
|
||||
u8* base = (u8*)MI_GetWramMapStart_B();
|
||||
u8* base = (u8*)HW_FIRM_LOAD_BUFFER_BASE;
|
||||
static int count = 0;
|
||||
|
||||
// seek first
|
||||
@ -100,9 +98,10 @@ static BOOL FATFS_LoadBuffer(u32 offset, u32 size)
|
||||
// loading loop
|
||||
while (size > 0)
|
||||
{
|
||||
u8* dest = base + count * SLOT_SIZE; // target buffer address
|
||||
u32 unit = size < SLOT_SIZE ? size : SLOT_SIZE; // size
|
||||
while (MI_GetWramBankMaster_B(count) != MI_WRAM_ARM7) // waiting to be master
|
||||
u8* dest = base + count * HW_FIRM_LOAD_BUFFER_UNIT_SIZE; // target buffer address
|
||||
u32 unit = size < HW_FIRM_LOAD_BUFFER_UNIT_SIZE ? size : HW_FIRM_LOAD_BUFFER_UNIT_SIZE; // size
|
||||
OS_TPrintf("%s: dest=%X, unit=%X\n", __func__, dest, unit);
|
||||
while (MI_GetWramBankMaster_B(count) != MI_WRAM_ARM7) // waiting to be master
|
||||
{
|
||||
}
|
||||
#ifndef SDK_FINALROM
|
||||
@ -119,7 +118,7 @@ static BOOL FATFS_LoadBuffer(u32 offset, u32 size)
|
||||
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_PIRIOD; // checkpoint
|
||||
#endif
|
||||
PXI_NotifyID( FIRM_PXI_ID_LOAD_PIRIOD );
|
||||
count = (count + 1) & 0x7;
|
||||
count = (count + 1) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||
size -= unit;
|
||||
}
|
||||
return TRUE;
|
||||
@ -176,10 +175,15 @@ BOOL FATFS_LoadHeader( void )
|
||||
AESKeySeed seed;
|
||||
AESi_InitGameKeys((u8*)rh->s.game_code);
|
||||
PXI_RecvDataByFifo( PXI_FIFO_TAG_DATA, &seed, AES_BLOCK_SIZE );
|
||||
AESi_WaitKey();
|
||||
AESi_SetKeySeedA(&seed); // APP
|
||||
//AESi_WaitKey();
|
||||
//AESi_SetKeySeedB(&seed); // APP & HARD
|
||||
//AESi_WaitKey();
|
||||
//AESi_SetKeySeedC(&seed); //
|
||||
//AESi_WaitKey();
|
||||
//AESi_SetKeySeedD(&seed); // HARD
|
||||
AESi_WaitKey();
|
||||
AESi_SetKeyC(&seed); // Direct
|
||||
}
|
||||
|
||||
@ -198,9 +202,9 @@ BOOL FATFS_LoadHeader( void )
|
||||
static AESCounter* FATFSi_GetCounter( u32 offset )
|
||||
{
|
||||
static AESCounter counter;
|
||||
MI_CpuCopy8( rh->s.main_static_digest, &counter, 12 );
|
||||
counter.words[3] = 0;
|
||||
AESi_AddCounter( &counter, offset - offsetof(ROM_Header, s.aes_target_rom_offset) );
|
||||
|
||||
MI_CpuCopy8( rh->s.main_static_digest, &counter, 16 );
|
||||
AESi_AddCounter( &counter, offset - rh->s.aes_target_rom_offset );
|
||||
return &counter;
|
||||
}
|
||||
|
||||
@ -216,17 +220,24 @@ static AESCounter* FATFSi_GetCounter( u32 offset )
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void FATFSi_SetupAES( u32 offset, u32 size )
|
||||
{
|
||||
if ( !rh->s.enable_aes )
|
||||
{
|
||||
FATFS_DisableAES();
|
||||
}
|
||||
else if ( offset >= rh->s.aes_target_rom_offset &&
|
||||
if ( rh->s.enable_aes &&
|
||||
offset >= rh->s.aes_target_rom_offset &&
|
||||
offset + size <= rh->s.aes_target_rom_offset + rh->s.aes_target_size )
|
||||
{
|
||||
AESi_WaitKey();
|
||||
//AESi_LoadKey( AES_KEY_SLOT_A );
|
||||
AESi_LoadKey( AES_KEY_SLOT_C );
|
||||
FATFS_EnableAES( FATFSi_GetCounter( rh->s.main_ltd_rom_offset ) );
|
||||
if (rh->s.developer_encrypt)
|
||||
{
|
||||
AESi_LoadKey( AES_KEY_SLOT_C );
|
||||
}
|
||||
else
|
||||
{
|
||||
AESi_LoadKey( AES_KEY_SLOT_A );
|
||||
}
|
||||
FATFS_EnableAES( FATFSi_GetCounter( offset ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
FATFS_DisableAES();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -27,8 +27,6 @@ static ROM_Header* const rh = (ROM_Header*)HW_TWL_ROM_HEADER_BUF;
|
||||
#define AUTH_SIZE 0xe00
|
||||
#define RSA_BLOCK_SIZE 128
|
||||
|
||||
#define SLOT_SIZE 0x8000
|
||||
|
||||
#define HASH_UNIT 0x800 // TODO: optimizing to maximize cache efficiency
|
||||
|
||||
/*
|
||||
@ -230,13 +228,13 @@ extern u32 pf_cnt;
|
||||
|
||||
static BOOL MI_LoadBuffer(u8* dest, u32 size, SHA1_CTX *ctx)
|
||||
{
|
||||
u8* base = (void*)MI_GetWramMapStart_B();
|
||||
u8* base = (u8*)HW_FIRM_LOAD_BUFFER_BASE;
|
||||
static int count = 0;
|
||||
|
||||
while (size > 0)
|
||||
{
|
||||
u8* src = base + count * SLOT_SIZE;
|
||||
u32 unit = size < SLOT_SIZE ? size : SLOT_SIZE;
|
||||
u8* src = base + count * HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
||||
u32 unit = size < HW_FIRM_LOAD_BUFFER_UNIT_SIZE ? size : HW_FIRM_LOAD_BUFFER_UNIT_SIZE;
|
||||
OS_TPrintf("%s: src=%X, unit=%X\n", __func__, src, unit);
|
||||
if ( PXI_RecvID() != FIRM_PXI_ID_LOAD_PIRIOD )
|
||||
{
|
||||
return FALSE;
|
||||
@ -266,7 +264,7 @@ static BOOL MI_LoadBuffer(u8* dest, u32 size, SHA1_CTX *ctx)
|
||||
MI_CpuClearFast( src, unit );
|
||||
DC_FlushRange( src, unit );
|
||||
MIi_SetWramBankMaster_B(count, MI_WRAM_ARM7);
|
||||
count = (count + 1) & 0x07;
|
||||
count = (count + 1) % HW_FIRM_LOAD_BUFFER_UNIT_NUMS;
|
||||
size -= unit;
|
||||
dest += unit;
|
||||
}
|
||||
|
||||
@ -17,12 +17,14 @@
|
||||
#ifndef FIRM_MEMORYMAP_H_
|
||||
#define FIRM_MEMORYMAP_H_
|
||||
|
||||
#include <twl/memorymap.h>
|
||||
#include <twl/memorymap.h>
|
||||
|
||||
#ifdef SDK_ARM9
|
||||
#include <firm/hw/ARM9/mmap_firm.h>
|
||||
#include <firm/hw/common/mmap_firm.h>
|
||||
|
||||
#ifdef SDK_ARM9
|
||||
#include <firm/hw/ARM9/mmap_firm.h>
|
||||
#else //SDK_ARM7
|
||||
#include <firm/hw/ARM7/mmap_firm.h>
|
||||
#include <firm/hw/ARM7/mmap_firm.h>
|
||||
#endif
|
||||
|
||||
/* FIRM_MEMORYMAP_H_ */
|
||||
|
||||
Loading…
Reference in New Issue
Block a user