ボンディングオプション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:
yoshida_teruhisa 2008-05-28 06:54:55 +00:00
parent a34e134d83
commit cad9976a2a
3 changed files with 155 additions and 37 deletions

View File

@ -49,6 +49,8 @@
#include <sysmenu/dht/dht.h>
#define DS_HASH_TABLE_SIZE (256*1024)
#define SYSM_TITLE_MESSAGE_ARRAY_MAX 1
typedef struct MbAuthCode
{
char magic_code[2]; // マジックナンバー
@ -92,6 +94,12 @@ static MbAuthCode s_authcode;
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 int s_listLength = 0;
@ -1206,18 +1214,32 @@ static AuthResult SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle)
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版カードアプリのヘッダ認証処理
static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, ROM_Header *head )
{
AuthResult ret = AUTH_RESULT_SUCCEEDED;
// ボンディングオプション00でないときは適用しない
#ifdef AUTH_NTR_CARD_PRODUCT_ONLY
if( !SCFG_GetBondingOption() == 0 )
#else
// デバッガに接続してるときは適用しない
if( SYSM_IsRunOnDebugger() )
#endif
{
return AUTH_RESULT_SUCCEEDED;
}
@ -1239,19 +1261,48 @@ static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle,
if(!dht)
{
OS_TPrintf(" Search DHT : database init Failed.\n");
return AUTH_RESULT_WHITELIST_INITDB_FAILED;
}
OS_TPrintf("Searching DHT for %.4s(%02X)...", head->s.game_code, head->s.rom_version);
db = DHT_GetDatabase(dht, &head->s);
if ( !db )
ret = AUTH_RESULT_WHITELIST_INITDB_FAILED;
}else
{
OS_TPrintf(" Search DHT : Failed.\n");
return AUTH_RESULT_WHITELIST_NOTFOUND;
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");
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;
}
@ -1263,13 +1314,14 @@ static AuthResult SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle)
SVCHMACSHA1Context ctx;
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() )
#endif
{
return AUTH_RESULT_SUCCEEDED;
}
// ロード前認証で強制実行フラグを立てていれば、飛ばす
if( s_loadForcibly )
{
return AUTH_RESULT_SUCCEEDED;
}

View File

@ -31,6 +31,9 @@
static void INTR_VBlank( void );
static void deleteTmp();
void SYSM_DeleteTempDirectory( TitleProperty *pBootTitle );
static BOOL IsCommandSelected(void);
static void PrintPause(void);
static void PrintError(AuthResult res);
// global variable-------------------------------------------------------------
@ -102,9 +105,10 @@ void TwlMain( void )
LAUNCHER = 3,
LOAD_START = 4,
LOADING = 5,
AUTHENTICATE = 6,
BOOT = 7,
STOP = 8
LOAD_PAUSE = 6,
AUTHENTICATE = 7,
BOOT = 8,
STOP = 9
};
u32 state = LOGODEMO_INIT;
TitleProperty *pBootTitle = NULL;
@ -309,6 +313,12 @@ void TwlMain( void )
}
break;
case LOADING:
// ここでロード前ホワイトリストチェック失敗メッセージをポーリングし、受け取ったらstateをLOAD_PAUSEに
if( SYSM_IsLoadTitlePaused() )
{
state = LOAD_PAUSE;
PrintPause();
}
if( SYSM_IsLoadTitleFinished() ) {
SYSM_StartAuthenticateTitle( pBootTitle );
state = AUTHENTICATE;
@ -323,6 +333,14 @@ void TwlMain( void )
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
}
break;
case LOAD_PAUSE:
// ロード前ホワイトリストチェック失敗で一時停止中
// 強制起動するか中止するかの選択がされたらLOADINGに戻る
if( IsCommandSelected() )
{
state = LOADING;
}
break;
case AUTHENTICATE:
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
#ifndef DISABLE_WLFIRM_LOAD
@ -345,20 +363,8 @@ void TwlMain( void )
state = STOP;
// [TODO:]クリアしたほうが良いデータ(鍵など)があれば消す
// ƒfƒoƒO•\ަ
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();
// エラー表示
PrintError(res);
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();
}
// ============================================================================
// 割り込み処理

View File

@ -139,6 +139,9 @@ extern void SYSM_LoadNintendoLogo1D( u16 *pLogoData, u16 *pDst, int paletteColor
extern s32 SYSMi_getCheckTitleLaunchRightsResult( void ); // CheckTitleLaunchRightsの結果を返すデバグ用
extern BOOL SYSM_IsLoadTitlePaused(void); // ローディングスレッドが一時停止しているか?
extern void SYSM_ResumeLoadingThread( BOOL force ); // ローディングスレッドが一時停止していたら再開
#endif
// 状態チェック