mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ボンディングオプション00でない場合、NTRカードホワイトリストチェック(or署名チェック)で引っかかっても強制実行を選択可能になりました
・デバッガ接続時以外は常にホワイトリストチェック(or署名チェック)を行うように変更しました(AUTH_NTR_CARD_PRODUCT_ONLYの廃止) ・ホワイトリストチェック(or署名チェック)に引っかからずDHTチェックに引っかかった場合は、強制的に停止します git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1545 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
a34e134d83
commit
cad9976a2a
@ -49,6 +49,8 @@
|
|||||||
#include <sysmenu/dht/dht.h>
|
#include <sysmenu/dht/dht.h>
|
||||||
#define DS_HASH_TABLE_SIZE (256*1024)
|
#define DS_HASH_TABLE_SIZE (256*1024)
|
||||||
|
|
||||||
|
#define SYSM_TITLE_MESSAGE_ARRAY_MAX 1
|
||||||
|
|
||||||
typedef struct MbAuthCode
|
typedef struct MbAuthCode
|
||||||
{
|
{
|
||||||
char magic_code[2]; // マジックナンバー
|
char magic_code[2]; // マジックナンバー
|
||||||
@ -92,6 +94,12 @@ static MbAuthCode s_authcode;
|
|||||||
|
|
||||||
static BOOL s_loadstart = FALSE;
|
static BOOL s_loadstart = FALSE;
|
||||||
|
|
||||||
|
static BOOL s_loadPaused = FALSE;
|
||||||
|
static BOOL s_loadForcibly = FALSE;
|
||||||
|
|
||||||
|
static OSMessageQueue s_msgQ;
|
||||||
|
static OSMessage s_msgArray[SYSM_TITLE_MESSAGE_ARRAY_MAX];
|
||||||
|
|
||||||
static NAMTitleId *s_pTitleIDList = NULL;
|
static NAMTitleId *s_pTitleIDList = NULL;
|
||||||
static int s_listLength = 0;
|
static int s_listLength = 0;
|
||||||
|
|
||||||
@ -1206,18 +1214,32 @@ static AuthResult SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle)
|
|||||||
return AUTH_RESULT_SUCCEEDED;
|
return AUTH_RESULT_SUCCEEDED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL SYSM_IsLoadTitlePaused(void)
|
||||||
|
{
|
||||||
|
return s_loadPaused;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SYSM_ResumeLoadingThread( BOOL force )
|
||||||
|
{
|
||||||
|
if( !s_loadPaused )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
s_loadPaused = FALSE;
|
||||||
|
// メッセージ送信
|
||||||
|
if(!OS_SendMessage(&s_msgQ, (OSMessage)force, OS_MESSAGE_NOBLOCK))
|
||||||
|
{
|
||||||
|
OS_TPrintf( "SYSM_ResumeLoadingThread:Message send error.\n" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NTR版カードアプリのヘッダ認証処理
|
// NTR版カードアプリのヘッダ認証処理
|
||||||
static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, ROM_Header *head )
|
static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, ROM_Header *head )
|
||||||
{
|
{
|
||||||
AuthResult ret = AUTH_RESULT_SUCCEEDED;
|
AuthResult ret = AUTH_RESULT_SUCCEEDED;
|
||||||
|
|
||||||
// ボンディングオプション00でないときは適用しない
|
|
||||||
#ifdef AUTH_NTR_CARD_PRODUCT_ONLY
|
|
||||||
if( !SCFG_GetBondingOption() == 0 )
|
|
||||||
#else
|
|
||||||
// デバッガに接続してるときは適用しない
|
// デバッガに接続してるときは適用しない
|
||||||
if( SYSM_IsRunOnDebugger() )
|
if( SYSM_IsRunOnDebugger() )
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
return AUTH_RESULT_SUCCEEDED;
|
return AUTH_RESULT_SUCCEEDED;
|
||||||
}
|
}
|
||||||
@ -1239,19 +1261,48 @@ static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle,
|
|||||||
if(!dht)
|
if(!dht)
|
||||||
{
|
{
|
||||||
OS_TPrintf(" Search DHT : database init Failed.\n");
|
OS_TPrintf(" Search DHT : database init Failed.\n");
|
||||||
return AUTH_RESULT_WHITELIST_INITDB_FAILED;
|
ret = AUTH_RESULT_WHITELIST_INITDB_FAILED;
|
||||||
}
|
}else
|
||||||
OS_TPrintf("Searching DHT for %.4s(%02X)...", head->s.game_code, head->s.rom_version);
|
|
||||||
db = DHT_GetDatabase(dht, &head->s);
|
|
||||||
if ( !db )
|
|
||||||
{
|
{
|
||||||
OS_TPrintf(" Search DHT : Failed.\n");
|
OS_TPrintf("Searching DHT for %.4s(%02X)...", head->s.game_code, head->s.rom_version);
|
||||||
return AUTH_RESULT_WHITELIST_NOTFOUND;
|
db = DHT_GetDatabase(dht, &head->s);
|
||||||
|
if ( !db )
|
||||||
|
{
|
||||||
|
OS_TPrintf(" Search DHT : Failed.\n");
|
||||||
|
ret = AUTH_RESULT_WHITELIST_NOTFOUND;
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
hash0 = db->hash[0];
|
||||||
|
hash1 = db->hash[1];
|
||||||
|
ret = AUTH_RESULT_SUCCEEDED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
hash0 = db->hash[0];
|
|
||||||
hash1 = db->hash[1];
|
|
||||||
ret = AUTH_RESULT_SUCCEEDED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ボンディングオプションが0のときは以下の特殊処理をせずにリターン
|
||||||
|
if( SCFG_GetBondingOption() == 0 )
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// データロード前認証に失敗した場合にボタン押しで強制ロードするようにする
|
||||||
|
// 失敗時にメインスレッドにメッセージを送り、ボタン押し待ち
|
||||||
|
// 押されたらメインスレッドからこちらのスレッドにメッセージを送る
|
||||||
|
// メッセージ内容次第でロードを続行するか、エラーを返して中止するか選択
|
||||||
|
// 続行する場合は強制実行フラグを立てる
|
||||||
|
if( ret != AUTH_RESULT_SUCCEEDED )
|
||||||
|
{
|
||||||
|
BOOL forcing;
|
||||||
|
OS_InitMessageQueue(&s_msgQ, s_msgArray, SYSM_TITLE_MESSAGE_ARRAY_MAX);
|
||||||
|
s_loadPaused = TRUE;
|
||||||
|
OS_ReceiveMessage(&s_msgQ, (OSMessage*)&forcing, OS_MESSAGE_BLOCK);
|
||||||
|
if(forcing)
|
||||||
|
{
|
||||||
|
ret = AUTH_RESULT_SUCCEEDED;
|
||||||
|
s_loadForcibly = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1263,13 +1314,14 @@ static AuthResult SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle)
|
|||||||
SVCHMACSHA1Context ctx;
|
SVCHMACSHA1Context ctx;
|
||||||
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF;
|
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF;
|
||||||
|
|
||||||
// ボンディングオプション00でないときは適用しない
|
|
||||||
#ifdef AUTH_NTR_CARD_PRODUCT_ONLY
|
|
||||||
if( !SCFG_GetBondingOption() == 0 )
|
|
||||||
#else
|
|
||||||
// デバッガに接続してるときは適用しない
|
// デバッガに接続してるときは適用しない
|
||||||
if( SYSM_IsRunOnDebugger() )
|
if( SYSM_IsRunOnDebugger() )
|
||||||
#endif
|
{
|
||||||
|
return AUTH_RESULT_SUCCEEDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ロード前認証で強制実行フラグを立てていれば、飛ばす
|
||||||
|
if( s_loadForcibly )
|
||||||
{
|
{
|
||||||
return AUTH_RESULT_SUCCEEDED;
|
return AUTH_RESULT_SUCCEEDED;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,6 +31,9 @@
|
|||||||
static void INTR_VBlank( void );
|
static void INTR_VBlank( void );
|
||||||
static void deleteTmp();
|
static void deleteTmp();
|
||||||
void SYSM_DeleteTempDirectory( TitleProperty *pBootTitle );
|
void SYSM_DeleteTempDirectory( TitleProperty *pBootTitle );
|
||||||
|
static BOOL IsCommandSelected(void);
|
||||||
|
static void PrintPause(void);
|
||||||
|
static void PrintError(AuthResult res);
|
||||||
|
|
||||||
// global variable-------------------------------------------------------------
|
// global variable-------------------------------------------------------------
|
||||||
|
|
||||||
@ -102,9 +105,10 @@ void TwlMain( void )
|
|||||||
LAUNCHER = 3,
|
LAUNCHER = 3,
|
||||||
LOAD_START = 4,
|
LOAD_START = 4,
|
||||||
LOADING = 5,
|
LOADING = 5,
|
||||||
AUTHENTICATE = 6,
|
LOAD_PAUSE = 6,
|
||||||
BOOT = 7,
|
AUTHENTICATE = 7,
|
||||||
STOP = 8
|
BOOT = 8,
|
||||||
|
STOP = 9
|
||||||
};
|
};
|
||||||
u32 state = LOGODEMO_INIT;
|
u32 state = LOGODEMO_INIT;
|
||||||
TitleProperty *pBootTitle = NULL;
|
TitleProperty *pBootTitle = NULL;
|
||||||
@ -309,6 +313,12 @@ void TwlMain( void )
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case LOADING:
|
case LOADING:
|
||||||
|
// ここでロード前ホワイトリストチェック失敗メッセージをポーリングし、受け取ったらstateをLOAD_PAUSEに
|
||||||
|
if( SYSM_IsLoadTitlePaused() )
|
||||||
|
{
|
||||||
|
state = LOAD_PAUSE;
|
||||||
|
PrintPause();
|
||||||
|
}
|
||||||
if( SYSM_IsLoadTitleFinished() ) {
|
if( SYSM_IsLoadTitleFinished() ) {
|
||||||
SYSM_StartAuthenticateTitle( pBootTitle );
|
SYSM_StartAuthenticateTitle( pBootTitle );
|
||||||
state = AUTHENTICATE;
|
state = AUTHENTICATE;
|
||||||
@ -323,6 +333,14 @@ void TwlMain( void )
|
|||||||
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
|
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case LOAD_PAUSE:
|
||||||
|
// ロード前ホワイトリストチェック失敗で一時停止中
|
||||||
|
// 強制起動するか中止するかの選択がされたらLOADINGに戻る
|
||||||
|
if( IsCommandSelected() )
|
||||||
|
{
|
||||||
|
state = LOADING;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case AUTHENTICATE:
|
case AUTHENTICATE:
|
||||||
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
|
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
|
||||||
#ifndef DISABLE_WLFIRM_LOAD
|
#ifndef DISABLE_WLFIRM_LOAD
|
||||||
@ -345,20 +363,8 @@ void TwlMain( void )
|
|||||||
state = STOP;
|
state = STOP;
|
||||||
// [TODO:]クリアしたほうが良いデータ(鍵など)があれば消す
|
// [TODO:]クリアしたほうが良いデータ(鍵など)があれば消す
|
||||||
|
|
||||||
// ƒfƒoƒO•\ަ
|
// エラー表示
|
||||||
LauncherInit( s_titleList );
|
PrintError(res);
|
||||||
GX_SetVisiblePlane( GX_PLANEMASK_BG0 );
|
|
||||||
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
|
|
||||||
G2_ChangeBlendAlpha( 0, 31 );
|
|
||||||
PrintfSJIS( 1, 25, TXT_COLOR_RED,"LAUNCHER : ERROR OCCURRED! - %d\n",res );
|
|
||||||
PrintfSJIS( 1, 40, TXT_COLOR_RED,"%s",error_msg[res] );
|
|
||||||
// “ÁŽê•\ަ
|
|
||||||
if(res == AUTH_RESULT_CHECK_TITLE_LAUNCH_RIGHTS_FAILED)
|
|
||||||
{
|
|
||||||
PrintfSJIS( 1, 55, TXT_COLOR_RED,"NAM result = %d", SYSMi_getCheckTitleLaunchRightsResult() );
|
|
||||||
}
|
|
||||||
GX_DispOn();
|
|
||||||
GXS_DispOn();
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -384,6 +390,63 @@ void TwlMain( void )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL IsCommandSelected(void)
|
||||||
|
{
|
||||||
|
static BOOL left = FALSE;
|
||||||
|
if( !( pad.cont & ( PAD_BUTTON_A | PAD_BUTTON_B ) ) )
|
||||||
|
{
|
||||||
|
left = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( left && ( pad.trg & PAD_BUTTON_A ) )
|
||||||
|
{
|
||||||
|
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
|
||||||
|
PrintfSJIS( 1, 25, TXT_COLOR_RED,"Resume Loading....\n" );
|
||||||
|
SYSM_ResumeLoadingThread( TRUE );
|
||||||
|
left = FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}else if( left && ( pad.trg & PAD_BUTTON_B ) )
|
||||||
|
{
|
||||||
|
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
|
||||||
|
PrintfSJIS( 1, 25, TXT_COLOR_RED,"Please Wait....\n" );
|
||||||
|
SYSM_ResumeLoadingThread( FALSE );
|
||||||
|
left = FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PrintPause(void)
|
||||||
|
{
|
||||||
|
LauncherInit( s_titleList );
|
||||||
|
GX_SetVisiblePlane( GX_PLANEMASK_BG0 );
|
||||||
|
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
|
||||||
|
G2_ChangeBlendAlpha( 0, 31 );
|
||||||
|
PrintfSJIS( 1, 25, TXT_COLOR_RED,"WhiteList Check Failed.\n" );
|
||||||
|
PrintfSJIS( 1, 40, TXT_COLOR_RED,"Prease Select Command." );
|
||||||
|
PrintfSJIS( 1, 55, TXT_COLOR_RED,"A : Force to Launch" );
|
||||||
|
PrintfSJIS( 1, 70, TXT_COLOR_RED," or" );
|
||||||
|
PrintfSJIS( 1, 85, TXT_COLOR_RED,"B : Stop And Show Error Message" );
|
||||||
|
GX_DispOn();
|
||||||
|
GXS_DispOn();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PrintError(AuthResult res)
|
||||||
|
{
|
||||||
|
LauncherInit( s_titleList );
|
||||||
|
GX_SetVisiblePlane( GX_PLANEMASK_BG0 );
|
||||||
|
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
|
||||||
|
G2_ChangeBlendAlpha( 0, 31 );
|
||||||
|
PrintfSJIS( 1, 25, TXT_COLOR_RED,"LAUNCHER : ERROR OCCURRED! - %d\n",res );
|
||||||
|
PrintfSJIS( 1, 40, TXT_COLOR_RED,"%s",error_msg[res] );
|
||||||
|
// 特殊表示
|
||||||
|
if(res == AUTH_RESULT_CHECK_TITLE_LAUNCH_RIGHTS_FAILED)
|
||||||
|
{
|
||||||
|
PrintfSJIS( 1, 55, TXT_COLOR_RED,"NAM result = %d", SYSMi_getCheckTitleLaunchRightsResult() );
|
||||||
|
}
|
||||||
|
GX_DispOn();
|
||||||
|
GXS_DispOn();
|
||||||
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// 割り込み処理
|
// 割り込み処理
|
||||||
|
|||||||
@ -139,6 +139,9 @@ extern void SYSM_LoadNintendoLogo1D( u16 *pLogoData, u16 *pDst, int paletteColor
|
|||||||
|
|
||||||
extern s32 SYSMi_getCheckTitleLaunchRightsResult( void ); // CheckTitleLaunchRightsの結果を返す(デバグ用)
|
extern s32 SYSMi_getCheckTitleLaunchRightsResult( void ); // CheckTitleLaunchRightsの結果を返す(デバグ用)
|
||||||
|
|
||||||
|
extern BOOL SYSM_IsLoadTitlePaused(void); // ローディングスレッドが一時停止しているか?
|
||||||
|
extern void SYSM_ResumeLoadingThread( BOOL force ); // ローディングスレッドが一時停止していたら再開
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 状態チェック
|
// 状態チェック
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user