・カードアプリ、NANDアプリロード時に、ROMヘッダCRCチェックとリージョンチェックを行うよう変更。

・未使用関数の削除
 DS_CheckROMCloneBoot, DSi_ExistNitroCard, SYSMi_CheckCardCloneBoot, SYSMi_IsValidCard
・関数整理に伴い未使用になったSYSM_work構造体メンバ、cardHeaderCrc16とcardHeaderCrc16_bakを削除。
・ドキュメント更新。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1860 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-07-11 08:56:30 +00:00
parent d3fee837c3
commit b01ff7f8a1
15 changed files with 51 additions and 97 deletions

View File

@ -32,7 +32,6 @@
#define PATCH3_OFFSET_IN_PATTERN 0x04
// function's prototype-------------------------------------------------
static int DSi_ExistNitroCard(void);
static void* DSi_GetPatchBaseAddr( void );
static BOOL DSi_IsPatchedSDKVersion( void );
static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset );
@ -283,44 +282,3 @@ asm void DSi_CopyWLPatch( void )
(u8 *)(destp), \
( DMA_SRC_INC | ( (size)/(32/8) & 0x1fffff ) ) )
*/
// クローンブート判定
void DS_CheckROMCloneBoot( void )
{
s32 lockCardID;
u8 *buffp = (u8 *)&mbSignBuf;
u32 auth_offset = dh->s.rom_valid_size ? dh->s.rom_valid_size : 0x01000000;
u32 page_offset = auth_offset & 0xFFFFFE00;
if( !DSi_ExistNitroCard() ) {
return;
}
if ((lockCardID = OS_GetLockID()) > 0) {
(void)OS_LockCard( (u16 )lockCardID );
// DC_FlushRange( buffp, sizeof(mbSignBuf) );
// IPL2_ReadCard( (void *)page_offset, buffp, sizeof(mbSignBuf) );
(void)OS_UnLockCard( (u16 )lockCardID );
OS_ReleaseLockID( (u16 )lockCardID );
}
buffp += auth_offset & 0x000001FF;
if( *buffp++ == 'a' && *buffp == 'c' ) {
SYSMi_GetWork()->cloneBootMode = SYSM_CLONE_BOOT_MODE;
}else {
SYSMi_GetWork()->cloneBootMode = SYSM_OTHER_BOOT_MODE;
}
}
// NITROカード存在チェック 「リターン 1カード認識 0カードなし」
static int DSi_ExistNitroCard(void)
{
if((dh->s.nintendo_logo_crc16 == 0xcf56)
&&(dh->s.header_crc16 == SYSMi_GetWork()->cardHeaderCrc16)) {
return TRUE; // NITROカードありNintendoロゴCRC、カードヘッダCRCが正しい場合
// ※Nintendoロゴデータのチェックは、特許の都合上、ロゴ表示ルーチン起動後に行います。
}else {
return FALSE; // NITROカードなし
}
}

View File

@ -239,7 +239,8 @@ typedef enum HotSwState{
HOTSW_TIME_OUT,
HOTSW_CARD_LOCK_ERROR,
HOTSW_CRC_CHECK_ERROR,
HOTSW_HASH_CHECK_ERROR,
HOWSW_REGION_CHECK_ERROR,
HOTSW_HASH_CHECK_ERROR,
HOTSW_ID_CHECK_ERROR,
HOTSW_PULLED_OUT_ERROR,
HOTSW_DATA_DECRYPT_ERROR,

View File

@ -404,16 +404,18 @@ static HotSwState LoadCardData(void)
}
SYSMi_GetWork()->gameCommondParam = s_cbData.gameCommondParam;
// ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。
SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e );
OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n",
SYSMi_GetWork()->cardHeaderCrc16_bak, s_cbData.pBootSegBuf->rh.s.header_crc16 );
if( ( SYSMi_GetWork()->cardHeaderCrc16_bak != s_cbData.pBootSegBuf->rh.s.header_crc16 ) ||
( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){
retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval;
}
// CRCチェック
if( !UTL_CheckAppCRC16( &s_cbData.pBootSegBuf->rh.s ) ) {
retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval;
}
// リージョンチェック
if( !UTL_CheckAppRegion( s_cbData.pBootSegBuf->rh.s.card_region_bitmap ) ) {
retval = (retval == HOTSW_SUCCESS) ? HOWSW_REGION_CHECK_ERROR : retval;
}
// アプリジャンプのデバッグ時にROMエミュレーション情報だけ必要な場合
if(SYSMi_GetWork()->flags.hotsw.isLoadRomEmuOnly){
SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE;
@ -2382,6 +2384,10 @@ static void DebugPrintErrorMessage(HotSwState state)
OS_PutString(" - Error 3 : CRC Check\n");
break;
case HOWSW_REGION_CHECK_ERROR:
OS_PutString(" - Error 3 : Region Check\n");
break;
case HOTSW_HASH_CHECK_ERROR:
OS_PutString(" - Error 4 : Hash Check\n");
break;

View File

@ -34,7 +34,6 @@ static void SYSMi_CopyLCFGDataSettings( void );
static TitleProperty *SYSMi_CheckDebuggerBannerViewModeBoot( void );
static TitleProperty *SYSMi_CheckShortcutBoot1( void );
static TitleProperty *SYSMi_CheckShortcutBoot2( void );
static void SYSMi_CheckCardCloneBoot( void );
void SYSMi_SendKeysToARM7( void );
static OSTitleId SYSMi_getTitleIdOfMachineSettings( void );
@ -556,26 +555,6 @@ static TitleProperty *SYSMi_CheckShortcutBoot2( void )
}
// ƒNƒ<4E><C692>[ƒ“ƒu<C692>[ƒg”»è
static void SYSMi_CheckCardCloneBoot( void )
{
#if 0
u8 *buffp = (u8 *)&pTempBuffer;
u32 total_rom_size = SYSM_GetCardRomHeader()->rom_valid_size ? SYSM_GetCardRomHeader()->rom_valid_size : 0x01000000;
u32 file_offset = total_rom_size & 0xFFFFFE00;
DC_FlushRange( buffp, BNR_IMAGE_SIZE );
CARD_ReadRom( 4, (void *)file_offset, buffp, BNR_IMAGE_SIZE );
buffp += total_rom_size & 0x000001FF;
if( *buffp++ == 'a' && *buffp == 'c' ) {
SYSMi_GetWork()->flags.common.cloneBootMode = CLONE_BOOT_MODE;
}else {
SYSMi_GetWork()->flags.common.cloneBootMode = OTHER_BOOT_MODE;
}
#endif
}
// NAM_Initされるようになったので、NAMで本体設定のID取得
// それらしきものがインストールされていない場合は0NULLをリターン
static OSTitleId SYSMi_getTitleIdOfMachineSettings( void )

View File

@ -281,9 +281,6 @@ TitleProperty *SYSM_GetCardTitleList( BOOL *changed )
// ロード開始していたら、もうヘッダやタイトル情報は変更しない
return pTitleList_Card;
}
// [TODO:] ROMヘッダの platform_code がNTR,TWL-HYB,TWL-LTD以外のもの
// region_codeが本体情報と違うもの
// の場合は、正常に認識できないタイトルであることを示す。
if( SYSMi_GetWork()->flags.hotsw.isCardStateChanged ) {
u16 id = (u16)OS_GetLockID();
@ -335,7 +332,6 @@ BOOL SYSMi_CopyCardRomHeader( void )
// ROMヘッダのリード
DC_InvalidateRange( (void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_APP_ROM_HEADER_SIZE ); // キャッシュケア
MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BAK, (void *)SYSM_APP_ROM_HEADER_BUF, SYSM_APP_ROM_HEADER_SIZE ); // ROMヘッダコピー
SYSMi_GetWork()->cardHeaderCrc16 = SYSMi_GetWork()->cardHeaderCrc16_bak; // ROMヘッダCRCコピー
retval = TRUE;
}

View File

@ -22,7 +22,6 @@
// define data-----------------------------------------------------------------
// extern data-----------------------------------------------------------------
// function's prototype-------------------------------------------------------
static int SYSMi_IsValidCard( void );
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
// const data------------------------------------------------------------------
@ -68,7 +67,7 @@ BOOL SYSMi_IsDebuggerBannerViewMode( void )
{
#if 0
return ( SYSM_IsRunOnDebugger() &&
SYSMi_IsValidCard() &&
SYSMi_IsExistCard() &&
SYSM_GetCardRomHeader()->dbgRomSize == 0 ) ? TRUE : FALSE;
#else
return FALSE;
@ -120,19 +119,6 @@ BOOL SYSM_IsNTRCard( void )
}
// NTR,TWLカード存在チェック 「リターン 1カード認識 0カードなし」
static int SYSMi_IsValidCard( void )
{
if( ( SYSM_GetCardRomHeader()->nintendo_logo_crc16 == 0xcf56 ) &&
( SYSM_GetCardRomHeader()->header_crc16 == SYSMi_GetWork()->cardHeaderCrc16 ) ) {
return TRUE; // NTR,TWLカードありNintendoロゴCRC、カードヘッダCRCが正しい場合
// ※Nintendoロゴデータのチェックは、特許の都合上、ロゴ表示ルーチン起動後に行います。
}else {
return FALSE; // NTR,TWLカードなし
}
}
// エントリアドレスの正当性チェック
BOOL SYSMi_CheckEntryAddress( void )
{

View File

@ -477,6 +477,18 @@ static void AMNi_getAndAddNandTitleData( NAMTitleId titleID, BOOL readShowData )
return;
}
// ROMヘッダのリージョンチェックとCRCチェックを行い、不正なアプリは無視する。
if( !UTL_CheckAppRegion( s_AllRomHeaderArray[rhArrayLen].card_region_bitmap ) ) {
OS_TPrintf( "Region Check NG : %llx\n", titleID );
FS_CloseFile(file);
return;
}
if( !UTL_CheckAppCRC16( &s_AllRomHeaderArray[rhArrayLen] ) ) {
OS_TPrintf( "CRC16 Check NG : %llx\n", titleID );
FS_CloseFile(file);
return;
}
sNandAppRomHeaderArrayLength++;
// もうランチャー表示用情報は数がオーバーしてるか、表示用情報を読まない設定

View File

@ -22,6 +22,7 @@ SUBDIRS = \
../../../libraries_sysmenu/sysmenu \
../../../libraries_sysmenu/boot \
../../../libraries_sysmenu/hotsw \
../../../libraries_sysmenu/util \
# ../../../libraries_sysmenu/sharedFont \
# ../../../libraries_sysmenu/reloc_info \
# ../../../libraries_sysmenu/mcu \

Binary file not shown.

Binary file not shown.

View File

@ -29,7 +29,6 @@ extern "C" {
#define DS_WLPATCH_COPYCODE_SIZE (10*4)
void DS_InsertWLPatch( void* romHeaderNTR );
void DS_CheckROMCloneBoot( void );
#ifdef __cplusplus

View File

@ -122,9 +122,6 @@ typedef struct SYSM_work {
}hotsw;
}flags; // 8B
u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16ARM9側でコピーして使用する側
u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16ARM7側ライブラリでダイレクトに書き換わる側
OSLockWord lockCardRsc ATTRIBUTE_ALIGN(8); // カードリソース排他制御用
OSLockWord lockHotSW; // カードリソース排他制御用
u32 appCardID; // カードID

View File

@ -119,6 +119,24 @@ extern void UTL_SetFatalError( FatalErrorCode error ); // FATAL
extern u64 UTL_GetFatalError( void ); // FATALエラー状態の取得FatalErrorCodeをビットに割り当てて格納しています。
// リージョンチェック
static inline BOOL UTL_CheckAppRegion( u32 card_region_bitmap )
{
return ( card_region_bitmap & ( 0x00000001 << OS_GetRegion() ) ) ? TRUE : FALSE;
}
// CRCチェック
static BOOL UTL_CheckAppCRC16( ROM_Header_Short *pROMH )
{
u16 calc_crc = SVC_GetCRC16( 65535, pROMH, 0x015e );
if( ( calc_crc != pROMH->header_crc16 ) ||
( 0xcf56 != pROMH->nintendo_logo_crc16 ) ){
return FALSE;
}
return TRUE;
}
#ifdef __cplusplus
}
#endif

View File

@ -25,6 +25,7 @@
#include <../build/libraries/os/common/include/application_jump_private.h>
#include <sysmenu/types.h>
#include <sysmenu/util.h>
typedef struct AMNBannerCounter
{