diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.ncb b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.ncb
index bb67e85..b95690b 100644
Binary files a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.ncb and b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.ncb differ
diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.suo b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.suo
index 0fc635e..82bf2fa 100644
Binary files a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.suo and b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.suo differ
diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm
index a99f3e2..0b52b1a 100644
Binary files a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm and b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm differ
diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Release/BuildLog.htm b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Release/BuildLog.htm
index 87bd6ba..c9277d6 100644
Binary files a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Release/BuildLog.htm and b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Release/BuildLog.htm differ
diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.cpp b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.cpp
index 82503a5..4902833 100644
--- a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.cpp
+++ b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.cpp
@@ -56,14 +56,15 @@ ECSrlResult RCSrl::readFromFile( System::String ^filename )
(void)fseek( fp, 0, SEEK_SET ); // ROMヘッダはsrlの先頭から
// 1バイトをsizeof(~)だけリード (逆だと返り値がsizeof(~)にならないので注意)
- if( fread( (void*)(this->pRomHeader), 1, sizeof(ROM_Header), fp ) != sizeof(ROM_Header) )
+ ROM_Header tmprh;
+ if( fread( (void*)&tmprh, 1, sizeof(ROM_Header), fp ) != sizeof(ROM_Header) )
{
return (ECSrlResult::ERROR_FILE_READ);
}
#ifdef METWL_WHETHER_SIGN_DECRYPT
// まず署名チェック
- r = this->decryptRomHeader();
+ r = this->decryptRomHeader( &tmprh );
if( r != ECSrlResult::NOERROR )
{
(void)fclose(fp);
@@ -71,6 +72,10 @@ ECSrlResult RCSrl::readFromFile( System::String ^filename )
}
#endif //#ifdef METWL_WHETHER_SIGN_DECRYPT
+ // 署名チェックを通ってからフィールドのROMヘッダにコピー
+ // (そうしないと不正SRLを読み込んだときにROMヘッダが上書きされてしまう)
+ memcpy( this->pRomHeader, &tmprh, sizeof(ROM_Header) );
+
{
// ファイルを閉じる前にROMヘッダ以外の領域から設定を取り出す
(void)this->hasDSDLPlaySign( fp );
@@ -687,13 +692,12 @@ ECSrlResult RCSrl::signRomHeader(void)
//
// ROMヘッダの署名を外す
//
-ECSrlResult RCSrl::decryptRomHeader(void)
+ECSrlResult RCSrl::decryptRomHeader( ROM_Header *prh )
{
u8 original[ RSA_KEY_LENGTH ]; // 署名外した後のデータ格納先
s32 pos = 0; // ブロックの先頭アドレス
u8 digest[ DIGEST_SIZE_SHA1 ]; // ROMヘッダのダイジェスト
u8 *publicKey = (u8*)g_devPubKey_DER;
- ROM_Header rh;
// <データの流れ>
// (1) 公開鍵で復号した結果(ブロック)をローカル変数(original)に格納
@@ -730,7 +734,7 @@ ECSrlResult RCSrl::decryptRomHeader(void)
#endif //METWL_VER_APPTYPE_USER
// 署名の解除 = 公開鍵で復号
- if( !ACSign_Decrypto( original, publicKey, this->pRomHeader->signature, RSA_KEY_LENGTH ) )
+ if( !ACSign_Decrypto( original, publicKey, prh->signature, RSA_KEY_LENGTH ) )
{
return ECSrlResult::ERROR_SIGN_DECRYPT;
}
@@ -745,8 +749,8 @@ ECSrlResult RCSrl::decryptRomHeader(void)
}
// ベリファイ
// ROMヘッダのダイジェストを算出(先頭から証明書領域の直前までが対象)
- ACSign_DigestUnit( digest, this->pRomHeader, (u32)&(rh.certificate) - (u32)&(rh) );
- // this->pRomHeader はマネージヒープ上にあるので実アドレスを取得できない
+ ROM_Header tmprh; // マネージヒープ上にある場合実アドレスを取得できないのでサイズ計算用のROMヘッダを用意
+ ACSign_DigestUnit( digest, prh, (u32)&(tmprh.certificate) - (u32)&(tmprh) );
if( memcmp( &(original[pos+1]), digest, DIGEST_SIZE_SHA1 ) != 0 )
{
return ECSrlResult::ERROR_SIGN_VERIFY;
diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.h b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.h
index 1519e9f..61cff12 100644
--- a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.h
+++ b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.h
@@ -372,9 +372,9 @@ namespace MasterEditorTWL
void setRatingRomHeader( u32 region ); // ROMヘッダにフィールドの値を反映させる
// ROMヘッダの更新
- ECSrlResult calcRomHeaderCRC(void); // ROMヘッダのCRCを再計算
- ECSrlResult signRomHeader(void); // ROMヘッダ更新後の再署名
- ECSrlResult decryptRomHeader(void); // ROMヘッダの署名を外す
+ ECSrlResult calcRomHeaderCRC(void); // ROMヘッダのCRCを再計算
+ ECSrlResult signRomHeader(void); // ROMヘッダ更新後の再署名
+ ECSrlResult decryptRomHeader( ROM_Header *prh ); // ROMヘッダの署名を外す
// SRLバイナリから特殊な設定を調べる
ECSrlResult hasDSDLPlaySign( FILE *fp );
diff --git a/build/tools/MasterEditor/MasterEditorTWL/resource/sheet_templete.xml b/build/tools/MasterEditor/MasterEditorTWL/resource/sheet_templete.xml
index 6e04fb4..335f3f5 100644
--- a/build/tools/MasterEditor/MasterEditorTWL/resource/sheet_templete.xml
+++ b/build/tools/MasterEditor/MasterEditorTWL/resource/sheet_templete.xml
@@ -69,28 +69,6 @@
-
-
+
+