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
|
||||
|
||||
// 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カードなし
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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取得
|
||||
// それらしきものがインストールされていない場合は0(NULL)をリターン
|
||||
static OSTitleId SYSMi_getTitleIdOfMachineSettings( void )
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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 )
|
||||
{
|
||||
|
||||
@ -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++;
|
||||
|
||||
// もうランチャー表示用情報は数がオーバーしてるか、表示用情報を読まない設定
|
||||
|
||||
@ -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.
BIN
docs/鍵管理.xls
BIN
docs/鍵管理.xls
Binary file not shown.
@ -29,7 +29,6 @@ extern "C" {
|
||||
#define DS_WLPATCH_COPYCODE_SIZE (10*4)
|
||||
|
||||
void DS_InsertWLPatch( void* romHeaderNTR );
|
||||
void DS_CheckROMCloneBoot( void );
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@ -122,9 +122,6 @@ typedef struct SYSM_work {
|
||||
}hotsw;
|
||||
}flags; // 8B
|
||||
|
||||
u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16(ARM9側でコピーして使用する側)
|
||||
u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16(ARM7側ライブラリでダイレクトに書き換わる側)
|
||||
|
||||
OSLockWord lockCardRsc ATTRIBUTE_ALIGN(8); // カードリソース排他制御用
|
||||
OSLockWord lockHotSW; // カードリソース排他制御用
|
||||
u32 appCardID; // カードID
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user