マスタエディタ: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->hErrorList = gcnew System::Collections::Generic::List<RCMrcError^>;
this->hWarnList = 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固有情報フィールドに反映させる // ROMヘッダの値をROM固有情報フィールドに反映させる
(void)this->setRomInfo(); (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 // すべて設定したあとにMRC
{ {
ECSrlResult r; ECSrlResult r;
@ -662,23 +662,25 @@ ECSrlResult RCSrl::decryptRomHeader(void)
// (1) 公開鍵で復号した結果(ブロック)をローカル変数(original)に格納 // (1) 公開鍵で復号した結果(ブロック)をローカル変数(original)に格納
// (2) ブロックから余分な部分を取り除いて引数(pDst)にコピー // (2) ブロックから余分な部分を取り除いて引数(pDst)にコピー
ECAppType type = this->selectAppType();
// 鍵を選ぶ // 鍵を選ぶ
#ifdef METWL_VER_APPTYPE_LAUNCHER #ifdef METWL_VER_APPTYPE_LAUNCHER
if( *this->hIsAppLauncher ) if( type == ECAppType::LAUNCHER )
{ {
publicKey = (u8*)g_devPubKey_DER_launcher; publicKey = (u8*)g_devPubKey_DER_launcher;
} }
else else
#endif //METWL_VER_APPTYPE_LAUNCHER #endif //METWL_VER_APPTYPE_LAUNCHER
#ifdef METWL_VER_APPTYPE_SECURE #ifdef METWL_VER_APPTYPE_SECURE
if( *this->hIsAppSecure ) if( type == ECAppType::SECURE )
{ {
publicKey = (u8*)g_devPubKey_DER_secure; publicKey = (u8*)g_devPubKey_DER_secure;
} }
else else
#endif //METWL_VER_APPTYPE_SECURE #endif //METWL_VER_APPTYPE_SECURE
#ifdef METWL_VER_APPTYPE_SYSTEM #ifdef METWL_VER_APPTYPE_SYSTEM
if( *this->hIsAppSystem ) if( type == ECAppType::SYSTEM )
{ {
publicKey = (u8*)g_devPubKey_DER_system; publicKey = (u8*)g_devPubKey_DER_system;
} }
@ -715,6 +717,35 @@ ECSrlResult RCSrl::decryptRomHeader(void)
return (ECSrlResult::NOERROR); 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に格納されているか調べる // DSダウンロード署名がSRLに格納されているか調べる
// //

View File

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