マスタエディタ:署名が不正なSRLを読み込んだときにすでに読み込まれているSRL用のROMヘッダが上書きされてしまう問題を修正。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@87 7061adef-622a-194b-ae81-725974e89856
This commit is contained in:
nishikawa_takeshi 2008-12-16 04:13:02 +00:00
parent 84c8d8f2b5
commit 71a47edf41
7 changed files with 41 additions and 58 deletions

View File

@ -56,14 +56,15 @@ ECSrlResult RCSrl::readFromFile( System::String ^filename )
(void)fseek( fp, 0, SEEK_SET ); // ROMヘッダはsrlの先頭から (void)fseek( fp, 0, SEEK_SET ); // ROMヘッダはsrlの先頭から
// 1バイトをsizeof(~)だけリード (逆だと返り値がsizeof(~)にならないので注意) // 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); return (ECSrlResult::ERROR_FILE_READ);
} }
#ifdef METWL_WHETHER_SIGN_DECRYPT #ifdef METWL_WHETHER_SIGN_DECRYPT
// まず署名チェック // まず署名チェック
r = this->decryptRomHeader(); r = this->decryptRomHeader( &tmprh );
if( r != ECSrlResult::NOERROR ) if( r != ECSrlResult::NOERROR )
{ {
(void)fclose(fp); (void)fclose(fp);
@ -71,6 +72,10 @@ ECSrlResult RCSrl::readFromFile( System::String ^filename )
} }
#endif //#ifdef METWL_WHETHER_SIGN_DECRYPT #endif //#ifdef METWL_WHETHER_SIGN_DECRYPT
// 署名チェックを通ってからフィールドのROMヘッダにコピー
// (そうしないと不正SRLを読み込んだときにROMヘッダが上書きされてしまう)
memcpy( this->pRomHeader, &tmprh, sizeof(ROM_Header) );
{ {
// ファイルを閉じる前にROMヘッダ以外の領域から設定を取り出す // ファイルを閉じる前にROMヘッダ以外の領域から設定を取り出す
(void)this->hasDSDLPlaySign( fp ); (void)this->hasDSDLPlaySign( fp );
@ -687,13 +692,12 @@ ECSrlResult RCSrl::signRomHeader(void)
// //
// ROMヘッダの署名を外す // ROMヘッダの署名を外す
// //
ECSrlResult RCSrl::decryptRomHeader(void) ECSrlResult RCSrl::decryptRomHeader( ROM_Header *prh )
{ {
u8 original[ RSA_KEY_LENGTH ]; // 署名外した後のデータ格納先 u8 original[ RSA_KEY_LENGTH ]; // 署名外した後のデータ格納先
s32 pos = 0; // ブロックの先頭アドレス s32 pos = 0; // ブロックの先頭アドレス
u8 digest[ DIGEST_SIZE_SHA1 ]; // ROMヘッダのダイジェスト u8 digest[ DIGEST_SIZE_SHA1 ]; // ROMヘッダのダイジェスト
u8 *publicKey = (u8*)g_devPubKey_DER; u8 *publicKey = (u8*)g_devPubKey_DER;
ROM_Header rh;
// <データの流れ> // <データの流れ>
// (1) 公開鍵で復号した結果(ブロック)をローカル変数(original)に格納 // (1) 公開鍵で復号した結果(ブロック)をローカル変数(original)に格納
@ -730,7 +734,7 @@ ECSrlResult RCSrl::decryptRomHeader(void)
#endif //METWL_VER_APPTYPE_USER #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; return ECSrlResult::ERROR_SIGN_DECRYPT;
} }
@ -745,8 +749,8 @@ ECSrlResult RCSrl::decryptRomHeader(void)
} }
// ベリファイ // ベリファイ
// ROMヘッダのダイジェストを算出(先頭から証明書領域の直前までが対象) // ROMヘッダのダイジェストを算出(先頭から証明書領域の直前までが対象)
ACSign_DigestUnit( digest, this->pRomHeader, (u32)&(rh.certificate) - (u32)&(rh) ); ROM_Header tmprh; // マネージヒープ上にある場合実アドレスを取得できないのでサイズ計算用のROMヘッダを用意
// this->pRomHeader はマネージヒープ上にあるので実アドレスを取得できない ACSign_DigestUnit( digest, prh, (u32)&(tmprh.certificate) - (u32)&(tmprh) );
if( memcmp( &(original[pos+1]), digest, DIGEST_SIZE_SHA1 ) != 0 ) if( memcmp( &(original[pos+1]), digest, DIGEST_SIZE_SHA1 ) != 0 )
{ {
return ECSrlResult::ERROR_SIGN_VERIFY; return ECSrlResult::ERROR_SIGN_VERIFY;

View File

@ -372,9 +372,9 @@ namespace MasterEditorTWL
void setRatingRomHeader( u32 region ); // ROMヘッダにフィールドの値を反映させる void setRatingRomHeader( u32 region ); // ROMヘッダにフィールドの値を反映させる
// ROMヘッダの更新 // ROMヘッダの更新
ECSrlResult calcRomHeaderCRC(void); // ROMヘッダのCRCを再計算 ECSrlResult calcRomHeaderCRC(void); // ROMヘッダのCRCを再計算
ECSrlResult signRomHeader(void); // ROMヘッダ更新後の再署名 ECSrlResult signRomHeader(void); // ROMヘッダ更新後の再署名
ECSrlResult decryptRomHeader(void); // ROMヘッダの署名を外す ECSrlResult decryptRomHeader( ROM_Header *prh ); // ROMヘッダの署名を外す
// SRLバイナリから特殊な設定を調べる // SRLバイナリから特殊な設定を調べる
ECSrlResult hasDSDLPlaySign( FILE *fp ); ECSrlResult hasDSDLPlaySign( FILE *fp );

View File

@ -69,28 +69,6 @@
<Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/> <Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
<NumberFormat ss:Format="@"/> <NumberFormat ss:Format="@"/>
</Style> </Style>
<Style ss:ID="m20928738">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName=" Pゴシック" x:CharSet="128" x:Family="Modern"/>
<Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="m20928768">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName=" Pゴシック" x:CharSet="128" x:Family="Modern"/>
<Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="m20933904"> <Style ss:ID="m20933904">
<Alignment ss:Horizontal="Left" ss:Vertical="Center"/> <Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
<Borders> <Borders>
@ -1411,6 +1389,17 @@
<Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/> <Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
<NumberFormat ss:Format="@"/> <NumberFormat ss:Format="@"/>
</Style> </Style>
<Style ss:ID="m20926896">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName=" Pゴシック" x:CharSet="128" x:Family="Modern"/>
<Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="m20926906"> <Style ss:ID="m20926906">
<Alignment ss:Horizontal="Left" ss:Vertical="Center"/> <Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
<Borders> <Borders>
@ -1564,6 +1553,17 @@
<Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/> <Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
<NumberFormat ss:Format="@"/> <NumberFormat ss:Format="@"/>
</Style> </Style>
<Style ss:ID="m20926420">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName=" Pゴシック" x:CharSet="128" x:Family="Modern"/>
<Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="m20926430"> <Style ss:ID="m20926430">
<Alignment ss:Horizontal="Left" ss:Vertical="Center"/> <Alignment ss:Horizontal="Left" ss:Vertical="Center"/>
<Borders> <Borders>
@ -2307,13 +2307,6 @@
</Styles> </Styles>
<Names> <Names>
<NamedRange ss:Name="AccessOther" ss:RefersTo="=マスターROM提出確認書!R35C18"/> <NamedRange ss:Name="AccessOther" ss:RefersTo="=マスターROM提出確認書!R35C18"/>
<NamedRange ss:Name="AlwaysCERO" ss:RefersTo="=マスターROM提出確認書!R38C21"/>
<NamedRange ss:Name="AlwaysESRB" ss:RefersTo="=マスターROM提出確認書!R38C70"/>
<NamedRange ss:Name="AlwaysOFLC" ss:RefersTo="=マスターROM提出確認書!R41C21"/>
<NamedRange ss:Name="AlwaysPEGI" ss:RefersTo="=マスターROM提出確認書!R39C70"/>
<NamedRange ss:Name="AlwaysPEGIBBFC" ss:RefersTo="=マスターROM提出確認書!R40C70"/>
<NamedRange ss:Name="AlwaysPEGIPRT" ss:RefersTo="=マスターROM提出確認書!R40C21"/>
<NamedRange ss:Name="AlwaysUSK" ss:RefersTo="=マスターROM提出確認書!R39C21"/>
<NamedRange ss:Name="AppType" ss:RefersTo="=マスターROM提出確認書!R26C20"/> <NamedRange ss:Name="AppType" ss:RefersTo="=マスターROM提出確認書!R26C20"/>
<NamedRange ss:Name="AppTypeOther" ss:RefersTo="=マスターROM提出確認書!R26C53"/> <NamedRange ss:Name="AppTypeOther" ss:RefersTo="=マスターROM提出確認書!R26C53"/>
<NamedRange ss:Name="BackupMemory" ss:RefersTo="=マスターROM提出確認書!R24C86"/> <NamedRange ss:Name="BackupMemory" ss:RefersTo="=マスターROM提出確認書!R24C86"/>
@ -2321,13 +2314,6 @@
<NamedRange ss:Name="Company1" ss:RefersTo="=マスターROM提出確認書!R8C20"/> <NamedRange ss:Name="Company1" ss:RefersTo="=マスターROM提出確認書!R8C20"/>
<NamedRange ss:Name="Company2" ss:RefersTo="=マスターROM提出確認書!R13C20"/> <NamedRange ss:Name="Company2" ss:RefersTo="=マスターROM提出確認書!R13C20"/>
<NamedRange ss:Name="CRC" ss:RefersTo="=マスターROM提出確認書!R21C53"/> <NamedRange ss:Name="CRC" ss:RefersTo="=マスターROM提出確認書!R21C53"/>
<NamedRange ss:Name="EnableCERO" ss:RefersTo="=マスターROM提出確認書!#REF!"/>
<NamedRange ss:Name="EnableESRB" ss:RefersTo="=マスターROM提出確認書!#REF!"/>
<NamedRange ss:Name="EnableOFLC" ss:RefersTo="=マスターROM提出確認書!#REF!"/>
<NamedRange ss:Name="EnablePEGI" ss:RefersTo="=マスターROM提出確認書!#REF!"/>
<NamedRange ss:Name="EnablePEGIBBFC" ss:RefersTo="=マスターROM提出確認書!#REF!"/>
<NamedRange ss:Name="EnablePEGIPRT" ss:RefersTo="=マスターROM提出確認書!#REF!"/>
<NamedRange ss:Name="EnableUSK" ss:RefersTo="=マスターROM提出確認書!#REF!"/>
<NamedRange ss:Name="Fax1" ss:RefersTo="=マスターROM提出確認書!R10C69"/> <NamedRange ss:Name="Fax1" ss:RefersTo="=マスターROM提出確認書!R10C69"/>
<NamedRange ss:Name="Fax2" ss:RefersTo="=マスターROM提出確認書!R15C69"/> <NamedRange ss:Name="Fax2" ss:RefersTo="=マスターROM提出確認書!R15C69"/>
<NamedRange ss:Name="Furigana1" ss:RefersTo="=マスターROM提出確認書!R9C20"/> <NamedRange ss:Name="Furigana1" ss:RefersTo="=マスターROM提出確認書!R9C20"/>
@ -2369,19 +2355,12 @@
<NamedRange ss:Name="ProductNameForeign" ss:RefersTo="=マスターROM提出確認書!R5C50"/> <NamedRange ss:Name="ProductNameForeign" ss:RefersTo="=マスターROM提出確認書!R5C50"/>
<NamedRange ss:Name="PublicSize" ss:RefersTo="=マスターROM提出確認書!R28C36"/> <NamedRange ss:Name="PublicSize" ss:RefersTo="=マスターROM提出確認書!R28C36"/>
<NamedRange ss:Name="RatingCERO" ss:RefersTo="=マスターROM提出確認書!R38C13"/> <NamedRange ss:Name="RatingCERO" ss:RefersTo="=マスターROM提出確認書!R38C13"/>
<NamedRange ss:Name="RatingCEROStr" ss:RefersTo="=マスターROM提出確認書!R38C34"/>
<NamedRange ss:Name="RatingESRB" ss:RefersTo="=マスターROM提出確認書!R38C62"/> <NamedRange ss:Name="RatingESRB" ss:RefersTo="=マスターROM提出確認書!R38C62"/>
<NamedRange ss:Name="RatingESRBStr" ss:RefersTo="=マスターROM提出確認書!R38C83"/>
<NamedRange ss:Name="RatingOFLC" ss:RefersTo="=マスターROM提出確認書!R41C13"/> <NamedRange ss:Name="RatingOFLC" ss:RefersTo="=マスターROM提出確認書!R41C13"/>
<NamedRange ss:Name="RatingOFLCStr" ss:RefersTo="=マスターROM提出確認書!R41C34"/>
<NamedRange ss:Name="RatingPEGI" ss:RefersTo="=マスターROM提出確認書!R39C62"/> <NamedRange ss:Name="RatingPEGI" ss:RefersTo="=マスターROM提出確認書!R39C62"/>
<NamedRange ss:Name="RatingPEGIBBFC" ss:RefersTo="=マスターROM提出確認書!R40C62"/> <NamedRange ss:Name="RatingPEGIBBFC" ss:RefersTo="=マスターROM提出確認書!R40C62"/>
<NamedRange ss:Name="RatingPEGIBBFCStr" ss:RefersTo="=マスターROM提出確認書!R40C83"/>
<NamedRange ss:Name="RatingPEGIPRT" ss:RefersTo="=マスターROM提出確認書!R40C13"/> <NamedRange ss:Name="RatingPEGIPRT" ss:RefersTo="=マスターROM提出確認書!R40C13"/>
<NamedRange ss:Name="RatingPEGIPRTStr" ss:RefersTo="=マスターROM提出確認書!R40C34"/>
<NamedRange ss:Name="RatingPEGIStr" ss:RefersTo="=マスターROM提出確認書!R39C83"/>
<NamedRange ss:Name="RatingUSK" ss:RefersTo="=マスターROM提出確認書!R39C13"/> <NamedRange ss:Name="RatingUSK" ss:RefersTo="=マスターROM提出確認書!R39C13"/>
<NamedRange ss:Name="RatingUSKStr" ss:RefersTo="=マスターROM提出確認書!R39C34"/>
<NamedRange ss:Name="Region" ss:RefersTo="=マスターROM提出確認書!R32C28"/> <NamedRange ss:Name="Region" ss:RefersTo="=マスターROM提出確認書!R32C28"/>
<NamedRange ss:Name="ReleaseDay" ss:RefersTo="=マスターROM提出確認書!R19C46"/> <NamedRange ss:Name="ReleaseDay" ss:RefersTo="=マスターROM提出確認書!R19C46"/>
<NamedRange ss:Name="ReleaseForeign" ss:RefersTo="=マスターROM提出確認書!R5C20"/> <NamedRange ss:Name="ReleaseForeign" ss:RefersTo="=マスターROM提出確認書!R5C20"/>
@ -2719,7 +2698,7 @@
<Cell ss:MergeAcross="16" ss:StyleID="m20926400"><Data ss:Type="String">ふりがな</Data></Cell> <Cell ss:MergeAcross="16" ss:StyleID="m20926400"><Data ss:Type="String">ふりがな</Data></Cell>
<Cell ss:MergeAcross="35" ss:StyleID="s52"><Data ss:Type="String">TagFurigana1</Data><NamedCell <Cell ss:MergeAcross="35" ss:StyleID="s52"><Data ss:Type="String">TagFurigana1</Data><NamedCell
ss:Name="Furigana1"/></Cell> ss:Name="Furigana1"/></Cell>
<Cell ss:MergeAcross="7" ss:MergeDown="1" ss:StyleID="m20928738"><PhoneticText <Cell ss:MergeAcross="7" ss:MergeDown="1" ss:StyleID="m20926420"><PhoneticText
xmlns="urn:schemas-microsoft-com:office:excel">イン</PhoneticText><Data xmlns="urn:schemas-microsoft-com:office:excel">イン</PhoneticText><Data
ss:Type="String">印</Data></Cell> ss:Type="String">印</Data></Cell>
<Cell ss:MergeAcross="4" ss:StyleID="m20926430"><Data ss:Type="String">TEL</Data></Cell> <Cell ss:MergeAcross="4" ss:StyleID="m20926430"><Data ss:Type="String">TEL</Data></Cell>
@ -2873,7 +2852,7 @@
<Cell ss:MergeAcross="16" ss:StyleID="m20926876"><Data ss:Type="String">ふりがな</Data></Cell> <Cell ss:MergeAcross="16" ss:StyleID="m20926876"><Data ss:Type="String">ふりがな</Data></Cell>
<Cell ss:MergeAcross="35" ss:StyleID="s52"><Data ss:Type="String">TagFurigana2</Data><NamedCell <Cell ss:MergeAcross="35" ss:StyleID="s52"><Data ss:Type="String">TagFurigana2</Data><NamedCell
ss:Name="Furigana2"/></Cell> ss:Name="Furigana2"/></Cell>
<Cell ss:MergeAcross="7" ss:MergeDown="1" ss:StyleID="m20928768"><PhoneticText <Cell ss:MergeAcross="7" ss:MergeDown="1" ss:StyleID="m20926896"><PhoneticText
xmlns="urn:schemas-microsoft-com:office:excel">イン</PhoneticText><Data xmlns="urn:schemas-microsoft-com:office:excel">イン</PhoneticText><Data
ss:Type="String">印</Data></Cell> ss:Type="String">印</Data></Cell>
<Cell ss:MergeAcross="4" ss:StyleID="m20926906"><Data ss:Type="String">TEL</Data></Cell> <Cell ss:MergeAcross="4" ss:StyleID="m20926906"><Data ss:Type="String">TEL</Data></Cell>
@ -11850,11 +11829,11 @@
<Cell ss:StyleID="s22"/> <Cell ss:StyleID="s22"/>
<Cell ss:StyleID="s22"/> <Cell ss:StyleID="s22"/>
<Cell ss:MergeAcross="73" ss:StyleID="s24"><PhoneticText <Cell ss:MergeAcross="73" ss:StyleID="s24"><PhoneticText
xmlns="urn:schemas-microsoft-com:office:excel">テイシュツカクニンショ</PhoneticText><Data xmlns="urn:schemas-microsoft-com:office:excel">テイシュツカクニンショツイカジョウホウ</PhoneticText><Data
ss:Type="String">ニンテンドーDSiマスターROM提出確認書</Data></Cell> ss:Type="String">ニンテンドーDSiマスターROM提出確認書 追加情報</Data></Cell>
<Cell ss:MergeAcross="23" ss:StyleID="s26"><PhoneticText <Cell ss:MergeAcross="23" ss:StyleID="s26"><PhoneticText
xmlns="urn:schemas-microsoft-com:office:excel">ショシキゴウ</PhoneticText><Data xmlns="urn:schemas-microsoft-com:office:excel">ショシキゴウ</PhoneticText><Data
ss:Type="String">書式 2008-10</Data></Cell> ss:Type="String">書式 2008-12</Data></Cell>
<Cell ss:StyleID="s22"/> <Cell ss:StyleID="s22"/>
</Row> </Row>
<Row ss:AutoFitHeight="0"> <Row ss:AutoFitHeight="0">