mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・カードアプリ、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:
parent
d3fee837c3
commit
b01ff7f8a1
@ -32,7 +32,6 @@
|
|||||||
#define PATCH3_OFFSET_IN_PATTERN 0x04
|
#define PATCH3_OFFSET_IN_PATTERN 0x04
|
||||||
|
|
||||||
// function's prototype-------------------------------------------------
|
// function's prototype-------------------------------------------------
|
||||||
static int DSi_ExistNitroCard(void);
|
|
||||||
static void* DSi_GetPatchBaseAddr( void );
|
static void* DSi_GetPatchBaseAddr( void );
|
||||||
static BOOL DSi_IsPatchedSDKVersion( void );
|
static BOOL DSi_IsPatchedSDKVersion( void );
|
||||||
static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset );
|
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), \
|
(u8 *)(destp), \
|
||||||
( DMA_SRC_INC | ( (size)/(32/8) & 0x1fffff ) ) )
|
( 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カードなし
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@ -239,7 +239,8 @@ typedef enum HotSwState{
|
|||||||
HOTSW_TIME_OUT,
|
HOTSW_TIME_OUT,
|
||||||
HOTSW_CARD_LOCK_ERROR,
|
HOTSW_CARD_LOCK_ERROR,
|
||||||
HOTSW_CRC_CHECK_ERROR,
|
HOTSW_CRC_CHECK_ERROR,
|
||||||
HOTSW_HASH_CHECK_ERROR,
|
HOWSW_REGION_CHECK_ERROR,
|
||||||
|
HOTSW_HASH_CHECK_ERROR,
|
||||||
HOTSW_ID_CHECK_ERROR,
|
HOTSW_ID_CHECK_ERROR,
|
||||||
HOTSW_PULLED_OUT_ERROR,
|
HOTSW_PULLED_OUT_ERROR,
|
||||||
HOTSW_DATA_DECRYPT_ERROR,
|
HOTSW_DATA_DECRYPT_ERROR,
|
||||||
|
|||||||
@ -404,16 +404,18 @@ static HotSwState LoadCardData(void)
|
|||||||
}
|
}
|
||||||
SYSMi_GetWork()->gameCommondParam = s_cbData.gameCommondParam;
|
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",
|
// CRCチェック
|
||||||
SYSMi_GetWork()->cardHeaderCrc16_bak, s_cbData.pBootSegBuf->rh.s.header_crc16 );
|
if( !UTL_CheckAppCRC16( &s_cbData.pBootSegBuf->rh.s ) ) {
|
||||||
|
retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval;
|
||||||
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;
|
// リージョンチェック
|
||||||
}
|
if( !UTL_CheckAppRegion( s_cbData.pBootSegBuf->rh.s.card_region_bitmap ) ) {
|
||||||
|
retval = (retval == HOTSW_SUCCESS) ? HOWSW_REGION_CHECK_ERROR : retval;
|
||||||
|
}
|
||||||
|
|
||||||
// アプリジャンプのデバッグ時にROMエミュレーション情報だけ必要な場合
|
// アプリジャンプのデバッグ時にROMエミュレーション情報だけ必要な場合
|
||||||
if(SYSMi_GetWork()->flags.hotsw.isLoadRomEmuOnly){
|
if(SYSMi_GetWork()->flags.hotsw.isLoadRomEmuOnly){
|
||||||
SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE;
|
SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE;
|
||||||
@ -2382,6 +2384,10 @@ static void DebugPrintErrorMessage(HotSwState state)
|
|||||||
OS_PutString(" - Error 3 : CRC Check\n");
|
OS_PutString(" - Error 3 : CRC Check\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case HOWSW_REGION_CHECK_ERROR:
|
||||||
|
OS_PutString(" - Error 3 : Region Check\n");
|
||||||
|
break;
|
||||||
|
|
||||||
case HOTSW_HASH_CHECK_ERROR:
|
case HOTSW_HASH_CHECK_ERROR:
|
||||||
OS_PutString(" - Error 4 : Hash Check\n");
|
OS_PutString(" - Error 4 : Hash Check\n");
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -34,7 +34,6 @@ static void SYSMi_CopyLCFGDataSettings( void );
|
|||||||
static TitleProperty *SYSMi_CheckDebuggerBannerViewModeBoot( void );
|
static TitleProperty *SYSMi_CheckDebuggerBannerViewModeBoot( void );
|
||||||
static TitleProperty *SYSMi_CheckShortcutBoot1( void );
|
static TitleProperty *SYSMi_CheckShortcutBoot1( void );
|
||||||
static TitleProperty *SYSMi_CheckShortcutBoot2( void );
|
static TitleProperty *SYSMi_CheckShortcutBoot2( void );
|
||||||
static void SYSMi_CheckCardCloneBoot( void );
|
|
||||||
void SYSMi_SendKeysToARM7( void );
|
void SYSMi_SendKeysToARM7( void );
|
||||||
static OSTitleId SYSMi_getTitleIdOfMachineSettings( 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取得
|
// NAM_Initされるようになったので、NAMで本体設定のID取得
|
||||||
// それらしきものがインストールされていない場合は0(NULL)をリターン
|
// それらしきものがインストールされていない場合は0(NULL)をリターン
|
||||||
static OSTitleId SYSMi_getTitleIdOfMachineSettings( void )
|
static OSTitleId SYSMi_getTitleIdOfMachineSettings( void )
|
||||||
|
|||||||
@ -281,9 +281,6 @@ TitleProperty *SYSM_GetCardTitleList( BOOL *changed )
|
|||||||
// ロード開始していたら、もうヘッダやタイトル情報は変更しない
|
// ロード開始していたら、もうヘッダやタイトル情報は変更しない
|
||||||
return pTitleList_Card;
|
return pTitleList_Card;
|
||||||
}
|
}
|
||||||
// [TODO:] ROMヘッダの platform_code がNTR,TWL-HYB,TWL-LTD以外のもの
|
|
||||||
// region_codeが本体情報と違うもの
|
|
||||||
// の場合は、正常に認識できないタイトルであることを示す。
|
|
||||||
|
|
||||||
if( SYSMi_GetWork()->flags.hotsw.isCardStateChanged ) {
|
if( SYSMi_GetWork()->flags.hotsw.isCardStateChanged ) {
|
||||||
u16 id = (u16)OS_GetLockID();
|
u16 id = (u16)OS_GetLockID();
|
||||||
@ -335,7 +332,6 @@ BOOL SYSMi_CopyCardRomHeader( void )
|
|||||||
// ROMヘッダのリード
|
// ROMヘッダのリード
|
||||||
DC_InvalidateRange( (void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_APP_ROM_HEADER_SIZE ); // キャッシュケア
|
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ヘッダコピー
|
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;
|
retval = TRUE;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,6 @@
|
|||||||
// define data-----------------------------------------------------------------
|
// define data-----------------------------------------------------------------
|
||||||
// extern data-----------------------------------------------------------------
|
// extern data-----------------------------------------------------------------
|
||||||
// function's prototype-------------------------------------------------------
|
// function's prototype-------------------------------------------------------
|
||||||
static int SYSMi_IsValidCard( void );
|
|
||||||
// global variable-------------------------------------------------------------
|
// global variable-------------------------------------------------------------
|
||||||
// static variable-------------------------------------------------------------
|
// static variable-------------------------------------------------------------
|
||||||
// const data------------------------------------------------------------------
|
// const data------------------------------------------------------------------
|
||||||
@ -68,7 +67,7 @@ BOOL SYSMi_IsDebuggerBannerViewMode( void )
|
|||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
return ( SYSM_IsRunOnDebugger() &&
|
return ( SYSM_IsRunOnDebugger() &&
|
||||||
SYSMi_IsValidCard() &&
|
SYSMi_IsExistCard() &&
|
||||||
SYSM_GetCardRomHeader()->dbgRomSize == 0 ) ? TRUE : FALSE;
|
SYSM_GetCardRomHeader()->dbgRomSize == 0 ) ? TRUE : FALSE;
|
||||||
#else
|
#else
|
||||||
return FALSE;
|
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 )
|
BOOL SYSMi_CheckEntryAddress( void )
|
||||||
{
|
{
|
||||||
|
|||||||
@ -477,6 +477,18 @@ static void AMNi_getAndAddNandTitleData( NAMTitleId titleID, BOOL readShowData )
|
|||||||
return;
|
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++;
|
sNandAppRomHeaderArrayLength++;
|
||||||
|
|
||||||
// もうランチャー表示用情報は数がオーバーしてるか、表示用情報を読まない設定
|
// もうランチャー表示用情報は数がオーバーしてるか、表示用情報を読まない設定
|
||||||
|
|||||||
@ -22,6 +22,7 @@ SUBDIRS = \
|
|||||||
../../../libraries_sysmenu/sysmenu \
|
../../../libraries_sysmenu/sysmenu \
|
||||||
../../../libraries_sysmenu/boot \
|
../../../libraries_sysmenu/boot \
|
||||||
../../../libraries_sysmenu/hotsw \
|
../../../libraries_sysmenu/hotsw \
|
||||||
|
../../../libraries_sysmenu/util \
|
||||||
# ../../../libraries_sysmenu/sharedFont \
|
# ../../../libraries_sysmenu/sharedFont \
|
||||||
# ../../../libraries_sysmenu/reloc_info \
|
# ../../../libraries_sysmenu/reloc_info \
|
||||||
# ../../../libraries_sysmenu/mcu \
|
# ../../../libraries_sysmenu/mcu \
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
BIN
docs/鍵管理.xls
BIN
docs/鍵管理.xls
Binary file not shown.
@ -29,7 +29,6 @@ extern "C" {
|
|||||||
#define DS_WLPATCH_COPYCODE_SIZE (10*4)
|
#define DS_WLPATCH_COPYCODE_SIZE (10*4)
|
||||||
|
|
||||||
void DS_InsertWLPatch( void* romHeaderNTR );
|
void DS_InsertWLPatch( void* romHeaderNTR );
|
||||||
void DS_CheckROMCloneBoot( void );
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@ -122,9 +122,6 @@ typedef struct SYSM_work {
|
|||||||
}hotsw;
|
}hotsw;
|
||||||
}flags; // 8B
|
}flags; // 8B
|
||||||
|
|
||||||
u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16(ARM9側でコピーして使用する側)
|
|
||||||
u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16(ARM7側ライブラリでダイレクトに書き換わる側)
|
|
||||||
|
|
||||||
OSLockWord lockCardRsc ATTRIBUTE_ALIGN(8); // カードリソース排他制御用
|
OSLockWord lockCardRsc ATTRIBUTE_ALIGN(8); // カードリソース排他制御用
|
||||||
OSLockWord lockHotSW; // カードリソース排他制御用
|
OSLockWord lockHotSW; // カードリソース排他制御用
|
||||||
u32 appCardID; // カードID
|
u32 appCardID; // カードID
|
||||||
|
|||||||
@ -119,6 +119,24 @@ extern void UTL_SetFatalError( FatalErrorCode error ); // FATAL
|
|||||||
extern u64 UTL_GetFatalError( void ); // FATALエラー状態の取得(FatalErrorCodeをビットに割り当てて格納しています。)
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -25,6 +25,7 @@
|
|||||||
#include <../build/libraries/os/common/include/application_jump_private.h>
|
#include <../build/libraries/os/common/include/application_jump_private.h>
|
||||||
|
|
||||||
#include <sysmenu/types.h>
|
#include <sysmenu/types.h>
|
||||||
|
#include <sysmenu/util.h>
|
||||||
|
|
||||||
typedef struct AMNBannerCounter
|
typedef struct AMNBannerCounter
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user