エラー表示の強化

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1479 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-05-23 01:11:03 +00:00
parent 9a90633b51
commit 3ffb5057a7
4 changed files with 97 additions and 33 deletions

View File

@ -972,23 +972,23 @@ 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_AUTHENTICATE_FAILED;
if(!s_b_dev) return AUTH_RESULT_SIGN_DECRYPTION_FAILED;
}
if(s_calc_hash)
{
// 署名のハッシュ値とヘッダのハッシュ値を比較
if(!SVC_CompareSHA1(sigbuf.digest, (const void *)&s_calc_hash[0]))
{
OS_TPrintf("Authenticate_Header failed: Sign check failed.\n");
if(!s_b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED;
OS_TPrintf("Authenticate_Header failed: Sign compare failed.\n");
if(!s_b_dev) return AUTH_RESULT_SIGN_COMPARE_FAILED;
}else
{
OS_TPrintf("Authenticate_Header : Sign check succeed. %dms.\n", OS_TicksToMilliSeconds(OS_GetTick() - prev));
}
}else
{
OS_TPrintf("Authenticate_Header failed: Sign calc failed.\n");
if(!s_b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED;
OS_TPrintf("Authenticate_Header failed: Header Hash calc failed.\n");
if(!s_b_dev) return AUTH_RESULT_HEADER_HASH_CALC_FAILED;
}
OS_TPrintf("Authenticate_Header : total %d ms.\n", OS_TicksToMilliSeconds(OS_GetTick() - start) );
@ -1006,7 +1006,7 @@ 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_AUTHENTICATE_FAILED;
return AUTH_RESULT_TITLEID_COMPARE_FAILED;
}else
{
OS_TPrintf( "Authenticate_Header : header TitleID check succeed.\n" );
@ -1019,7 +1019,7 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle, ROM_He
{
// 署名有効フラグが立っていない 且つ デバッガが有効でTLFを読み込んでいるのでなければFAILED
OS_TPrintf("Authenticate_Header failed: Sign check flag is OFF!\n");
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_VALID_SIGN_FLAG_OFF;
}
}
@ -1039,7 +1039,7 @@ static AuthResult SYSMi_AuthenticateTWLTitle( TitleProperty *pBootTitle )
if( NAM_OK != result)
{
OS_TPrintf("Authenticate failed: NAM_CheckTitleLaunchRights failed. %d \n",result);
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_CHECK_TITLE_LAUNCH_RIGHTS_FAILED;
}else
{
OS_TPrintf("Authenticate : NAM_CheckTitleLaunchRights succeed. %d ms.\n", OS_TicksToMilliSeconds(OS_GetTick() - start) );
@ -1087,7 +1087,7 @@ 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_AUTHENTICATE_FAILED;
if(!s_b_dev) return AUTH_RESULT_MODULE_HASH_CHECK_FAILED;
}else
{
OS_TPrintf("Authenticate : %s module hash check succeed. %dms.\n", str[l], OS_TicksToMilliSeconds(OS_GetTick() - prev));
@ -1095,7 +1095,7 @@ 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_AUTHENTICATE_FAILED;
if(!s_b_dev) return AUTH_RESULT_MODULE_HASH_CALC_FAILED;
}
}
}
@ -1108,7 +1108,7 @@ 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_AUTHENTICATE_FAILED;
return AUTH_RESULT_MEDIA_CHECK_FAILED;
}
}
@ -1156,7 +1156,7 @@ 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_AUTHENTICATE_FAILED;
return AUTH_RESULT_DL_MAGICCODE_CHECK_FAILED;
}
// NTRダウンロードアプリ署名DERフォーマットの計算、ハッシュの取得。
@ -1165,7 +1165,7 @@ 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_AUTHENTICATE_FAILED;
return AUTH_RESULT_DL_SIGN_DECRYPTION_FAILED;
}
// それぞれheader,ARM9FLX,ARM7FLXについてハッシュを計算して、それら3つを並べたものに対してまたハッシュをとる
@ -1177,15 +1177,15 @@ static AuthResult SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle)
SVC_CalcSHA1( final_hash, s_calc_hash, SVC_SHA1_DIGEST_SIZE * 3 + sizeof(u32));
}else
{
OS_TPrintf("Authenticate failed: hash check failed.\n");
return AUTH_RESULT_AUTHENTICATE_FAILED;
OS_TPrintf("Authenticate failed: hash calc failed.\n");
return AUTH_RESULT_DL_HASH_CALC_FAILED;
}
// 計算した最終ハッシュと、署名から得たハッシュとを比較
if(!SVC_CompareSHA1((const void *)buf, (const void *)final_hash))
{
OS_TPrintf("Authenticate failed: hash check failed.\n");
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_DL_SIGN_COMPARE_FAILED;
}else
{
OS_TPrintf("Authenticate : hash check succeed.\n");
@ -1224,14 +1224,14 @@ static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle,
if(!dht)
{
OS_TPrintf(" Search DHT : database init Failed.\n");
return AUTH_RESULT_AUTHENTICATE_FAILED;
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 )
{
OS_TPrintf(" Search DHT : Failed.\n");
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_WHITELIST_NOTFOUND;
}
hash0 = db->hash[0];
hash1 = db->hash[1];
@ -1262,7 +1262,7 @@ static AuthResult SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle)
if ( !DHT_CheckHashPhase1Final(&ctx, hash0) )
{
OS_TPrintf(" DHT Phase1 : Failed.\n");
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_DHT_PHASE1_FAILED;
}
// DHTチェックphase2phase1はstaticの読み込み時に平行処理
@ -1272,7 +1272,7 @@ static AuthResult SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle)
{
OS_TPrintf(" DHT Phase2 : Failed.\n");
SYSM_Free(p2work);
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_DHT_PHASE2_FAILED;
}
SYSM_Free(p2work);
@ -1301,11 +1301,11 @@ 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_AUTHENTICATE_FAILED;
return AUTH_RESULT_LANDING_TMP_JUMP_FLAG_OFF;
}
return SYSMi_AuthenticateTWLHeader( pBootTitle, head );
default:
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_TWL_BOOTTYPE_UNKNOWN;
}
}
else
@ -1314,7 +1314,7 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Heade
{
// TWLでもNTRでもない不正なアプリ
OS_TPrintf( "Authenticate_Header failed :NOT NTR NOT TWL.\n" );
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_PLATFORM_UNKNOWN;
}
// NTRアプリ
switch( pBootTitle->flags.bootType )
@ -1327,14 +1327,14 @@ 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_AUTHENTICATE_FAILED;
return AUTH_RESULT_LANDING_TMP_JUMP_FLAG_OFF;
}
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_AUTHENTICATE_FAILED;
return AUTH_RESULT_NTR_BOOTTYPE_UNKNOWN;
}
}
}
@ -1361,11 +1361,11 @@ static AuthResult SYSMi_AuthenticateTitleCore( TitleProperty *pBootTitle)
if (!hs->permit_landing_tmp_jump)
{
OS_TPrintf("Authenticate failed: TMP flag error.\n");
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_LANDING_TMP_JUMP_FLAG_OFF;
}
return SYSMi_AuthenticateTWLTitle( pBootTitle );
default:
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_TWL_BOOTTYPE_UNKNOWN;
}
}
else
@ -1374,7 +1374,7 @@ static AuthResult SYSMi_AuthenticateTitleCore( TitleProperty *pBootTitle)
{
// TWLでもNTRでもない不正なアプリ
OS_TPrintf( "Authenticate :NOT NTR NOT TWL.\n" );
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_PLATFORM_UNKNOWN;
}
// NTRアプリ
switch( pBootTitle->flags.bootType )
@ -1387,14 +1387,14 @@ static AuthResult SYSMi_AuthenticateTitleCore( TitleProperty *pBootTitle)
if (!hs->permit_landing_tmp_jump)
{
OS_TPrintf("Authenticate failed: TMP flag error.\n");
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_LANDING_TMP_JUMP_FLAG_OFF;
}
return SYSMi_AuthenticateNTRDownloadTitle( pBootTitle );
case LAUNCHER_BOOTTYPE_ROM:
OS_TPrintf( "Authenticate :NTR_ROM start.\n" );
return SYSMi_AuthenticateNTRCardTitle( pBootTitle );
default:
return AUTH_RESULT_AUTHENTICATE_FAILED;
return AUTH_RESULT_NTR_BOOTTYPE_UNKNOWN;
}
}
}

View File

@ -112,6 +112,8 @@ static fx32 s_selected_banner_size;
static BOOL s_wavstop = FALSE;
static BannerCounter banner_counter[LAUNCHER_TITLE_LIST_NUM];
static BOOL s_launcher_initialized = FALSE;
//static StreamInfo strm; // stream info
// const data -----------------------------------------
@ -385,7 +387,12 @@ static void BannerDraw(int selected, TitleProperty *titleprop)
void LauncherInit( TitleProperty *pTitleList )
{
#pragma unused( pTitleList )
if(s_launcher_initialized)
{
return;
}
s_launcher_initialized = TRUE;
InitBG(); // BG<42>‰Šú‰»
GX_DispOff();

View File

@ -45,6 +45,38 @@ static StreamInfo s_strm; // stream info
const char filename[] = "data/fanfare.32.wav";
static const char *error_msg[AUTH_RESULT_MAX] =
{
"SUCCEEDED",
"PROCESSING",
"TITLE_LOAD_FAILED",
"TITLE_POINTER_ERROR",
"AUTHENTICATE_FAILED",
"ENTRY_ADDRESS_ERROR",
"TITLE_BOOTTYPE_ERROR",
"SIGN_DECRYPTION_FAILED",
"SIGN_COMPARE_FAILED",
"HEADER_HASH_CALC_FAILED",
"TITLEID_COMPARE_FAILED",
"VALID_SIGN_FLAG_OFF",
"CHECK_TITLE_LAUNCH_RIGHTS_FAILED",
"MODULE_HASH_CHECK_FAILED",
"MODULE_HASH_CALC_FAILED",
"MEDIA_CHECK_FAILED",
"DL_MAGICCODE_CHECK_FAILED",
"DL_SIGN_DECRYPTION_FAILED",
"DL_HASH_CALC_FAILED",
"DL_SIGN_COMPARE_FAILED",
"WHITELIST_INITDB_FAILED",
"WHITELIST_NOTFOUND",
"DHT_PHASE1_FAILED",
"DHT_PHASE2_FAILED",
"LANDING_TMP_JUMP_FLAG_OFF",
"TWL_BOOTTYPE_UNKNOWN",
"NTR_BOOTTYPE_UNKNOWN",
"PLATFORM_UNKNOWN"
};
//#define DEBUG_LAUNCHER_DUMP
#ifdef DEBUG_LAUNCHER_DUMP
// デバグ用。SDに0x02ffc000から0x02ffe000までdump.datというダンプを吐く
@ -308,16 +340,18 @@ void TwlMain( void )
case AUTH_RESULT_TITLE_POINTER_ERROR:
case AUTH_RESULT_AUTHENTICATE_FAILED:
case AUTH_RESULT_ENTRY_ADDRESS_ERROR:
default:
state = STOP;
// [TODO:]クリアしたほうが良いデータ(鍵など)があれば消す
// デバグ表示
if( !SYSM_IsLauncherHidden() )
{
LauncherInit( s_titleList );
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
G2_ChangeBlendAlpha( 0, 31 );
PrintfSJIS( 1, 38, TXT_COLOR_RED," LAUNCHER : ERROR OCCURRED!\n" );
PrintfSJIS( 1, 24, TXT_COLOR_RED," ERROR CODE = 0x%0.8x\n",res );
PrintfSJIS( 1, 25, TXT_COLOR_RED," LAUNCHER : ERROR OCCURRED!\n" );
PrintfSJIS( 1, 40, TXT_COLOR_RED," %s",error_msg[res] );
GX_DispOn();
GXS_DispOn();
}

View File

@ -65,7 +65,30 @@ typedef enum AuthResult {
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_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;