検証エラー関係をFATALエラーに統合

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1711 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-06-26 04:33:13 +00:00
parent 7c253ad533
commit fb30a18538
5 changed files with 178 additions and 161 deletions

View File

@ -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 )
{

View File

@ -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;
}

View File

@ -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();

View File

@ -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暗号化領域のデクリプト開始

View File

@ -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