diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 15a9776e..1b1817df 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -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チェックphase2(phase1は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; } } } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index b32b4eda..96a94da6 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -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初期化 GX_DispOff(); diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index d82bca17..966225aa 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -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(); } diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h index 90a42708..5d87817b 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h @@ -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;