mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei)
・Arm9,7常駐モジュール/拡張常駐モジュールのハッシュチェックをする関数を追加 ・Game領域のページリードで止まる事があるので、応急処置としてGame領域のページリード部分だけDMAを使わずにCPUで転送 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@391 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
38fce2363a
commit
094ea77c0a
@ -42,7 +42,7 @@ void ReadBootSegNormal_DSType1(CardBootData *cbd)
|
||||
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 100 (8ページリード) に)
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
||||
@ -340,9 +340,6 @@ void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size)
|
||||
OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
|
||||
|
||||
for(i=0; i<loop; i++){
|
||||
// NewDMA転送の準備
|
||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
|
||||
|
||||
// ゼロクリア
|
||||
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
||||
|
||||
@ -368,7 +365,10 @@ void ReadPageGame_DSType1(u32 start_addr, void* buf, u32 size)
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 1,0, 1,0, 0, 0,0,0, 0)) |
|
||||
CNT1_FLD(1,0,0,0, 0,1, 0,1, 0, 0,1,1, 20));
|
||||
|
||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||
OS_SleepThread(NULL);
|
||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||
*((u32 *)buf + counter++) = reg_HOTSW_MCD1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -257,7 +257,7 @@ void ReadSegSecure_DSType2(CardBootData *cbd)
|
||||
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定
|
||||
// (START = 1 W/R = 0 TRM = 0 PC = 000(0ページ) CS = 1 Latency2 =0 SE = 1 DS = 1 Latency1 = 0に)
|
||||
@ -306,7 +306,7 @@ void SwitchONPNGSecure_DSType2(CardBootData *cbd)
|
||||
SetSecureCommand(S_PNG_ON, cbd);
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に)
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
@ -341,7 +341,7 @@ void SwitchOFFPNGSecure_DSType2(CardBootData *cbd)
|
||||
SetSecureCommand(S_PNG_OFF, cbd);
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に)
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
@ -376,7 +376,7 @@ void ChangeModeSecure_DSType2(CardBootData *cbd)
|
||||
SetSecureCommand(S_CHG_MODE, cbd);
|
||||
|
||||
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
// reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||
|
||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 TRM = 0 PC = 000 SE = 1 DS = 1 Latency1 = 0 に)
|
||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) |
|
||||
|
||||
@ -27,6 +27,8 @@
|
||||
#define UNDEF_CODE 0xe7ffdeff // 未定義コード
|
||||
#define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB
|
||||
|
||||
#define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8)
|
||||
|
||||
// Function prototype -------------------------------------------------------
|
||||
static BOOL IsCardExist(void);
|
||||
|
||||
@ -47,6 +49,11 @@ static void LoadTable(void);
|
||||
static void ReadIDNormal(void);
|
||||
static void DecryptObjectFile(void);
|
||||
|
||||
static BOOL CheckArm7HashValue(void);
|
||||
static BOOL CheckArm9HashValue(void);
|
||||
static BOOL CheckExtArm7HashValue(void);
|
||||
static BOOL CheckExtArm9HashValue(void);
|
||||
|
||||
static void ShowRegisterData(void);
|
||||
static void ShowRomHeaderData(void);
|
||||
|
||||
@ -63,7 +70,28 @@ static BootSegmentData *s_pBootSegBuffer; //
|
||||
|
||||
static CardBootData s_cbData;
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// HMACSHA1の鍵
|
||||
static u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = {
|
||||
0x21, 0x06, 0xc0, 0xde,
|
||||
0xba, 0x98, 0xce, 0x3f,
|
||||
0xa6, 0x92, 0xe3, 0x9d,
|
||||
0x46, 0xf2, 0xed, 0x01,
|
||||
|
||||
0x76, 0xe3, 0xcc, 0x08,
|
||||
0x56, 0x23, 0x63, 0xfa,
|
||||
0xca, 0xd4, 0xec, 0xdf,
|
||||
0x9a, 0x62, 0x78, 0x34,
|
||||
|
||||
0x8f, 0x6d, 0x63, 0x3c,
|
||||
0xfe, 0x22, 0xca, 0x92,
|
||||
0x20, 0x88, 0x97, 0x23,
|
||||
0xd2, 0xcf, 0xae, 0xc2,
|
||||
|
||||
0x32, 0x67, 0x8d, 0xfe,
|
||||
0xca, 0x83, 0x64, 0x98,
|
||||
0xac, 0xfd, 0x3e, 0x37,
|
||||
0x87, 0x46, 0x58, 0x24
|
||||
};
|
||||
|
||||
static CardBootFunction s_funcTable[] = {
|
||||
// DS Card Type 1
|
||||
@ -272,12 +300,12 @@ BOOL HOTSW_Boot(void)
|
||||
// ---------------------- Game Mode ----------------------
|
||||
// ID読み込み
|
||||
s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
|
||||
|
||||
// ARM9常駐モジュールの先頭2KBの暗号化領域を複合化
|
||||
DecryptObjectFile();
|
||||
|
||||
// 常駐モジュール残りを指定先に転送
|
||||
HOTSW_LoadStaticModule();
|
||||
|
||||
// ARM9常駐モジュールの先頭2KBの暗号化領域を複合化
|
||||
DecryptObjectFile();
|
||||
|
||||
// デバッグ出力
|
||||
ShowRomHeaderData();
|
||||
@ -339,29 +367,45 @@ void HOTSW_LoadStaticModule(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
OS_TPrintf(" - Arm9 Static Module Loading...\n");
|
||||
s_cbData.arm9Stc = (u32)s_cbData.pBootSegBuf->rh.s.main_ram_address;
|
||||
|
||||
OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm9Stc);
|
||||
// 配置先と再配置情報を取得
|
||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , FALSE);
|
||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg);
|
||||
|
||||
// Arm9の常駐モジュール残りを指定先に転送
|
||||
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
|
||||
(u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE),
|
||||
s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE);
|
||||
|
||||
// Hash値のチェック
|
||||
if(CheckArm9HashValue()){
|
||||
OS_PutString("◎Arm9 Static Module Hash Check OK!\n");
|
||||
}
|
||||
else{
|
||||
OS_PutString("×Arm9 Static Module Hash Check Error...\n");
|
||||
}
|
||||
|
||||
|
||||
OS_TPrintf(" - Arm7 Static Module Loading...\n");
|
||||
s_cbData.arm7Stc = (u32)s_cbData.pBootSegBuf->rh.s.sub_ram_address;
|
||||
|
||||
OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm7Stc);
|
||||
// 配置先と再配置情報を取得
|
||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , FALSE);
|
||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg);
|
||||
|
||||
// Arm7の常駐モジュールを指定先に転送
|
||||
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.sub_rom_offset,
|
||||
(u32 *)s_cbData.arm7Stc,
|
||||
s_cbData.pBootSegBuf->rh.s.sub_size);
|
||||
|
||||
|
||||
// Hash値のチェック
|
||||
if(CheckArm7HashValue()){
|
||||
OS_PutString("◎Arm7 Static Module Hash Check OK!\n");
|
||||
}
|
||||
else{
|
||||
OS_PutString("×Arm7 Static Module Hash Check Error...\n");
|
||||
}
|
||||
|
||||
// TWLでのみロード
|
||||
if( s_cbData.pBootSegBuf->rh.s.platform_code & PLATFORM_CODE_FLAG_TWL ) {
|
||||
u32 size = ( s_cbData.pBootSegBuf->rh.s.main_ltd_size < SECURE_SEGMENT_SIZE ) ?
|
||||
@ -382,6 +426,14 @@ void HOTSW_LoadStaticModule(void)
|
||||
s_cbData.pBootSegBuf->rh.s.main_ltd_size - size);
|
||||
}
|
||||
|
||||
// Hash値のチェック
|
||||
if(CheckExtArm9HashValue()){
|
||||
OS_PutString("◎Arm9 Ltd Static Module Hash Check OK!\n");
|
||||
}
|
||||
else{
|
||||
OS_PutString("×Arm9 Ltd Static Module Hash Check Error...\n");
|
||||
}
|
||||
|
||||
OS_TPrintf(" - Arm7 Ltd. Static Module Loading...\n");
|
||||
s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address;
|
||||
|
||||
@ -392,6 +444,14 @@ void HOTSW_LoadStaticModule(void)
|
||||
s_funcTable[s_cbData.cardType].ReadPage_G(s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset,
|
||||
(u32 *)s_cbData.arm7Ltd,
|
||||
s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
|
||||
|
||||
// Hash値のチェック
|
||||
if(CheckExtArm7HashValue()){
|
||||
OS_PutString("◎Arm7 Ltd Static Module Hash Check OK!\n");
|
||||
}
|
||||
else{
|
||||
OS_PutString("×Arm7 Ltd Static Module Hash Check Error...\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -590,6 +650,142 @@ static void DecryptObjectFile(void)
|
||||
}
|
||||
|
||||
|
||||
/* -----------------------------------------------------------------
|
||||
* CheckHashValue関数
|
||||
*
|
||||
* 常駐モジュール・拡張常駐モジュールのハッシュを計算して、
|
||||
* カード内のハッシュ値と比べる。
|
||||
* ----------------------------------------------------------------- */
|
||||
#include <twl/os/common/systemCall.h>
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Arm7常駐モジュールのハッシュチェック
|
||||
// ----------------------------------------------------------------------
|
||||
static BOOL CheckArm7HashValue(void)
|
||||
{
|
||||
u8 sha1data[DIGEST_SIZE_SHA1];
|
||||
u32 i;
|
||||
BOOL retval = TRUE;
|
||||
|
||||
// クリア
|
||||
MI_CpuClear8(sha1data, sizeof(sha1data));
|
||||
|
||||
// ARM7常駐モジュールのHash値照合
|
||||
SVC_CalcHMACSHA1( sha1data,
|
||||
(u32 *)(s_cbData.arm7Stc),
|
||||
s_cbData.pBootSegBuf->rh.s.sub_size,
|
||||
s_digestDefaultKey,
|
||||
sizeof(s_digestDefaultKey) );
|
||||
|
||||
// ハッシュ値の照合
|
||||
for(i=0; i<DIGEST_SIZE_SHA1; i++){
|
||||
if(sha1data[i] != s_cbData.pBootSegBuf->rh.s.sub_static_digest[i]){
|
||||
retval = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Arm9常駐モジュールのハッシュチェック
|
||||
//
|
||||
// ※ 先頭2Kの復号化が行われる前のデータのハッシュを比べる
|
||||
// ----------------------------------------------------------------------
|
||||
static BOOL CheckArm9HashValue(void)
|
||||
{
|
||||
u8 sha1data[DIGEST_SIZE_SHA1];
|
||||
u32 i;
|
||||
BOOL retval = TRUE;
|
||||
SVCHMACSHA1Context hash;
|
||||
|
||||
// クリア
|
||||
MI_CpuClear8(sha1data, sizeof(sha1data));
|
||||
|
||||
// ハッシュ初期化
|
||||
SVC_HMACSHA1Init( &hash, s_digestDefaultKey, sizeof(s_digestDefaultKey) );
|
||||
|
||||
// セキュア領域分UpDate
|
||||
SVC_HMACSHA1Update( &hash, s_cbData.pSecureSegBuf, SECURE_SEGMENT_SIZE );
|
||||
|
||||
// ゲーム領域分UpDate
|
||||
SVC_HMACSHA1Update( &hash, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE );
|
||||
|
||||
// Hash値取得
|
||||
SVC_HMACSHA1GetHash( &hash, sha1data );
|
||||
|
||||
// ハッシュ値の照合
|
||||
for(i=0; i<DIGEST_SIZE_SHA1; i++){
|
||||
if(sha1data[i] != s_cbData.pBootSegBuf->rh.s.main_static_digest[i]){
|
||||
retval = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Arm7拡張常駐モジュールのハッシュチェック
|
||||
// ----------------------------------------------------------------------
|
||||
static BOOL CheckExtArm7HashValue(void)
|
||||
{
|
||||
u8 sha1data[DIGEST_SIZE_SHA1];
|
||||
u32 i;
|
||||
BOOL retval = TRUE;
|
||||
|
||||
// クリア
|
||||
MI_CpuClear8(sha1data, sizeof(sha1data));
|
||||
|
||||
// ARM7常駐モジュールのHash値照合
|
||||
SVC_CalcHMACSHA1( sha1data,
|
||||
(u32 *)s_cbData.arm7Ltd,
|
||||
s_cbData.pBootSegBuf->rh.s.sub_ltd_size,
|
||||
s_digestDefaultKey,
|
||||
sizeof(s_digestDefaultKey) );
|
||||
|
||||
// ハッシュ値の照合
|
||||
for(i=0; i<DIGEST_SIZE_SHA1; i++){
|
||||
if(sha1data[i] != s_cbData.pBootSegBuf->rh.s.sub_ltd_static_digest[i]){
|
||||
retval = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Arm9拡張常駐モジュールのハッシュチェック
|
||||
// ----------------------------------------------------------------------
|
||||
static BOOL CheckExtArm9HashValue(void)
|
||||
{
|
||||
u8 sha1data[DIGEST_SIZE_SHA1];
|
||||
u32 i;
|
||||
BOOL retval = TRUE;
|
||||
|
||||
// クリア
|
||||
MI_CpuClear8(sha1data, sizeof(sha1data));
|
||||
|
||||
// ARM7常駐モジュールのHash値照合
|
||||
SVC_CalcHMACSHA1( sha1data,
|
||||
(u32 *)s_cbData.arm9Ltd,
|
||||
s_cbData.pBootSegBuf->rh.s.main_ltd_size,
|
||||
s_digestDefaultKey,
|
||||
sizeof(s_digestDefaultKey) );
|
||||
|
||||
// ハッシュ値の照合
|
||||
for(i=0; i<DIGEST_SIZE_SHA1; i++){
|
||||
if(sha1data[i] != s_cbData.pBootSegBuf->rh.s.main_ltd_static_digest[i]){
|
||||
retval = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------
|
||||
* IsCardExist関数
|
||||
*
|
||||
@ -735,7 +931,7 @@ static void InterruptCallbackCardData(void)
|
||||
{
|
||||
// データ転送終了待ちまで寝ていたのを起こす
|
||||
OS_WakeupThreadDirect(&s_MCThread);
|
||||
|
||||
|
||||
#ifdef USE_SLOT_A
|
||||
OS_SetIrqCheckFlagEx(OS_IE_CARD_A_DATA);
|
||||
#else
|
||||
@ -812,6 +1008,17 @@ static void ShowRomHeaderData(void)
|
||||
OS_TPrintf("sub entry addr : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_entry_address);
|
||||
OS_TPrintf("sub ram addr : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_ram_address);
|
||||
OS_TPrintf("sub size : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_size);
|
||||
|
||||
if(s_cbData.twlFlg){
|
||||
OS_TPrintf("\nLtd main rom offset: 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset);
|
||||
OS_TPrintf("Ltd main ram addr: 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address);
|
||||
OS_TPrintf("Ltd main size : 0x%08x\n\n", s_cbData.pBootSegBuf->rh.s.main_ltd_size);
|
||||
|
||||
OS_TPrintf("Ltd Sub rom offset : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset);
|
||||
OS_TPrintf("Ltd Sub ram addr : 0x%08x\n" , s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address);
|
||||
OS_TPrintf("Ltd Sub size : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.sub_ltd_size);
|
||||
}
|
||||
|
||||
OS_TPrintf("------------------------------------------\n\n");
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user