マスタエディタ:SRLを読み込んだ状態で別のSRLを再度読み込んで署名エラーとなったときに前のエラー情報が消えるバグを修正。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2550 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nishikawa_takeshi 2008-09-25 07:01:37 +00:00
parent 091bcc55de
commit b697873d14
6 changed files with 60 additions and 13 deletions

View File

@ -77,6 +77,16 @@ ECSrlResult RCSrl::readFromFile( System::String ^filename )
}
}
#ifdef METWL_WHETHER_SIGN_DECRYPT
// まず署名チェック
r = this->decryptRomHeader();
if( r != ECSrlResult::NOERROR )
{
(void)fclose(fp);
return r;
}
#endif //#ifdef METWL_WHETHER_SIGN_DECRYPT
// エラーリストをクリア
this->hErrorList = gcnew System::Collections::Generic::List<RCMrcError^>;
this->hWarnList = gcnew System::Collections::Generic::List<RCMrcError^>;
@ -88,16 +98,6 @@ ECSrlResult RCSrl::readFromFile( System::String ^filename )
// ROMヘッダの値をROM固有情報フィールドに反映させる
(void)this->setRomInfo();
#ifdef METWL_WHETHER_SIGN_DECRYPT
// ひととおり読んだあとに署名チェック
r = this->decryptRomHeader();
if( r != ECSrlResult::NOERROR )
{
(void)fclose(fp);
return r;
}
#endif //#ifdef METWL_WHETHER_SIGN_DECRYPT
// すべて設定したあとにMRC
{
ECSrlResult r;
@ -662,23 +662,25 @@ ECSrlResult RCSrl::decryptRomHeader(void)
// (1) 公開鍵で復号した結果(ブロック)をローカル変数(original)に格納
// (2) ブロックから余分な部分を取り除いて引数(pDst)にコピー
ECAppType type = this->selectAppType();
// 鍵を選ぶ
#ifdef METWL_VER_APPTYPE_LAUNCHER
if( *this->hIsAppLauncher )
if( type == ECAppType::LAUNCHER )
{
publicKey = (u8*)g_devPubKey_DER_launcher;
}
else
#endif //METWL_VER_APPTYPE_LAUNCHER
#ifdef METWL_VER_APPTYPE_SECURE
if( *this->hIsAppSecure )
if( type == ECAppType::SECURE )
{
publicKey = (u8*)g_devPubKey_DER_secure;
}
else
#endif //METWL_VER_APPTYPE_SECURE
#ifdef METWL_VER_APPTYPE_SYSTEM
if( *this->hIsAppSystem )
if( type == ECAppType::SYSTEM )
{
publicKey = (u8*)g_devPubKey_DER_system;
}
@ -715,6 +717,35 @@ ECSrlResult RCSrl::decryptRomHeader(void)
return (ECSrlResult::NOERROR);
}
//
// アプリ種別の判定
//
ECAppType RCSrl::selectAppType(void)
{
ECAppType type = ECAppType::ILLEGAL;
u8 *idL = this->pRomHeader->s.titleID_Lo;
u32 idH = this->pRomHeader->s.titleID_Hi;
if( (idL[3]=='H') && (idL[2]=='N') && (idL[1]=='A') ) // ランチャアプリかどうかはTitleID_Loの値で決定
{
type = ECAppType::LAUNCHER;
}
else if( idH & TITLE_ID_HI_SECURE_FLAG_MASK ) // 各ビットは排他的とは限らないのでelse ifにはならない
{
type = ECAppType::SECURE;
}
else if( (idH & TITLE_ID_HI_APP_TYPE_MASK) == 1 )
{
type = ECAppType::SYSTEM;
}
else if( (idH & TITLE_ID_HI_APP_TYPE_MASK) == 0 )
{
type = ECAppType::USER;
}
return type;
}
//
// DSダウンロード署名がSRLに格納されているか調べる
//

View File

@ -38,6 +38,21 @@ namespace MasterEditorTWL
ERROR_PLATFORM,
};
// -------------------------------------------------------------------
// Type : enum class
// Name : ECAppType
//
// Description : RCSrlクラスのアプリ種別を宣言
// -------------------------------------------------------------------
enum class ECAppType
{
USER = 0,
SYSTEM,
SECURE,
LAUNCHER,
ILLEGAL, // 不定
};
// -------------------------------------------------------------------
// Type : ref class
// Name : RCSDKVersion
@ -362,6 +377,7 @@ namespace MasterEditorTWL
// @arg [in] 入力ファイルのFP (->SRL読み込み時に実行されるべき)]
ECSrlResult searchSDKVersion( FILE *fp ); // SDKバージョンを取得する
ECSrlResult searchLicenses( FILE *fp ); // 使用ライセンスを取得する
ECAppType selectAppType(void);
// MRC(Master ROM Checker)機能
ECSrlResult mrc( FILE *fp );