diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index c36eec00..ea75bb2e 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -89,15 +89,13 @@ static s32 ReadFile( FSFile* pf, void* buffer, s32 size ); static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ); static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle ); static void SYSMi_makeTitleIdList( void ); -static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Header *head ); +static BOOL SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Header *head ); // global variable------------------------------------------------------------- // static variable------------------------------------------------------------- static OSThread s_thread; static OSThread s_auth_thread; static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32); -static AuthResult s_authResult = AUTH_RESULT_PROCESSING; // ROM検証結果 -static AuthResult s_headerAuthResult = AUTH_RESULT_TITLE_LOAD_FAILED; static MbAuthCode s_authcode; @@ -855,8 +853,7 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode, //この時点でヘッダの正当性検証 // ※ROMヘッダ認証 - s_headerAuthResult = SYSMi_AuthenticateHeader( pBootTitle, head ); - if( AUTH_RESULT_SUCCEEDED != s_headerAuthResult ) + if( !SYSMi_AuthenticateHeader( pBootTitle, head ) ) { goto ERROR; } @@ -1039,8 +1036,6 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle ) // この時点でHotSWが止まっていないと、さらにカードのROMヘッダ // を上書きしてしまう可能性がある - // 一応、アプリロード開始前に検証結果をPROCESSINGにセット - s_authResult = AUTH_RESULT_PROCESSING; // アプリ未ロード状態なら、ロード開始 if( !pBootTitle->flags.isAppLoadCompleted ) { SYSMi_GetWork()->flags.common.isLoadFinished = FALSE; @@ -1092,7 +1087,7 @@ BOOL SYSM_IsLoadTitleFinished( void ) // ============================================================================ // 署名つきアプリ(≠DSダウンロードアプリ署名)共通のヘッダ認証処理 -static AuthResult SYSMi_AuthenticateHeaderWithSign( TitleProperty *pBootTitle, ROM_Header *head ) +static BOOL SYSMi_AuthenticateHeaderWithSign( TitleProperty *pBootTitle, ROM_Header *head ) { // 署名処理 const u8 *key; @@ -1165,7 +1160,10 @@ static AuthResult SYSMi_AuthenticateHeaderWithSign( TitleProperty *pBootTitle, R if( !SVC_DecryptSign( &con, sigbuf.digest, head->signature, key )) { OS_TPrintf("Authenticate_Header failed: Sign decryption failed.\n"); - if(!s_b_dev) return AUTH_RESULT_SIGN_DECRYPTION_FAILED; + if(!s_b_dev) { + UTL_SetFatalError(FATAL_ERROR_SIGN_DECRYPTION_FAILED); + return FALSE; + } } if(s_calc_hash) { @@ -1173,7 +1171,10 @@ static AuthResult SYSMi_AuthenticateHeaderWithSign( TitleProperty *pBootTitle, R if(!SVC_CompareSHA1(sigbuf.digest, (const void *)&s_calc_hash[0])) { OS_TPrintf("Authenticate_Header failed: Sign compare failed.\n"); - if(!s_b_dev) return AUTH_RESULT_SIGN_COMPARE_FAILED; + if(!s_b_dev) { + UTL_SetFatalError(FATAL_ERROR_SIGN_COMPARE_FAILED); + return FALSE; + } }else { OS_TPrintf("Authenticate_Header : Sign check succeed. %dms.\n", OS_TicksToMilliSeconds(OS_GetTick() - prev)); @@ -1181,15 +1182,18 @@ static AuthResult SYSMi_AuthenticateHeaderWithSign( TitleProperty *pBootTitle, R }else { OS_TPrintf("Authenticate_Header failed: Header Hash calc failed.\n"); - if(!s_b_dev) return AUTH_RESULT_HEADER_HASH_CALC_FAILED; + if(!s_b_dev) { + UTL_SetFatalError(FATAL_ERROR_HEADER_HASH_CALC_FAILED); + return FALSE; + } } OS_TPrintf("Authenticate_Header : total %d ms.\n", OS_TicksToMilliSeconds(OS_GetTick() - start) ); - return AUTH_RESULT_SUCCEEDED; + return TRUE; } // TWLアプリ、NTR拡張NANDアプリ 共通のヘッダ認証処理 -static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle, ROM_Header *head ) +static BOOL SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle, ROM_Header *head ) { // pBootTitle->titleIDとROMヘッダのtitleIDの一致確認をする。 // ホワイトリストマスタリングされたNTRアプリでも行う場合はSYSMi_AuthenticateTWLHeaderへ移動 @@ -1199,7 +1203,8 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle, ROM_He OS_TPrintf( "Authenticate_Header failed: header TitleID error\n" ); OS_TPrintf( "Authenticate_Header failed: selectedTitleID=%.16llx\n", pBootTitle->titleID ); OS_TPrintf( "Authenticate_Header failed: headerTitleID=%.16llx\n", head->s.titleID ); - return AUTH_RESULT_TITLEID_COMPARE_FAILED; + UTL_SetFatalError(FATAL_ERROR_TITLEID_COMPARE_FAILED); + return FALSE; }else { OS_TPrintf( "Authenticate_Header : header TitleID check succeed.\n" ); @@ -1212,7 +1217,8 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle, ROM_He { // 署名有効フラグが立っていない 且つ デバッガが有効でTLFを読み込んでいるのでなければFAILED OS_TPrintf("Authenticate_Header failed: Sign check flag is OFF!\n"); - return AUTH_RESULT_VALID_SIGN_FLAG_OFF; + UTL_SetFatalError(FATAL_ERROR_VALID_SIGN_FLAG_OFF); + return FALSE; } } @@ -1224,7 +1230,7 @@ s32 SYSMi_getCheckTitleLaunchRightsResult( void ) } // TWLアプリ、NTR拡張NANDアプリ 共通の認証 -static AuthResult SYSMi_AuthenticateTWLTitle( TitleProperty *pBootTitle ) +static BOOL SYSMi_AuthenticateTWLTitle( TitleProperty *pBootTitle ) { ROM_Header *head; OSTick start,prev; @@ -1240,7 +1246,8 @@ static AuthResult SYSMi_AuthenticateTWLTitle( TitleProperty *pBootTitle ) { s_nam_error = result; OS_TPrintf("Authenticate failed: NAM_CheckTitleLaunchRights failed. %d \n",result); - return AUTH_RESULT_CHECK_TITLE_LAUNCH_RIGHTS_FAILED; + UTL_SetFatalError(FATAL_ERROR_CHECK_TITLE_LAUNCH_RIGHTS_FAILED); + return FALSE; }else { OS_TPrintf("Authenticate : NAM_CheckTitleLaunchRights succeed. %d ms.\n", OS_TicksToMilliSeconds(OS_GetTick() - start) ); @@ -1288,7 +1295,10 @@ static AuthResult SYSMi_AuthenticateTWLTitle( TitleProperty *pBootTitle ) if(!SVC_CompareSHA1((const void *)hash_addr[l], (const void *)&s_calc_hash[(l+1) * SVC_SHA1_DIGEST_SIZE])) { OS_TPrintf("Authenticate failed: %s module hash check failed.\n", str[l]); - if(!s_b_dev) return AUTH_RESULT_MODULE_HASH_CHECK_FAILED; + if(!s_b_dev) { + UTL_SetFatalError(FATAL_ERROR_MODULE_HASH_CHECK_FAILED); + return FALSE; + } }else { OS_TPrintf("Authenticate : %s module hash check succeed. %dms.\n", str[l], OS_TicksToMilliSeconds(OS_GetTick() - prev)); @@ -1296,7 +1306,10 @@ static AuthResult SYSMi_AuthenticateTWLTitle( TitleProperty *pBootTitle ) }else { OS_TPrintf("Authenticate failed: %s module hash calc failed.\n", str[l]); - if(!s_b_dev) return AUTH_RESULT_MODULE_HASH_CALC_FAILED; + if(!s_b_dev) { + UTL_SetFatalError(FATAL_ERROR_MODULE_HASH_CALC_FAILED); + return FALSE; + } } } } @@ -1309,35 +1322,36 @@ static AuthResult SYSMi_AuthenticateTWLTitle( TitleProperty *pBootTitle ) pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_TEMP) && !(head->s.titleID_Hi & TITLE_ID_HI_MEDIA_MASK) ) || (pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM && (head->s.titleID_Hi & TITLE_ID_HI_MEDIA_MASK) ) ) { - return AUTH_RESULT_MEDIA_CHECK_FAILED; + UTL_SetFatalError(FATAL_ERROR_MEDIA_CHECK_FAILED); + return FALSE; } } - return AUTH_RESULT_SUCCEEDED; + return TRUE; } // NTR版特殊NANDアプリ(pictochat等)のヘッダ認証処理 -static AuthResult SYSMi_AuthenticateNTRNandAppHeader( TitleProperty *pBootTitle, ROM_Header *head ) +static BOOL SYSMi_AuthenticateNTRNandAppHeader( TitleProperty *pBootTitle, ROM_Header *head ) { return SYSMi_AuthenticateTWLHeader( pBootTitle, head ); } // NTR版特殊NANDアプリ(pictochat等)の認証 -static AuthResult SYSMi_AuthenticateNTRNandTitle( TitleProperty *pBootTitle) +static BOOL SYSMi_AuthenticateNTRNandTitle( TitleProperty *pBootTitle) { return SYSMi_AuthenticateTWLTitle( pBootTitle ); } // NTR版ダウンロードアプリ(TMPアプリ)のヘッダ認証処理 -static AuthResult SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTitle, ROM_Header *head ) +static BOOL SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTitle, ROM_Header *head ) { #pragma unused(pBootTitle, head) // [TODO:]署名はstaticに絡んでくるので、それ以外にヘッダ認証処理があれば - return AUTH_RESULT_SUCCEEDED; + return TRUE; } // NTR版ダウンロードアプリ(TMPアプリ)の認証 -static AuthResult SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle) +static BOOL SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle) { #pragma unused(pBootTitle) ROM_Header *head; @@ -1355,7 +1369,8 @@ static AuthResult SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle) // NTRダウンロードアプリ署名のマジックコードチェック if( s_authcode.magic_code[0] != 'a' || s_authcode.magic_code[1] != 'c' ) { OS_TPrintf("Authenticate failed: Invalid AuthCode.\n"); - return AUTH_RESULT_DL_MAGICCODE_CHECK_FAILED; + UTL_SetFatalError(FATAL_ERROR_DL_MAGICCODE_CHECK_FAILED); + return FALSE; } // NTRダウンロードアプリ署名(DERフォーマット)の計算、ハッシュの取得。 @@ -1364,7 +1379,8 @@ static AuthResult SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle) if( !SVC_DecryptSignDER( &con, buf, s_authcode.sign, nitro_dl_sign_key )) { OS_TPrintf("Authenticate failed: Sign decryption failed.\n"); - return AUTH_RESULT_DL_SIGN_DECRYPTION_FAILED; + UTL_SetFatalError(FATAL_ERROR_DL_SIGN_DECRYPTION_FAILED); + return FALSE; } // それぞれheader,ARM9FLX,ARM7FLXについてハッシュを計算して、それら3つを並べたものに対してまたハッシュをとる @@ -1377,14 +1393,16 @@ static AuthResult SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle) }else { OS_TPrintf("Authenticate failed: hash calc failed.\n"); - return AUTH_RESULT_DL_HASH_CALC_FAILED; + UTL_SetFatalError(FATAL_ERROR_DL_HASH_CALC_FAILED); + return FALSE; } // 計算した最終ハッシュと、署名から得たハッシュとを比較 if(!SVC_CompareSHA1((const void *)buf, (const void *)final_hash)) { OS_TPrintf("Authenticate failed: hash check failed.\n"); - return AUTH_RESULT_DL_SIGN_COMPARE_FAILED; + UTL_SetFatalError(FATAL_ERROR_DL_SIGN_COMPARE_FAILED); + return FALSE; }else { OS_TPrintf("Authenticate : hash check succeed.\n"); @@ -1392,7 +1410,7 @@ static AuthResult SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle) } OS_TPrintf("Authenticate : total %d ms.\n", OS_TicksToMilliSeconds(OS_GetTick() - start) ); - return AUTH_RESULT_SUCCEEDED; + return TRUE; } BOOL SYSM_IsLoadTitlePaused(void) @@ -1415,21 +1433,21 @@ void SYSM_ResumeLoadingThread( BOOL force ) } // NTR版カードアプリのヘッダ認証処理 -static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, ROM_Header *head ) +static BOOL SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, ROM_Header *head ) { - AuthResult ret = AUTH_RESULT_SUCCEEDED; + BOOL ret = TRUE; // デバッガに接続してるときは適用しない if( SYSM_IsRunOnDebugger() ) { - return AUTH_RESULT_SUCCEEDED; + return TRUE; } if( head->s.exFlags.enable_nitro_whitelist_signature ) { // マスタリング済みNTRカードアプリの署名チェック(実はTWLアプリと同じ) ret = SYSMi_AuthenticateHeaderWithSign( pBootTitle, head ); - if( ret == AUTH_RESULT_SUCCEEDED ) + if( ret == TRUE ) { hash0 = head->s.nitro_whitelist_phase1_digest; hash1 = head->s.nitro_whitelist_phase2_diegst; @@ -1442,7 +1460,8 @@ static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, if(!dht) { OS_TPrintf(" Search DHT : database init Failed.\n"); - ret = AUTH_RESULT_WHITELIST_INITDB_FAILED; + UTL_SetFatalError(FATAL_ERROR_WHITELIST_INITDB_FAILED); + ret = FALSE; }else { OS_TPrintf("Searching DHT for %.4s(%02X)...", head->s.game_code, head->s.rom_version); @@ -1450,12 +1469,13 @@ static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, if ( !db ) { OS_TPrintf(" Search DHT : Failed.\n"); - ret = AUTH_RESULT_WHITELIST_NOTFOUND; + UTL_SetFatalError(FATAL_ERROR_WHITELIST_NOTFOUND); + ret = FALSE; }else { hash0 = db->hash[0]; hash1 = db->hash[1]; - ret = AUTH_RESULT_SUCCEEDED; + ret = TRUE; } } } @@ -1471,7 +1491,7 @@ static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, // 押されたらメインスレッドからこちらのスレッドにメッセージを送る // メッセージ内容次第でロードを続行するか、エラーを返して中止するか選択 // 続行する場合は強制実行フラグを立てる - if( ret != AUTH_RESULT_SUCCEEDED ) + if( ret != TRUE ) { BOOL forcing; OS_InitMessageQueue(&s_msgQ, s_msgArray, SYSM_TITLE_MESSAGE_ARRAY_MAX); @@ -1479,7 +1499,7 @@ static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, OS_ReceiveMessage(&s_msgQ, (OSMessage*)&forcing, OS_MESSAGE_BLOCK); if(forcing) { - ret = AUTH_RESULT_SUCCEEDED; + ret = TRUE; s_loadForcibly = TRUE; } } @@ -1488,7 +1508,7 @@ static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, } // NTR版カードアプリの認証 -static AuthResult SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle) +static BOOL SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle) { #pragma unused(pBootTitle) DHTPhase2Work* p2work; @@ -1497,13 +1517,13 @@ static AuthResult SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle) // デバッガに接続してるときは適用しない if( SYSM_IsRunOnDebugger() ) { - return AUTH_RESULT_SUCCEEDED; + return TRUE; } // ロード前認証で強制実行フラグを立てていれば、飛ばす if( s_loadForcibly ) { - return AUTH_RESULT_SUCCEEDED; + return TRUE; } // phase1最終検証 @@ -1513,7 +1533,10 @@ static AuthResult SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle) if(!SVC_CompareSHA1((const void *)hash0, (const void *)&s_calc_hash[1 * SVC_SHA1_DIGEST_SIZE])) { OS_TPrintf("DHT Phase1 failed: hash check failed.\n"); - if(!s_b_dev) return AUTH_RESULT_DHT_PHASE1_FAILED; + if(!s_b_dev) { + UTL_SetFatalError(FATAL_ERROR_DHT_PHASE1_FAILED); + return FALSE; + } }else { OS_TPrintf("DHT Phase1 : hash check succeed..\n"); @@ -1521,7 +1544,10 @@ static AuthResult SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle) }else { OS_TPrintf("DHT Phase1 failed: hash calc failed.\n"); - if(!s_b_dev) return AUTH_RESULT_DHT_PHASE1_FAILED; + if(!s_b_dev) { + UTL_SetFatalError(FATAL_ERROR_DHT_PHASE1_FAILED); + return FALSE; + } } // DHTチェックphase2 @@ -1531,15 +1557,18 @@ static AuthResult SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle) { OS_TPrintf(" DHT Phase2 : Failed.\n"); SYSM_Free(p2work); - return AUTH_RESULT_DHT_PHASE2_FAILED; + if(!s_b_dev){ + UTL_SetFatalError(FATAL_ERROR_DHT_PHASE2_FAILED); + return FALSE; + } } SYSM_Free(p2work); - return AUTH_RESULT_SUCCEEDED; + return TRUE; } // ヘッダ認証 -static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Header *head ) +static BOOL SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Header *head ) { ROM_Header_Short *hs = ( ROM_Header_Short *)head; // [TODO:]認証結果はどこかワークに保存しておく? @@ -1560,11 +1589,13 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Heade if (!hs->permit_landing_tmp_jump) { OS_TPrintf("Authenticate failed: TMP flag error.\n"); - return AUTH_RESULT_LANDING_TMP_JUMP_FLAG_OFF; + UTL_SetFatalError(FATAL_ERROR_LANDING_TMP_JUMP_FLAG_OFF); + return FALSE; } return SYSMi_AuthenticateTWLHeader( pBootTitle, head ); default: - return AUTH_RESULT_TWL_BOOTTYPE_UNKNOWN; + UTL_SetFatalError(FATAL_ERROR_TWL_BOOTTYPE_UNKNOWN); + return FALSE; } } else @@ -1573,7 +1604,8 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Heade { // TWLでもNTRでもない不正なアプリ OS_TPrintf( "Authenticate_Header failed :NOT NTR NOT TWL.\n" ); - return AUTH_RESULT_PLATFORM_UNKNOWN; + UTL_SetFatalError(FATAL_ERROR_PLATFORM_UNKNOWN); + return FALSE; } // NTRアプリ switch( pBootTitle->flags.bootType ) @@ -1586,20 +1618,22 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Heade if (!hs->permit_landing_tmp_jump) { OS_TPrintf("Authenticate_Header failed : TMP flag error.\n"); - return AUTH_RESULT_LANDING_TMP_JUMP_FLAG_OFF; + UTL_SetFatalError(FATAL_ERROR_LANDING_TMP_JUMP_FLAG_OFF); + return FALSE; } return SYSMi_AuthenticateNTRDownloadAppHeader( pBootTitle, head ); case LAUNCHER_BOOTTYPE_ROM: OS_TPrintf( "Authenticate_Header :NTR_ROM start.\n" ); return SYSMi_AuthenticateNTRCardAppHeader( pBootTitle, head ); default: - return AUTH_RESULT_NTR_BOOTTYPE_UNKNOWN; + UTL_SetFatalError(FATAL_ERROR_NTR_BOOTTYPE_UNKNOWN); + return FALSE; } } } // 認証 -static AuthResult SYSMi_AuthenticateTitleCore( TitleProperty *pBootTitle) +static BOOL SYSMi_AuthenticateTitleCore( TitleProperty *pBootTitle) { ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF; // [TODO:]認証結果はどこかワークに保存しておく? @@ -1620,11 +1654,13 @@ static AuthResult SYSMi_AuthenticateTitleCore( TitleProperty *pBootTitle) if (!hs->permit_landing_tmp_jump) { OS_TPrintf("Authenticate failed: TMP flag error.\n"); - return AUTH_RESULT_LANDING_TMP_JUMP_FLAG_OFF; + UTL_SetFatalError(FATAL_ERROR_LANDING_TMP_JUMP_FLAG_OFF); + return FALSE; } return SYSMi_AuthenticateTWLTitle( pBootTitle ); default: - return AUTH_RESULT_TWL_BOOTTYPE_UNKNOWN; + UTL_SetFatalError(FATAL_ERROR_TWL_BOOTTYPE_UNKNOWN); + return FALSE; } } else @@ -1633,7 +1669,8 @@ static AuthResult SYSMi_AuthenticateTitleCore( TitleProperty *pBootTitle) { // TWLでもNTRでもない不正なアプリ OS_TPrintf( "Authenticate :NOT NTR NOT TWL.\n" ); - return AUTH_RESULT_PLATFORM_UNKNOWN; + UTL_SetFatalError(FATAL_ERROR_PLATFORM_UNKNOWN); + return FALSE; } // NTRアプリ switch( pBootTitle->flags.bootType ) @@ -1646,14 +1683,16 @@ static AuthResult SYSMi_AuthenticateTitleCore( TitleProperty *pBootTitle) if (!hs->permit_landing_tmp_jump) { OS_TPrintf("Authenticate failed: TMP flag error.\n"); - return AUTH_RESULT_LANDING_TMP_JUMP_FLAG_OFF; + UTL_SetFatalError(FATAL_ERROR_LANDING_TMP_JUMP_FLAG_OFF); + return FALSE; } return SYSMi_AuthenticateNTRDownloadTitle( pBootTitle ); case LAUNCHER_BOOTTYPE_ROM: OS_TPrintf( "Authenticate :NTR_ROM start.\n" ); return SYSMi_AuthenticateNTRCardTitle( pBootTitle ); default: - return AUTH_RESULT_NTR_BOOTTYPE_UNKNOWN; + UTL_SetFatalError(FATAL_ERROR_NTR_BOOTTYPE_UNKNOWN); + return FALSE; } } } @@ -1663,24 +1702,24 @@ static void SYSMi_AuthenticateTitleThreadFunc( TitleProperty *pBootTitle ) { // ロード中 if( !SYSM_IsLoadTitleFinished() ) { - s_authResult = AUTH_RESULT_PROCESSING; + UTL_SetFatalError(FATAL_ERROR_LOAD_UNFINISHED); return; } // ロード成功? if( SYSMi_GetWork()->flags.common.isLoadSucceeded == FALSE ) { - s_authResult = (s_headerAuthResult == AUTH_RESULT_SUCCEEDED) ? AUTH_RESULT_TITLE_LOAD_FAILED : s_headerAuthResult; + UTL_SetFatalError(FATAL_ERROR_TITLE_LOAD_FAILED); return; } // パラメータチェック if( !SYSMi_CheckTitlePointer( pBootTitle ) ) { - s_authResult = AUTH_RESULT_TITLE_POINTER_ERROR; + UTL_SetFatalError(FATAL_ERROR_TITLE_POINTER_ERROR); return; } #if 0 // エントリアドレスの正当性をチェック if( !SYSMi_CheckEntryAddress() ) { - s_authResult = AUTH_RESULT_ENTRY_ADDRESS_ERROR; + UTL_SetFatalError(FATAL_ERROR_ENTRY_ADDRESS_ERROR); return; } #endif @@ -1691,12 +1730,12 @@ static void SYSMi_AuthenticateTitleThreadFunc( TitleProperty *pBootTitle ) ( ( (( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF)->platform_code ) == 0 ) && ( ( (( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF)->fat_size ) > 0 ) ) { - s_authResult = AUTH_RESULT_TITLE_BOOTTYPE_ERROR; + UTL_SetFatalError(FATAL_ERROR_TITLE_BOOTTYPE_ERROR); return; } // 認証 - s_authResult = SYSMi_AuthenticateTitleCore( pBootTitle ); + (void)SYSMi_AuthenticateTitleCore( pBootTitle ); } @@ -1705,7 +1744,6 @@ static void SYSMi_AuthenticateTitleThreadFunc( TitleProperty *pBootTitle ) void SYSM_StartAuthenticateTitle( TitleProperty *pBootTitle ) { static u64 stack[ AUTH_STACK_SIZE / sizeof(u64) ]; - s_authResult = AUTH_RESULT_PROCESSING; OS_InitThread(); OS_CreateThread( &s_auth_thread, (void (*)(void *))SYSMi_AuthenticateTitleThreadFunc, (void*)pBootTitle, stack+AUTH_STACK_SIZE/sizeof(u64), AUTH_STACK_SIZE,THREAD_PRIO ); OS_WakeupThreadDirect( &s_auth_thread ); @@ -1714,21 +1752,13 @@ void SYSM_StartAuthenticateTitle( TitleProperty *pBootTitle ) // 検証済み? BOOL SYSM_IsAuthenticateTitleFinished( void ) { - if(s_authResult == AUTH_RESULT_SUCCEEDED) - { - return TRUE; - } return OS_IsThreadTerminated( &s_auth_thread ); } // ロード済みの指定タイトルの認証とブートを行う // SYSM_GetNandTitleListまたはSYSM_GetNandTitleListMakerInfoのどちらかをSYSM_TryToBootTitle前に呼ぶ必要あり -AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle ) +void SYSM_TryToBootTitle( TitleProperty *pBootTitle ) { - if(s_authResult != AUTH_RESULT_SUCCEEDED) - { - return s_authResult; - } if(s_calc_hash) { @@ -1769,7 +1799,6 @@ AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle ) BOOT_Ready(); // never return. - return AUTH_RESULT_SUCCEEDED; } // タイトルIDリストの作成 @@ -1945,20 +1974,6 @@ BOOL SYSM_MakeTitleListMakerInfoFromHeader( TitleListMakerInfo *info, ROM_Header } -#if 0 -// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。 -// もしかすると使わないかも -void SYSM_LoadAndAuthenticateTitleThread( TitleProperty *pBootTitle ) -{ - SYSMi_LoadTitleThreadFunc( pBootTitle ); - OS_JoinThread(&s_thread); - - // 認証 - return SYSM_AuthenticateTitle( pBootTitle ); -} -#endif - - // 指定タイトルがブート可能なポインタかチェック static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle ) { diff --git a/build/libraries_sysmenu/util/ARM9/src/util.c b/build/libraries_sysmenu/util/ARM9/src/util.c index 7bb114c2..5b65934f 100644 --- a/build/libraries_sysmenu/util/ARM9/src/util.c +++ b/build/libraries_sysmenu/util/ARM9/src/util.c @@ -25,7 +25,7 @@ // extern data------------------------------------------ // function's prototype declaration--------------------- static s64 UTLi_CalcRTCSecOffset( RTCDate *datep, RTCTime *timep ); -static u32 s_fatalError = 0; +static u64 s_fatalError = 0; // global variable ------------------------------------- // static variable ------------------------------------- @@ -280,7 +280,7 @@ BOOL UTL_IsFatalError( void ) // FATALエラーコード取得 -u32 UTL_GetFatalError( void ) +u64 UTL_GetFatalError( void ) { return s_fatalError; } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index 3aa09138..2887576a 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -41,7 +41,7 @@ static void deleteTmp(); void SYSM_DeleteTempDirectory( TitleProperty *pBootTitle ); static BOOL IsCommandSelected(void); static void PrintPause(void); -static void PrintError(AuthResult res); +static void PrintError(void); // global variable------------------------------------------------------------- @@ -56,10 +56,16 @@ static StreamInfo s_strm; // stream info const char filename[] = "data/fanfare.32.wav"; -static const char *error_msg[AUTH_RESULT_MAX] = +static const char *fatal_error_msg[FATAL_ERROR_MAX] = { - "SUCCEEDED", - "PROCESSING", + "UNDEFINED", + "NAND", + "HWINFO_NORMAL", + "HWINFO_SECURE", + "TWLSETTINGS", + "SHARED_FONT", + "WLANFIRM_AUTH", + "WLANFIRM_LOAD", "TITLE_LOAD_FAILED", "TITLE_POINTER_ERROR", "AUTHENTICATE_FAILED", @@ -85,7 +91,8 @@ static const char *error_msg[AUTH_RESULT_MAX] = "LANDING_TMP_JUMP_FLAG_OFF", "TWL_BOOTTYPE_UNKNOWN", "NTR_BOOTTYPE_UNKNOWN", - "PLATFORM_UNKNOWN" + "PLATFORM_UNKNOWN", + "LOAD_UNFINISHED" }; //#define DEBUG_LAUNCHER_DUMP @@ -263,7 +270,11 @@ void TwlMain( void ) if( UTL_IsFatalError() ) { // FATALエラー処理 + PrintError(); // エラー表示 + state = STOP; + goto MAIN_LOOP_START; // state を STOP にして強制的にメインループ開始 } + if( !LCFG_TSD_IsFinishedInitialSetting_Launcher() ) { // ランチャー内での初回起動シーケンス中なら、写真撮影を実行するようにする。 // ※本体設定内での初会起動シーケンス中の場合は、SYSM_ReadParameters 内のチェックで検出されて、本体設定が起動されるようになっています。 @@ -406,6 +417,9 @@ void TwlMain( void ) if( UTL_IsFatalError() ) { // FATALエラー処理 + PrintError(); // エラー表示 + state = STOP; + goto MAIN_LOOP_START; // state を STOP にして強制的にメインループ開始 } // end 時間計測total @@ -413,6 +427,8 @@ void TwlMain( void ) OS_TPrintf( "Total Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - allstart ) ); #endif +MAIN_LOOP_START: + // メインループ-------------------- while( 1 ) { OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち @@ -438,11 +454,6 @@ void TwlMain( void ) case LOGODEMO: if( LogoMain() && IsFinishedLoadSharedFont() ) { // フォントロード終了をここでチェック -#if 0 - if( UTL_IsFatalError() ) { - state = STOP; - }else -#endif if( !direct_boot ) { state = LAUNCHER_INIT; }else { @@ -504,26 +515,16 @@ void TwlMain( void ) #endif // DISABLE_WLFIRM_LOAD SYSM_IsAuthenticateTitleFinished() ) { - AuthResult res; + // メインループ開始から検証終了までの間に起きたFATALの処理 if( UTL_IsFatalError() ) { // FATALエラー処理 + // [TODO:]クリアしたほうが良いデータ(鍵など)があれば消す + PrintError(); // エラー表示 + state = STOP; + break; // state を STOP にして break し、 Boot させない } - res = SYSM_TryToBootTitle( pBootTitle ); - switch ( res ) { // アプリ認証結果取得orブート 成功時:never return - case AUTH_RESULT_TITLE_LOAD_FAILED: - case AUTH_RESULT_TITLE_POINTER_ERROR: - case AUTH_RESULT_AUTHENTICATE_FAILED: - case AUTH_RESULT_ENTRY_ADDRESS_ERROR: - default: - state = STOP; - // [TODO:]クリアしたほうが良いデータ(鍵など)があれば消す - - // エラー表示 - PrintError(res); - - break; - } + SYSM_TryToBootTitle( pBootTitle ); // never return. } break; case STOP: // 停止 @@ -587,18 +588,25 @@ static void PrintPause(void) GXS_DispOn(); } -static void PrintError(AuthResult res) +static void PrintError( void ) { + u64 error_code; + int l; + int count = 0; 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) + error_code = UTL_GetFatalError(); + PrintfSJIS( 2, 25, TXT_COLOR_RED,"ERROR! - 0x%0.16x\n", error_code ); + for(l=0;l<64;l++) { - PrintfSJIS( 1, 55, TXT_COLOR_RED,"NAM result = %d", SYSMi_getCheckTitleLaunchRightsResult() ); + if( error_code & 0x1 ) + { + PrintfSJIS( 2, 50+count*13, TXT_COLOR_RED,"%s\n", fatal_error_msg[l] ); + count++; + } + error_code = error_code >> 1; } GX_DispOn(); GXS_DispOn(); diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h index 6ad8e372..b5e09d14 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h @@ -76,40 +76,6 @@ typedef struct TitleListMakerInfo { TitleInfoSub sub_info; }TitleListMakerInfo; -// アプリ認証結果 -typedef enum AuthResult { - AUTH_RESULT_SUCCEEDED = 0, - AUTH_RESULT_PROCESSING = 1, - AUTH_RESULT_TITLE_LOAD_FAILED = 2, - AUTH_RESULT_TITLE_POINTER_ERROR = 3, - AUTH_RESULT_AUTHENTICATE_FAILED = 4, - AUTH_RESULT_ENTRY_ADDRESS_ERROR = 5, - AUTH_RESULT_TITLE_BOOTTYPE_ERROR = 6, - AUTH_RESULT_SIGN_DECRYPTION_FAILED = 7, - AUTH_RESULT_SIGN_COMPARE_FAILED = 8, - AUTH_RESULT_HEADER_HASH_CALC_FAILED = 9, - AUTH_RESULT_TITLEID_COMPARE_FAILED = 10, - AUTH_RESULT_VALID_SIGN_FLAG_OFF = 11, - AUTH_RESULT_CHECK_TITLE_LAUNCH_RIGHTS_FAILED = 12, - AUTH_RESULT_MODULE_HASH_CHECK_FAILED = 13, - AUTH_RESULT_MODULE_HASH_CALC_FAILED = 14, - AUTH_RESULT_MEDIA_CHECK_FAILED = 15, - AUTH_RESULT_DL_MAGICCODE_CHECK_FAILED = 16, - AUTH_RESULT_DL_SIGN_DECRYPTION_FAILED = 17, - AUTH_RESULT_DL_HASH_CALC_FAILED = 18, - AUTH_RESULT_DL_SIGN_COMPARE_FAILED = 19, - AUTH_RESULT_WHITELIST_INITDB_FAILED = 20, - AUTH_RESULT_WHITELIST_NOTFOUND = 21, - AUTH_RESULT_DHT_PHASE1_FAILED = 22, - AUTH_RESULT_DHT_PHASE2_FAILED = 23, - AUTH_RESULT_LANDING_TMP_JUMP_FLAG_OFF = 24, - AUTH_RESULT_TWL_BOOTTYPE_UNKNOWN = 25, - AUTH_RESULT_NTR_BOOTTYPE_UNKNOWN = 26, - AUTH_RESULT_PLATFORM_UNKNOWN = 27, - - AUTH_RESULT_MAX = 28 -}AuthResult; - // global variable------------------------------------------------------ #ifdef SDK_ARM9 @@ -145,7 +111,7 @@ extern void SYSM_StartLoadTitle( TitleProperty *pBootTitle ); // extern BOOL SYSM_IsLoadTitleFinished( void ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認 extern void SYSM_StartAuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドで検証開始 extern BOOL SYSM_IsAuthenticateTitleFinished( void ); // SYSM_StartAuthenticateTitleで起動したスレッドが終了したかどうかを確認 -extern AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle ); // pBootTitleで指定したタイトルをブート。成功時は、never return. +extern void SYSM_TryToBootTitle( TitleProperty *pBootTitle ); // pBootTitleで指定したタイトルをブート。never return. // AES領域デクリプト extern void SYSM_StartDecryptAESRegion( ROM_Header_Short *hs ); // 起動するROMのAES暗号化領域のデクリプト開始 diff --git a/include/sysmenu/util.h b/include/sysmenu/util.h index 62a0d0c1..51d6176c 100644 --- a/include/sysmenu/util.h +++ b/include/sysmenu/util.h @@ -37,7 +37,35 @@ typedef enum FatalErrorCode { FATAL_ERROR_SHARED_FONT = 5, FATAL_ERROR_WLANFIRM_AUTH = 6, FATAL_ERROR_WLANFIRM_LOAD = 7, - FATAL_ERROR_MAX = 8 + FATAL_ERROR_TITLE_LOAD_FAILED = 8, + FATAL_ERROR_TITLE_POINTER_ERROR = 9, + FATAL_ERROR_AUTHENTICATE_FAILED = 10, + FATAL_ERROR_ENTRY_ADDRESS_ERROR = 11, + FATAL_ERROR_TITLE_BOOTTYPE_ERROR = 12, + FATAL_ERROR_SIGN_DECRYPTION_FAILED = 13, + FATAL_ERROR_SIGN_COMPARE_FAILED = 14, + FATAL_ERROR_HEADER_HASH_CALC_FAILED = 15, + FATAL_ERROR_TITLEID_COMPARE_FAILED = 16, + FATAL_ERROR_VALID_SIGN_FLAG_OFF = 17, + FATAL_ERROR_CHECK_TITLE_LAUNCH_RIGHTS_FAILED = 18, + FATAL_ERROR_MODULE_HASH_CHECK_FAILED = 19, + FATAL_ERROR_MODULE_HASH_CALC_FAILED = 20, + FATAL_ERROR_MEDIA_CHECK_FAILED = 21, + FATAL_ERROR_DL_MAGICCODE_CHECK_FAILED = 22, + FATAL_ERROR_DL_SIGN_DECRYPTION_FAILED = 23, + FATAL_ERROR_DL_HASH_CALC_FAILED = 24, + FATAL_ERROR_DL_SIGN_COMPARE_FAILED = 25, + FATAL_ERROR_WHITELIST_INITDB_FAILED = 26, + FATAL_ERROR_WHITELIST_NOTFOUND = 27, + FATAL_ERROR_DHT_PHASE1_FAILED = 28, + FATAL_ERROR_DHT_PHASE2_FAILED = 29, + FATAL_ERROR_LANDING_TMP_JUMP_FLAG_OFF = 30, + FATAL_ERROR_TWL_BOOTTYPE_UNKNOWN = 31, + FATAL_ERROR_NTR_BOOTTYPE_UNKNOWN = 32, + FATAL_ERROR_PLATFORM_UNKNOWN = 33, + FATAL_ERROR_LOAD_UNFINISHED = 34, + + FATAL_ERROR_MAX = 35 }FatalErrorCode; @@ -79,7 +107,7 @@ static inline BOOL UTL_IsROMHeaderEULARequired( void ) // FATALエラー extern BOOL UTL_IsFatalError( void ); // FATALエラーか? extern void UTL_SetFatalError( FatalErrorCode error ); // FATALエラーのセット -extern u32 UTL_GetFatalError( void ); // FATALエラー状態の取得(FatalErrorCodeをビットに割り当てて格納しています。) +extern u64 UTL_GetFatalError( void ); // FATALエラー状態の取得(FatalErrorCodeをビットに割り当てて格納しています。) #ifdef __cplusplus