mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ランチャー:起動するROMのAES暗号化領域復号の処理追加途中経過(多分まだ機能しないはず)
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1069 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
41158cfed8
commit
80ea5b96a3
@ -77,7 +77,8 @@ INSTALL_DIR = $(TWL_INSTALL_COMPONENTSDIR)/$(TARGET_NAME)/$(TWL_BUILDTYPE)
|
||||
LINCLUDES = $(ROOT)/build/libraries/spi/ARM7/include \
|
||||
$(ROOT)/build/libraries/spi/ARM7/pm/include \
|
||||
$(SYSMENU_ROOT)/build/libraries_sysmenu/sysmenu/common/include
|
||||
LLIBRARIES += libwl_sp.TWL.LTD.a
|
||||
LLIBRARIES += libwl_sp.TWL.LTD.a \
|
||||
libaes_sp.firm.LTD.a
|
||||
LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES)
|
||||
|
||||
do-build: $(TARGETS)
|
||||
|
||||
@ -62,6 +62,7 @@ Autoload WRAM
|
||||
libreloc_info_sp$(LIBSUFFIX).a \
|
||||
libsysmenu_sp$(LIBSUFFIX).a \
|
||||
libsysmmcu_sp$(LIBSUFFIX).a \
|
||||
libaes_sp.firm.LTD.a
|
||||
|
||||
Library libsdio_sp$(LIBSUFFIX).a
|
||||
|
||||
|
||||
@ -240,7 +240,6 @@ TwlSpMain(void)
|
||||
{
|
||||
OS_ResetSystem();
|
||||
}
|
||||
SYSM_WaitDecodeAESRegion();
|
||||
BOOT_WaitStart();
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,17 +17,19 @@
|
||||
|
||||
#include <twl.h>
|
||||
#include <sysmenu.h>
|
||||
#include <twl/aes/common/types.h>
|
||||
|
||||
// define data-----------------------------------------------------------------
|
||||
// extern data-----------------------------------------------------------------
|
||||
// function's prototype-------------------------------------------------------
|
||||
// global variable-------------------------------------------------------------
|
||||
// static variable-------------------------------------------------------------
|
||||
static BOOL s_finished = FALSE;
|
||||
// const data------------------------------------------------------------------
|
||||
|
||||
#ifdef SDK_ARM9
|
||||
|
||||
void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs )
|
||||
void SYSM_StartDecryptAESRegion( ROM_Header_Short *hs )
|
||||
{
|
||||
void *region_addr[2];
|
||||
u32 region_size[2];
|
||||
@ -40,6 +42,7 @@ void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs )
|
||||
// AES有効?
|
||||
if( !hs->enable_aes )
|
||||
{
|
||||
OS_TPrintf( "SYSM_StartDecryptAESRegion:AES disabled.\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -65,7 +68,7 @@ void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs )
|
||||
}
|
||||
}
|
||||
|
||||
// デコード情報算出&格納処理
|
||||
// デクリプト情報算出&格納処理
|
||||
region_offset[0] = hs->aes_target_rom_offset;
|
||||
region_offset[1] = hs->aes_target2_rom_offset;
|
||||
region_size[0] = hs->aes_target_size;
|
||||
@ -74,7 +77,7 @@ void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs )
|
||||
SYSMi_GetWork()->addr_AESregion[1] = NULL;
|
||||
for( m=0; m<2; m++ )
|
||||
{
|
||||
// デコードする暗号化領域の判定とオフセット計算(ARM9flx, ARM9ltd, ARM7flx, ARM7ltdのどれか)
|
||||
// デクリプトする暗号化領域の判定とオフセット計算(ARM9flx, ARM9ltd, ARM7flx, ARM7ltdのどれか)
|
||||
region_addr[m] = NULL;
|
||||
if( region_size[m] == 0 )
|
||||
{
|
||||
@ -105,25 +108,121 @@ void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs )
|
||||
if(region_addr[0] == NULL && region_addr[1] == NULL)
|
||||
{
|
||||
// ターゲット1も2も存在しないor設定オフセットがおかしい
|
||||
OS_TPrintf( "SYSM_StartDecryptAESRegion:No targets.\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
// Workに開発/製品情報を格納
|
||||
SYSMi_GetWork()->isDeveloperAESMode = ( hs->developer_encrypt ? TRUE : FALSE );
|
||||
|
||||
// [TODO:]ARM7に開始通知
|
||||
// [TODO:]ARM7からの完了通知を受け取って完了
|
||||
// Workに「鍵」or「シードとゲームコード」をセット
|
||||
if( hs->developer_encrypt )
|
||||
{
|
||||
MI_CpuCopy8( hs->title_name, SYSMi_GetWork()->keyAES, AES_KEY_SIZE );
|
||||
}else
|
||||
{
|
||||
MI_CpuCopy8( hs->main_ltd_static_digest, SYSMi_GetWork()->seedAES, AES_KEY_SIZE );
|
||||
MI_CpuCopy8( hs->game_code, SYSMi_GetWork()->idAES, GAME_CODE_MAX );
|
||||
}
|
||||
|
||||
// ARM7に開始通知
|
||||
s_finished = FALSE;
|
||||
while( PXI_SendWordByFifo(PXI_FIFO_TAG_DECRYPTAES, 0, FALSE) != PXI_FIFO_SUCCESS )
|
||||
{
|
||||
OS_TPrintf( "SYSM_StartDecryptAESRegion:ARM9 PXI send error.\n" );
|
||||
}
|
||||
|
||||
// ARM7からの完了通知を受け取って完了
|
||||
while( !s_finished )
|
||||
{
|
||||
OS_WaitAnyIrq();
|
||||
}
|
||||
|
||||
OS_TPrintf( "SYSM_StartDecryptAESRegion:AES decryption succeed.\n" );
|
||||
}
|
||||
|
||||
#else //SDK_ARM7
|
||||
|
||||
void SYSM_WaitDecodeAESRegion( void )
|
||||
#include <twl/aes/ARM7/hi.h>
|
||||
#include <twl/aes/ARM7/lo.h>
|
||||
#include <firm/aes/ARM7/aes_init.h>
|
||||
|
||||
static BOOL aesFlag;
|
||||
static AESCounter aesCounter;
|
||||
|
||||
#define DMA_SEND 2
|
||||
#define DMA_RECV 3
|
||||
static void ReplaceWithAes( void* ptr, u32 size )
|
||||
{
|
||||
// [TODO:]ARM9からの通知を受け取ったら開始
|
||||
// [TODO:]開発なら鍵セット、製品ならシードとIDセット
|
||||
// [TODO:]鍵ロードして暗号化領域の復号開始
|
||||
// [TODO:]一応、暗号化領域のキャッシュをフラッシュ
|
||||
// [TODO:]ARM9に完了通知
|
||||
AES_Lock();
|
||||
AES_Reset();
|
||||
AES_Reset();
|
||||
AES_WaitKey();
|
||||
AES_LoadKey( AES_KEY_SLOT_A );
|
||||
AES_WaitKey();
|
||||
AES_DmaSend( DMA_SEND, ptr, size, NULL, NULL );
|
||||
AES_DmaRecv( DMA_RECV, ptr, size, NULL, NULL );
|
||||
AES_SetCounter( &aesCounter );
|
||||
AES_Run( AES_MODE_CTR, 0, size / AES_BLOCK_SIZE, NULL, NULL );
|
||||
AES_AddToCounter( &aesCounter, size / AES_BLOCK_SIZE );
|
||||
MI_WaitNDma( DMA_RECV );
|
||||
AES_Unlock();
|
||||
}
|
||||
|
||||
#endif //ifdef SDK_ARM9
|
||||
|
||||
static void SYSMi_CallbackDecryptAESRegion(PXIFifoTag tag, u32 data, BOOL err)
|
||||
{
|
||||
#pragma unused(tag)
|
||||
#pragma unused(data)
|
||||
#pragma unused(err)
|
||||
|
||||
#ifdef SDK_ARM9
|
||||
s_finished = TRUE;
|
||||
#else //SDK_ARM7
|
||||
int l;
|
||||
|
||||
// 製品ならIDセット
|
||||
if ( !SYSMi_GetWork()->isDeveloperAESMode )
|
||||
{
|
||||
AESi_InitKeysForApp( SYSMi_GetWork()->idAES );
|
||||
}
|
||||
|
||||
// 開発なら鍵セット、製品ならシードセット
|
||||
AES_Lock();
|
||||
AES_WaitKey();
|
||||
if ( SYSMi_GetWork()->isDeveloperAESMode )
|
||||
{
|
||||
AES_SetKeyA( (AESKey*)SYSMi_GetWork()->keyAES );
|
||||
}
|
||||
else
|
||||
{
|
||||
AES_SetKeySeedA( (AESKeySeed*)SYSMi_GetWork()->seedAES );
|
||||
}
|
||||
AES_Unlock();
|
||||
|
||||
for( l=0; l<2; l++ )
|
||||
{
|
||||
if( SYSMi_GetWork()->addr_AESregion[l]==NULL )
|
||||
{
|
||||
OS_TPrintf( "SYSM_StartDecryptAESRegion:Region %d skip.\n", l );
|
||||
continue;
|
||||
}
|
||||
// 鍵ロードして暗号化領域の復号開始
|
||||
ReplaceWithAes( SYSMi_GetWork()->addr_AESregion[l], SYSMi_GetWork()->size_AESregion[l] );
|
||||
// DMA転送なのでキャッシュケアは不要のはず……AES_DmaSendとRecvの仕様を要確認
|
||||
}
|
||||
|
||||
// ARM9に完了通知
|
||||
while( PXI_SendWordByFifo(PXI_FIFO_TAG_DECRYPTAES, 0, FALSE) != PXI_FIFO_SUCCESS )
|
||||
{
|
||||
OS_TPrintf( "SYSM_StartDecryptAESRegion:ARM7 PXI send error.\n" );
|
||||
}
|
||||
|
||||
#endif //ifdef SDK_ARM9
|
||||
}
|
||||
|
||||
void SYSM_InitDecryptAESPXICallback( void )
|
||||
{
|
||||
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_DECRYPTAES, SYSMi_CallbackDecryptAESRegion);
|
||||
}
|
||||
@ -87,6 +87,7 @@ void SYSM_InitPXI( u32 mcu_prio )
|
||||
}
|
||||
#endif // SDK_ARM9
|
||||
PXI_SetFifoRecvCallback( SYSMENU_PXI_FIFO_TAG, SYSMi_PXIFifoRecvCallback );
|
||||
SYSM_InitDecryptAESPXICallback();
|
||||
}
|
||||
|
||||
// PXIコマンド送信
|
||||
|
||||
@ -30,6 +30,7 @@ extern "C" {
|
||||
#define SYSMENU_PXI_FIFO_TAG (PXI_MAX_FIFO_TAG - 1)
|
||||
#define PXI_FIFO_TAG_MCUTEST (PXI_MAX_FIFO_TAG - 2)
|
||||
#define PXI_FIFO_TAG_HOTSW (PXI_MAX_FIFO_TAG - 3)
|
||||
#define PXI_FIFO_TAG_DECRYPTAES (PXI_MAX_FIFO_TAG - 4)
|
||||
|
||||
typedef enum SYSMPXICommand {
|
||||
SYSM_PXI_COMM_BL_BRIGHT = 0,
|
||||
|
||||
@ -100,7 +100,7 @@ extern BOOL SYSM_IsAuthenticateTitleFinished( void ); // SYSM_StartAuthent
|
||||
extern AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitleList );
|
||||
// pBootTitleで指定したタイトルをブート
|
||||
// 成功時は、never return.
|
||||
extern void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs ); // 起動するROMのAES暗号化領域のデコード開始
|
||||
extern void SYSM_StartDecryptAESRegion( ROM_Header_Short *hs ); // 起動するROMのAES暗号化領域のデクリプト開始
|
||||
|
||||
// デバイス制御
|
||||
extern void SYSM_CaribrateTP( void ); // タッチパネルキャリブレーション
|
||||
@ -136,8 +136,8 @@ extern BOOL SYSM_IsRunOnDebugger( void ); // IS
|
||||
|
||||
extern BOOL SYSM_IsLauncherHidden( void ); // ランチャーの画面を表示しないバージョンか?
|
||||
|
||||
// AES領域デコード
|
||||
extern void SYSM_WaitDecodeAESRegion( void ); // ARM9からROMのAES暗号化領域のデコード開始要求を受け、デコード開始
|
||||
// AES領域デクリプト
|
||||
extern void SYSM_InitDecryptAESPXICallback( void ); // AES領域デクリプト用のPXIコールバック設定
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@ -123,6 +123,9 @@ typedef struct SYSM_work {
|
||||
BOOL isDeveloperAESMode; // 開発用セキュリティか?(製品版でFALSE)
|
||||
void *addr_AESregion[2]; // AES暗号化領域の格納アドレス
|
||||
u32 size_AESregion[2]; // AES暗号化領域のサイズ
|
||||
u8 keyAES[AES_KEY_SIZE]; // 開発版AES暗号化領域の復号に使用するKEY(に使うタイトルネーム)
|
||||
u8 idAES[GAME_CODE_MAX]; // 製品版AES暗号化領域の復号に使用するID(に使うゲームコード)
|
||||
u8 seedAES[AES_KEY_SIZE]; // 製品版AES暗号化領域の復号に使用するSEED
|
||||
|
||||
// NTR-IPL2のレガシー 最終的には消すと思う
|
||||
BOOL enableCardNormalOnly;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user