DSダウンロードアプリ署名検証時に、FSのキャッシュ関係不具合で失敗するのをバッファのアライメント調整で回避。

HWInfoの強制ロゴデモスキップ起動フラグを見て強制ロゴデモスキップ発動するよう変更。
これにともない、強制ロゴデモスキップフラグフラグをSDKの branch-5_0rcplus_UIG_plus rev.10247 に追加。これ以降のものでないとビルド通りません。
また、強制ロゴデモスキップ起動フラグの設定をnandinitializer.iniで指定できるように変更。
これにともない、関連する関数を使っているツール類のソース変更。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2769 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2009-03-26 01:53:57 +00:00
parent 6fc7987341
commit 42eee63f27
10 changed files with 50 additions and 25 deletions

View File

@ -438,7 +438,8 @@ static TitleProperty *SYSMi_CheckShortcutBoot1( void )
// 量産工程用ショートカットキー or // 量産工程用ショートカットキー or
// 検査カード起動 // 検査カード起動
//----------------------------------------------------- //-----------------------------------------------------
if( SYSM_IsInspectCard() || if( LCFG_THW_IsForceLogoDemoSkip() ||
SYSM_IsInspectCard() ||
( ( PAD_Read() == SYSM_PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) && ( ( PAD_Read() == SYSM_PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) &&
( !LCFG_TSD_IsFinishedBrokenTWLSettings() || !LCFG_TSD_IsFinishedInitialSetting() || !LCFG_TSD_IsFinishedInitialSetting_Launcher() ) ) ( !LCFG_TSD_IsFinishedBrokenTWLSettings() || !LCFG_TSD_IsFinishedInitialSetting() || !LCFG_TSD_IsFinishedInitialSetting_Launcher() ) )
){ ){

View File

@ -105,7 +105,9 @@ static OSThread s_thread;
static OSThread s_auth_thread; static OSThread s_auth_thread;
static TWLBannerFile s_card_bannerBuf; static TWLBannerFile s_card_bannerBuf;
static MbAuthCode s_authcode; static u8 s_authcode[MATH_ROUNDUP32(sizeof(MbAuthCode))] ATTRIBUTE_ALIGN(32);
static MbAuthCode *sp_authcode = (MbAuthCode *)s_authcode;
static MbAuthCode bup_num;
static BOOL s_loadstart = FALSE; static BOOL s_loadstart = FALSE;
@ -820,10 +822,10 @@ OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
UTL_SetFatalError(FATAL_ERROR_LOAD_SEEKFILE_FAILED); UTL_SetFatalError(FATAL_ERROR_LOAD_SEEKFILE_FAILED);
goto ERROR; goto ERROR;
} }
readLen = FS_ReadFile(file, &s_authcode, (s32)sizeof(s_authcode)); readLen = FS_ReadFile(file, sp_authcode, (s32)sizeof(MbAuthCode));
if( readLen != (s32)sizeof(s_authcode) ) if( readLen != (s32)sizeof(MbAuthCode) )
{ {
OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode, 0, sizeof(s_authcode), readLen); OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", sp_authcode, 0, sizeof(MbAuthCode), readLen);
UTL_SetFatalError(FATAL_ERROR_LOAD_READDLSIGN_FAILED); UTL_SetFatalError(FATAL_ERROR_LOAD_READDLSIGN_FAILED);
goto ERROR; goto ERROR;
} }
@ -1457,7 +1459,7 @@ static BOOL SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle)
u8 final_hash[SVC_SHA1_DIGEST_SIZE]; u8 final_hash[SVC_SHA1_DIGEST_SIZE];
// NTRダウンロードアプリ署名のマジックコードチェック // NTRダウンロードアプリ署名のマジックコードチェック
if( s_authcode.magic_code[0] != 'a' || s_authcode.magic_code[1] != 'c' ) { if( sp_authcode->magic_code[0] != 'a' || sp_authcode->magic_code[1] != 'c' ) {
OS_TPrintf("Authenticate failed: Invalid AuthCode.\n"); OS_TPrintf("Authenticate failed: Invalid AuthCode.\n");
UTL_SetFatalError(FATAL_ERROR_DL_MAGICCODE_CHECK_FAILED); UTL_SetFatalError(FATAL_ERROR_DL_MAGICCODE_CHECK_FAILED);
return FALSE; return FALSE;
@ -1466,18 +1468,18 @@ static BOOL SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle)
// NTRダウンロードアプリ署名DERフォーマットの計算、ハッシュの取得。 // NTRダウンロードアプリ署名DERフォーマットの計算、ハッシュの取得。
MI_CpuClear8( buf, 0x80 ); MI_CpuClear8( buf, 0x80 );
SVC_InitSignHeap( &con, (void *)SIGN_HEAP_ADDR, SIGN_HEAP_SIZE );// ヒープの初期化 SVC_InitSignHeap( &con, (void *)SIGN_HEAP_ADDR, SIGN_HEAP_SIZE );// ヒープの初期化
if( !SVC_DecryptSignDER( &con, buf, s_authcode.sign, nitro_dl_sign_key )) if( !SVC_DecryptSignDER( &con, buf, sp_authcode->sign, nitro_dl_sign_key ))
{ {
OS_TPrintf("Authenticate failed: Sign decryption failed.\n"); OS_TPrintf("Authenticate failed: Sign decryption failed.\n");
UTL_SetFatalError(FATAL_ERROR_DL_SIGN_DECRYPTION_FAILED); UTL_SetFatalError(FATAL_ERROR_DL_SIGN_DECRYPTION_FAILED);
return FALSE; return FALSE;
} }
// それぞれheader,ARM9FLX,ARM7FLXについてハッシュを計算して、それら3つを並べたものに対してまたハッシュをとる // それぞれheader,ARM9FLX,ARM7FLXについてハッシュを計算して、それら3つを並べたものに対してまたハッシュをとる
if(s_calc_hash) if(s_calc_hash)
{ {
// シリアルナンバー付加 // シリアルナンバー付加
*(u32 *)(&(s_calc_hash[SVC_SHA1_DIGEST_SIZE * 3])) = s_authcode.serial_number; *(u32 *)(&(s_calc_hash[SVC_SHA1_DIGEST_SIZE * 3])) = sp_authcode->serial_number;
// 最終ハッシュ計算 // 最終ハッシュ計算
SVC_CalcSHA1( final_hash, s_calc_hash, SVC_SHA1_DIGEST_SIZE * 3 + sizeof(u32)); SVC_CalcSHA1( final_hash, s_calc_hash, SVC_SHA1_DIGEST_SIZE * 3 + sizeof(u32));
}else }else
@ -1486,7 +1488,7 @@ static BOOL SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle)
UTL_SetFatalError(FATAL_ERROR_DL_HASH_CALC_FAILED); UTL_SetFatalError(FATAL_ERROR_DL_HASH_CALC_FAILED);
return FALSE; return FALSE;
} }
// 計算した最終ハッシュと、署名から得たハッシュとを比較 // 計算した最終ハッシュと、署名から得たハッシュとを比較
if(!SVC_CompareSHA1((const void *)buf, (const void *)final_hash)) if(!SVC_CompareSHA1((const void *)buf, (const void *)final_hash))
{ {
@ -1499,7 +1501,7 @@ static BOOL SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle)
} }
} }
OS_TPrintf("Authenticate : total %d ms.\n", OS_TicksToMilliSeconds(OS_GetTick() - start) ); OS_TPrintf("Authenticate : total %d ms.\n", OS_TicksToMilliSeconds(OS_GetTick() - start) );
return TRUE; return TRUE;
} }

View File

@ -204,7 +204,7 @@ static void WriteHWInfoFile( u8 region, BOOL isDisableWireless )
// ------------------------------------- // -------------------------------------
(void)PutStringUTF16( MSG_X * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_BLACK, pMsgSecureWriting ); (void)PutStringUTF16( MSG_X * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_BLACK, pMsgSecureWriting );
if( HWI_WriteHWSecureInfoFile( region, NULL, isDisableWireless ) ) { if( HWI_WriteHWSecureInfoFile( region, NULL, isDisableWireless, FALSE ) ) {
(void)PutStringUTF16( ( MSG_X + 20 ) * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_BLUE, pMsgSucceeded ); (void)PutStringUTF16( ( MSG_X + 20 ) * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_BLUE, pMsgSucceeded );
}else { }else {
(void)PutStringUTF16( ( MSG_X + 20 ) * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_RED, pMsgFailed ); (void)PutStringUTF16( ( MSG_X + 20 ) * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_RED, pMsgFailed );

View File

@ -417,7 +417,7 @@ BOOL HWI_WriteHWNormalInfoFile( void )
Returns: None. Returns: None.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWireless ) BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWireless, BOOL logoDemoSkipForce )
{ {
BOOL isWrite = TRUE; BOOL isWrite = TRUE;
LCFGReadResult result; LCFGReadResult result;
@ -435,6 +435,7 @@ BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWi
} }
LCFG_THW_SetFlagForceDisableWireless( isDisableWireless ); LCFG_THW_SetFlagForceDisableWireless( isDisableWireless );
LCFG_THW_SetFlagForceLogoDemoSkip( logoDemoSkipForce );
// 旧リージョンを保存 // 旧リージョンを保存
old_region = OS_GetRegion(); old_region = OS_GetRegion();

View File

@ -39,7 +39,7 @@ HwiInitResult;
HwiInitResult HWI_Init( void *(*pAlloc)( u32 ), void (*pFree)( void * ) ); HwiInitResult HWI_Init( void *(*pAlloc)( u32 ), void (*pFree)( void * ) );
BOOL HWI_ModifyLanguage( u8 region ); BOOL HWI_ModifyLanguage( u8 region );
BOOL HWI_WriteHWNormalInfoFile( void ); BOOL HWI_WriteHWNormalInfoFile( void );
BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWireless ); BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWireless, BOOL logoDemoSkipForce );
BOOL HWI_WriteHWIDSignFile( void ); BOOL HWI_WriteHWIDSignFile( void );
BOOL HWI_DeleteHWNormalInfoFile( void ); BOOL HWI_DeleteHWNormalInfoFile( void );
BOOL HWI_DeleteHWSecureInfoFile( void ); BOOL HWI_DeleteHWSecureInfoFile( void );

View File

@ -52,7 +52,7 @@ void* HWInfoProcess4(void);
Returns: None. Returns: None.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL WriteHWInfoFile( u8 region, BOOL wirelessForceOff ); BOOL WriteHWInfoFile( u8 region, BOOL wirelessForceOff, BOOL logoDemoSkipForce );
/*===========================================================================*/ /*===========================================================================*/

View File

@ -71,6 +71,7 @@ enum {
static s8 sMenuSelectNo; static s8 sMenuSelectNo;
static BOOL sWirelessForceOff; static BOOL sWirelessForceOff;
static BOOL sLogoDemoSkipForce;
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -79,7 +80,7 @@ static BOOL sWirelessForceOff;
static BOOL WriteHWNormalInfoFile( void ); static BOOL WriteHWNormalInfoFile( void );
static BOOL WriteHWSecureInfoFile( u8 region ); static BOOL WriteHWSecureInfoFile( u8 region );
//static BOOL DeleteHWInfoFile( void ); //static BOOL DeleteHWInfoFile( void );
static BOOL GetNandInitializerSetting(u8* region, u8* wireless); static BOOL GetNandInitializerSetting(u8* region, u8* wireless, u8* logodemoskip);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -210,11 +211,12 @@ void* HWInfoProcess2(void)
if (gAutoFlag) if (gAutoFlag)
{ {
// SDカードのnandinitializer.iniより設定を取得 // SDカードのnandinitializer.iniより設定を取得
if (!GetNandInitializerSetting((u8 *)&sMenuSelectNo, (u8 *)&sWirelessForceOff)) if (!GetNandInitializerSetting((u8 *)&sMenuSelectNo, (u8 *)&sWirelessForceOff, (u8 *)&sLogoDemoSkipForce))
{ {
// 設定の取得に失敗した場合はデフォルト設定(REGION_JAPAN/WIRELESS_ENABLE) // 設定の取得に失敗した場合はデフォルト設定(REGION_JAPAN/WIRELESS_ENABLE)
sMenuSelectNo = 0; sMenuSelectNo = 0;
sWirelessForceOff = FALSE; sWirelessForceOff = FALSE;
sLogoDemoSkipForce = FALSE;
} }
} }
else else
@ -232,7 +234,7 @@ void* HWInfoProcess2(void)
case MENU_REGION_CHINA: case MENU_REGION_CHINA:
case MENU_REGION_KOREA: case MENU_REGION_KOREA:
result = WriteHWInfoFile( (u8)sMenuSelectNo, sWirelessForceOff ); result = WriteHWInfoFile( (u8)sMenuSelectNo, sWirelessForceOff, sLogoDemoSkipForce );
// 全リージョンの結果をクリア // 全リージョンの結果をクリア
for (i=0;i<NUM_OF_MENU_SELECT;i++) for (i=0;i<NUM_OF_MENU_SELECT;i++)
@ -290,7 +292,7 @@ void* HWInfoProcess2(void)
Returns: None. Returns: None.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL WriteHWInfoFile( u8 region, BOOL wirelessForceOff ) BOOL WriteHWInfoFile( u8 region, BOOL wirelessForceOff, BOOL logoDemoSkipForce )
{ {
static const char *pMsgSecureWriting = "Writing Secure File..."; static const char *pMsgSecureWriting = "Writing Secure File...";
static const char *pMsgNormalWriting = "Writing Normal File..."; static const char *pMsgNormalWriting = "Writing Normal File...";
@ -313,7 +315,7 @@ BOOL WriteHWInfoFile( u8 region, BOOL wirelessForceOff )
// セキュアファイルのライト // セキュアファイルのライト
kamiFontPrintfConsoleEx(CONSOLE_ORANGE, pMsgSecureWriting ); kamiFontPrintfConsoleEx(CONSOLE_ORANGE, pMsgSecureWriting );
if( HWI_WriteHWSecureInfoFile( region, NULL, wirelessForceOff ) ) { if( HWI_WriteHWSecureInfoFile( region, NULL, wirelessForceOff, logoDemoSkipForce ) ) {
kamiFontPrintfConsoleEx(CONSOLE_ORANGE, pMsgSucceeded ); kamiFontPrintfConsoleEx(CONSOLE_ORANGE, pMsgSucceeded );
}else { }else {
kamiFontPrintfConsoleEx(CONSOLE_RED, pMsgFailed ); kamiFontPrintfConsoleEx(CONSOLE_RED, pMsgFailed );
@ -392,7 +394,7 @@ static BOOL DeleteHWInfoFile( void )
Returns: None. Returns: None.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static BOOL GetNandInitializerSetting(u8* region, u8* wireless) static BOOL GetNandInitializerSetting(u8* region, u8* wireless, u8* logodemoskip)
{ {
FSFile file; FSFile file;
BOOL open_is_ok; BOOL open_is_ok;
@ -401,6 +403,7 @@ static BOOL GetNandInitializerSetting(u8* region, u8* wireless)
char* pStr; char* pStr;
u8 temp_region; u8 temp_region;
u8 temp_wireless; u8 temp_wireless;
u8 temp_logodemoskip;
u32 file_size; u32 file_size;
u32 alloc_size; u32 alloc_size;
@ -430,6 +433,24 @@ static BOOL GetNandInitializerSetting(u8* region, u8* wireless)
// ROMファイルクローズ // ROMファイルクローズ
FS_CloseFile(&file); FS_CloseFile(&file);
// 強制ロゴデモスキップ設定を読み取る
pStr = STD_SearchString( pTempBuf, "LOGO_DEMO_SKIP_FORCE:");
if (pStr != NULL)
{
pStr += STD_GetStringLength("LOGO_DEMO_SKIP_FORCE:");
temp_logodemoskip = (u8)(*pStr - '0');
if ( temp_logodemoskip == 1 )
{
*logodemoskip = temp_logodemoskip;
}
else
{
*logodemoskip = 0;
}
}
// REGION: を読み取る // REGION: を読み取る
pStr = STD_SearchString( pTempBuf, "REGION:"); pStr = STD_SearchString( pTempBuf, "REGION:");

View File

@ -175,7 +175,7 @@ void* WirelessSettingProcess2(void)
switch( sMenuSelectNo ) switch( sMenuSelectNo )
{ {
case MENU_WIRELESS_ENABLE: case MENU_WIRELESS_ENABLE:
result = WriteHWInfoFile( OS_GetRegion(), FALSE ); result = WriteHWInfoFile( OS_GetRegion(), FALSE, FALSE );
if ( result == TRUE ) if ( result == TRUE )
{ {
kamiFontPrintf(26, (s16)(MENU_TOP_LINE+MENU_WIRELESS_ENABLE*CHAR_OF_MENU_SPACE), FONT_COLOR_GREEN, "OK "); kamiFontPrintf(26, (s16)(MENU_TOP_LINE+MENU_WIRELESS_ENABLE*CHAR_OF_MENU_SPACE), FONT_COLOR_GREEN, "OK ");
@ -189,7 +189,7 @@ void* WirelessSettingProcess2(void)
break; break;
case MENU_WIRELESS_FORCE_OFF: case MENU_WIRELESS_FORCE_OFF:
result = WriteHWInfoFile( OS_GetRegion(), TRUE ); result = WriteHWInfoFile( OS_GetRegion(), TRUE, FALSE );
if ( result == TRUE ) if ( result == TRUE )
{ {
kamiFontPrintf(26, (s16)(MENU_TOP_LINE+MENU_WIRELESS_ENABLE*CHAR_OF_MENU_SPACE), FONT_COLOR_GREEN, " "); kamiFontPrintf(26, (s16)(MENU_TOP_LINE+MENU_WIRELESS_ENABLE*CHAR_OF_MENU_SPACE), FONT_COLOR_GREEN, " ");

View File

@ -70,7 +70,7 @@ BOOL WriteHWInfoFile( u8 region, BOOL wirelessForceOff )
BOOL result = TRUE; BOOL result = TRUE;
// セキュアファイルのライト // セキュアファイルのライト
if( HWI_WriteHWSecureInfoFile( region, NULL, wirelessForceOff ) ) { // とりあえず無線は有効で。 if( HWI_WriteHWSecureInfoFile( region, NULL, wirelessForceOff, FALSE ) ) { // とりあえず無線は有効で。
// kamiFontPrintfConsoleEx(CONSOLE_ORANGE, pMsgSucceeded ); // kamiFontPrintfConsoleEx(CONSOLE_ORANGE, pMsgSucceeded );
}else { }else {
kamiFontPrintfConsoleEx(CONSOLE_RED, pMsgFailed ); kamiFontPrintfConsoleEx(CONSOLE_RED, pMsgFailed );

View File

@ -70,7 +70,7 @@ BOOL WriteHWInfoFile( u8 region, BOOL wirelessForceOff )
BOOL result = TRUE; BOOL result = TRUE;
// セキュアファイルのライト // セキュアファイルのライト
if( HWI_WriteHWSecureInfoFile( region, NULL, wirelessForceOff ) ) { // とりあえず無線は有効で。 if( HWI_WriteHWSecureInfoFile( region, NULL, wirelessForceOff, FALSE ) ) { // とりあえず無線は有効で。
// kamiFontPrintfConsoleEx(CONSOLE_ORANGE, pMsgSucceeded ); // kamiFontPrintfConsoleEx(CONSOLE_ORANGE, pMsgSucceeded );
}else { }else {
kamiFontPrintfConsoleEx(CONSOLE_RED, pMsgFailed ); kamiFontPrintfConsoleEx(CONSOLE_RED, pMsgFailed );