diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c index bca38ece..7dd5ec7d 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardType1.c @@ -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; irh.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 + +// ---------------------------------------------------------------------- +// 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; irh.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; irh.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; irh.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; irh.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"); }