From a20a3b0e392659fa83d7bdf8be5906a9765d6c4e Mon Sep 17 00:00:00 2001 From: yosiokat Date: Thu, 21 Aug 2008 03:08:11 +0000 Subject: [PATCH] =?UTF-8?q?ROM=E3=83=98=E3=83=83=E3=83=80=E3=81=AE?= =?UTF-8?q?=E3=80=8C=E9=96=8B=E7=99=BA=E7=94=A8=E6=9A=97=E5=8F=B7=E3=83=93?= =?UTF-8?q?=E3=83=83=E3=83=88=E3=80=8D=E3=81=AE=E4=BD=8D=E7=BD=AE=E7=A7=BB?= =?UTF-8?q?=E5=8B=95=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=81=97=E3=80=81=E6=96=B0?= =?UTF-8?q?=E6=97=A7=E3=81=A9=E3=81=A1=E3=82=89=E3=81=AE=E5=A0=B4=E6=89=80?= =?UTF-8?q?=E3=81=AE=E3=83=93=E3=83=83=E3=83=88=E3=81=8C=E7=AB=8B=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=82=8BSRL=E3=81=A7=E3=82=82=20=E3=83=96?= =?UTF-8?q?=E3=83=BC=E3=83=88=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=A6=E3=81=8A=E3=81=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2213 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/gcdfirm/sdmc-launcher/ARM9/main.c | 2 +- build/libraries/aes/ARM7/aes_init.c | 2 +- .../sysmenu/ARM9/src/title.c | 2 +- .../sysmenu/common/src/decryptAES.c | 8 ++++---- build/nandfirm/menu-launcher/ARM9/main.c | 2 +- build/nandfirm/sdmc-launcher/ARM9/main.c | 2 +- .../attach_dummyromheader.c | 2 +- docs/format_ROM_Header.xls | Bin 91648 -> 91648 bytes 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/build/gcdfirm/sdmc-launcher/ARM9/main.c b/build/gcdfirm/sdmc-launcher/ARM9/main.c index 50782802..f4abf957 100644 --- a/build/gcdfirm/sdmc-launcher/ARM9/main.c +++ b/build/gcdfirm/sdmc-launcher/ARM9/main.c @@ -176,7 +176,7 @@ static BOOL CheckHeader(void) OS_TPrintf("AES Encryption : %s\n", rhs->enable_aes ? "AVAILABLE" : "NOT AVAILABLE"); if ( rhs->enable_aes ) { - OS_TPrintf("AES Key Type : %s\n", rhs->developer_encrypt ? "FOR DEVELOPMENT" : "FOR PRODUCT"); + OS_TPrintf("AES Key Type : %s\n", rhs->developer_encrypt_old || rhs->exFlags.developer_encrypt ? "FOR DEVELOPMENT" : "FOR PRODUCT"); } // エントリポイント OS_TPrintf("ARM9 Entry point : %08X\n", rhs->main_entry_address); diff --git a/build/libraries/aes/ARM7/aes_init.c b/build/libraries/aes/ARM7/aes_init.c index c48f3027..2111b9c7 100644 --- a/build/libraries/aes/ARM7/aes_init.c +++ b/build/libraries/aes/ARM7/aes_init.c @@ -102,7 +102,7 @@ void AESi_InitSeedWithRomHeader( ROM_Header* rom_header ) { return; } - if ( rom_header->s.developer_encrypt ) + if ( rom_header->s.developer_encrypt_old || rom_header->s.exFlags.developer_encrypt ) { AES_SetKeyA( (AESKey*)rom_header->s.title_name ); } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 6eab1360..0bbac236 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -956,7 +956,7 @@ static BOOL SYSMi_AuthenticateHeaderWithSign( TitleProperty *pBootTitle, ROM_Hea { // 注:デバグ用コード。 // 開発用TSボードで開発版ROMおよび製品版ROMの署名チェックとAESデクリプトをデバグするためのコード - if( head->s.developer_encrypt ) + if( head->s.developer_encrypt_old || head->s.exFlags.developer_encrypt ) { // 開発版鍵取得 key = g_devPubKey[keynum]; diff --git a/build/libraries_sysmenu/sysmenu/common/src/decryptAES.c b/build/libraries_sysmenu/sysmenu/common/src/decryptAES.c index adca2c3a..89672213 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/decryptAES.c +++ b/build/libraries_sysmenu/sysmenu/common/src/decryptAES.c @@ -138,14 +138,14 @@ BOOL SYSM_InitDecryptAESRegion_W( ROM_Header_Short *hs ) } // Workに開発/製品情報を格納 - SYSMi_GetWork()->isDeveloperAESMode = ( hs->developer_encrypt ? TRUE : FALSE ); + SYSMi_GetWork()->isDeveloperAESMode = ( hs->developer_encrypt_old || hs->exFlags.developer_encrypt ) ? TRUE : FALSE; // カウンタの初期値記録 MI_CpuCopy8( hs->main_static_digest, s_initCounterAES[0], AES_BLOCK_SIZE ); // 領域1初期値 MI_CpuCopy8( hs->sub_static_digest, s_initCounterAES[1], AES_BLOCK_SIZE ); // 領域2初期値 // Workに「鍵」or「シードとゲームコード」をセット - if( hs->developer_encrypt ) + if( hs->developer_encrypt_old || hs->exFlags.developer_encrypt ) { MI_CpuCopy8( hs->title_name, SYSMi_GetWork()->keyAES, AES_KEY_SIZE ); }else @@ -307,14 +307,14 @@ void SYSM_StartDecryptAESRegion( ROM_Header_Short *hs ) } // Workに開発/製品情報を格納 - SYSMi_GetWork()->isDeveloperAESMode = ( hs->developer_encrypt ? TRUE : FALSE ); + SYSMi_GetWork()->isDeveloperAESMode = ( hs->developer_encrypt_old || hs->exFlags.developer_encrypt ) ? TRUE : FALSE; // Workにカウンタの初期値セット MI_CpuCopy8( hs->main_static_digest, SYSMi_GetWork()->counterAES[0], AES_BLOCK_SIZE ); // 領域1初期値 MI_CpuCopy8( hs->sub_static_digest, SYSMi_GetWork()->counterAES[1], AES_BLOCK_SIZE ); // 領域2初期値 // Workに「鍵」or「シードとゲームコード」をセット - if( hs->developer_encrypt ) + if( hs->developer_encrypt_old || hs->exFlags.developer_encrypt ) { MI_CpuCopy8( hs->title_name, SYSMi_GetWork()->keyAES, AES_KEY_SIZE ); }else diff --git a/build/nandfirm/menu-launcher/ARM9/main.c b/build/nandfirm/menu-launcher/ARM9/main.c index cbc84dc5..af977228 100644 --- a/build/nandfirm/menu-launcher/ARM9/main.c +++ b/build/nandfirm/menu-launcher/ARM9/main.c @@ -218,7 +218,7 @@ static BOOL CheckHeader(void) OS_TPrintf("AES Encryption : %s\n", rhs->enable_aes ? "AVAILABLE" : "NOT AVAILABLE"); if ( rhs->enable_aes ) { - OS_TPrintf("AES Key Type : %s\n", rhs->developer_encrypt ? "FOR DEVELOPMENT" : "FOR PRODUCT"); + OS_TPrintf("AES Key Type : %s\n", ( rhs->developer_encrypt_old || rhs->exFlags.developer_encrypt ) ? "FOR DEVELOPMENT" : "FOR PRODUCT"); if ( rhs->aes_target_size ) { OS_TPrintf("AES address : %08X\n", rhs->aes_target_rom_offset); diff --git a/build/nandfirm/sdmc-launcher/ARM9/main.c b/build/nandfirm/sdmc-launcher/ARM9/main.c index 8e78fe6d..7948c609 100644 --- a/build/nandfirm/sdmc-launcher/ARM9/main.c +++ b/build/nandfirm/sdmc-launcher/ARM9/main.c @@ -187,7 +187,7 @@ static BOOL CheckHeader(void) OS_TPrintf("AES Encryption : %s\n", rhs->enable_aes ? "AVAILABLE" : "NOT AVAILABLE"); if ( rhs->enable_aes ) { - OS_TPrintf("AES Key Type : %s\n", rhs->developer_encrypt ? "FOR DEVELOPMENT" : "FOR PRODUCT"); + OS_TPrintf("AES Key Type : %s\n", ( rhs->developer_encrypt_old || rhs->exFlags.developer_encrypt ) ? "FOR DEVELOPMENT" : "FOR PRODUCT"); } // エントリポイント OS_TPrintf("ARM9 Entry point : %08X\n", rhs->main_entry_address); diff --git a/build/tools/attach_dummyromheader/attach_dummyromheader.c b/build/tools/attach_dummyromheader/attach_dummyromheader.c index 84cbe659..382b2b69 100644 --- a/build/tools/attach_dummyromheader/attach_dummyromheader.c +++ b/build/tools/attach_dummyromheader/attach_dummyromheader.c @@ -135,7 +135,7 @@ int main(int argc, char *argv[]) // rom_header.s.enable_signature:1; // enable ROM Header signature // rom_header.s.enable_aes:1; // enable AES encryption - // rom_header.s.developer_encrypt:1; // 開発用セキュリティがかかっている場合に"1"。製品版では"0" + // rom_header.s.developer_encrypt_old:1; // 開発用セキュリティがかかっている場合に"1"。製品版では"0" // u32 arm7_scfg_ext; // SCFG-EXT // u8 arm7_scfg_clk; // SCFG-CLK diff --git a/docs/format_ROM_Header.xls b/docs/format_ROM_Header.xls index 99a4f21746d08f6ef2a61837cdacf3d0b0ce491e..a5abb8c54e03589439a93608b1a6838b25171a2f 100644 GIT binary patch delta 9695 zcma)B33OCdn*MLSRHaf>DqCeKD*Mh7ldu?K2o-jaEkJ0XgAFJeaDfsR5U~>xlt75! z6-!V+z-DpusFT)+cxYsC-=}+ebT}^E?Q~C%ic7c7sF?Zg|L%LKVmopV_1?YTzkK(< z|J`2N-f*_P;e5*N5ZPS`j^;$^P4>#Fv}E~6T9sU%=9A-+a%Fa^SH6?vmBW)$aVD?Q0F>~YHlo+R0mmLz{l@yO(4pWNxMm2anI$?sCFHn;pTEky?W>*O`bS<;nO zD4$CnC{HC-$y2FWa&2;dxwDT;&P!P?KTMt=m-caW{XWGlpL~%P5zB z%kaz3{9f6RULu`YRq_sRihMS+Mh?xoH+{$f!oPTGnmxH<=8VbfD4%A;cfFsrel)^y z<-C)g);UxPi6fLvf*dsGyv0jr$OAl)=296;dr|YDrb@C#Q>dL*0adaNJVTUX*97D) zK}|SZz#OQVQij~uG9WOM%7GoBR3Py*-7Yia-&;nDc6rI-%+}d7kY&7NKx#IZIJRPt z6SWE(b!pVC(FD}1Y}BJsvrh*4G@Gg!^}(`FqwV0X7{&n!Q5sRJt_lbY(#GP>A`-_$ z2HR*XkvLLBhS+Elz!4b?s!=!)!FxwUb@f zYS+$lT)TjTDBX&I3qwDfF4M-;a7GV?i;2|PXe<#I6B%x!u|!-NeHOQ#dvn2MmnC7AUBJ(R4o}bD+}Cc z4N)e3&$L3+%@LTvqF&TuBjDx;%(T(i2)IFRE;TWl0bLJj(ZzC^0ErM~;a8DMfX7BK zCR%cYyr?=*RmGeE3G7k;Hqls@36P&n4eV0s#s)os<1vy^A5c5-cDvhdPoR->3)+uR2JCz2O1jD}i&XT@ zS=R?5AzFxE6^lLy!(6>!l%nQ(cOB(iEy z6G&tNwpKB+$ zTBt*mr|qZwEc?kz1Fb*TJ{C~eFVObWevWI>|vZ1kmXa50A@8$;5hR|F4GAC~c7U^vujk&ST}PAgb5*@Y@jDRSzK1z6ceX>&PtpiC+` zpwg_(c_{}Qkr@t?N)A&QW9xb}YEsDom1g>uQ6F@D8nr^53nYa6BKgIQ3E(hV+sQqP zLoPVXqf{M^TyU6&as@UF)u~+OFxJ+M<&eu9zSA6X&*7k^c?fH*KGWo3yqo9_Z7dH& zW^w$?VB~>F6RoyUmqtw@c_7k6zqV12M$KU4@wl`y>ci@y#zl>c3dSF440Zi;`3H{H zCi-8kpMRF`eD?i+HX7?YpMCe$A<9QsOzWoaeD)n=)JOR-zEubdU^RrzhUC;+6Q(uM z_u5OrSsV(O!__t#%b|cdBxw!>76-ZS*3kpnd8pLN6{1D>RbC4b>l^4TZLJW#u2V(& zSB!3*MSro|J=}ghb}3UU5qLJ#PjzJZL0`A%=9(Kvk3iJ zN^jbziRQlVA?a8_QvcIj#)a}&A>g@L-&|v6hGG61}oX%=WMW?D$g<4Yj}wrvZJ>L z`rJYpy5m){Eu2@s!nRlqTT{r-XgMybDxu7dTu$dJlMtAO)q$3^dIKxPZPh{RE>iBc zeGO(`VaoCxM}C?{)mD0Uio_cW73{s5!82 zT)4Dq8|uP4g(0SHV0@0oho6I&wpItjSW{Jp3aK7= zII7&(wY>EShw+yIL7BWQUDm7#yYOx-NR>CW^km&VXN(^kO|{1LuF^@kl1vo;bEc=~a)BcfO%gLt_4G^@c@=`D zh=2L8r)R1ttCFkN50qcaRBtZsTqz4+!1y>_+4Fvjp;G^b)8|5dxGAqIy}ew>j~;f( zksBIXH*Q^ZYxymaYrdQLhpPXsdaBAp_!v`Fj$^|Lx}IiY9h^k@Sg9t`cpMC`C?EUmf$?bqQ*y&QYa4b)Oqv0;02LXQVtmG=aC%jx5D7t!&m z&**L(|Kh&H!KCZJhUvmsKRqaa+;}HH+d3XG{sVPHwDhCyo}LLJE1{=nqNw~y1>gYq zO%kV1ssLO&NCn{gm*uZE4U7xWA(EY&`nsTNObBo!-(AyB{;;WO)O>Kd9-Dk@ujVuV z`54dZv98=izpiSjx==slw9X067acyjO+MUNVU*7>hv$>dunX^oJIMZSzxNYkrG{?a z9CqQ|n2^noZ_6KyS2Xm)mauy7T6*7m!f2RjnwoQe*oAk)ozL=L-+zO#SwkzfhFy3! z7Bke9@<6LFKGxWQNZ5sUV?v=)i|nrxiE`S5M~tc_Wp!!lz-aSD39&S zm)rN1%T;*x-`ALV8vBY93m9QhL*}`Wf39T8mb(uIOADVQ+Hja?#!E!czeRNH--%xP zkm$YtBKqJ9qCeqku=aboao(cH<_0*y2vikW-R*&=5LJwm%#TYW0&l&?lL(yZE$!*_6X=k$bTCJU_wS(|6<@spM0Bde}zSnPnHCwc1!17z6zAbd{ zNcTlQtSnOB98_eYbJ`l|AZwr&gPIWwvX{l$OVIKn!-wMnrWf^kE0wgO@$DQTHGZ zUiQj6UkHXw_Ub;oQ|F%_o8;LZ%qXav?;dzCvoxP=AaA<9c;PJvx_5T6m`duZx`$3_ zr2?&#=~Nfg4rv@M3NF;sy%3W7>1{1p2+0F-8Pau#TCc zvgIeTb!-Mh)*5s_4F-q3@)KAK+Y&=q!W>dR{$ylHJZDR& zEm}?;kROsy z*m7S&ZXwUt%OGc_ftpF`AbdcUyfh7K;5z84Hg)*jD(`wp?J;-jHg(|LCEtH3IKG4a zjeU4<$aSdM2jmD=`1+`o5c?PGjIal51SI$1hGp6x0gb(~?&Y8kV~El98VxbJ%tjl4 z?xcq_+MsxJ?S1*r4n2AsU(3;EMzNW8EjWtJy!cv)Mn^NcL8GG??Xl4@jCN{t45Rh0 zm*|j?ArCyhr;;V(%{xM z(c;3>SY4~mHQgyfl*Abemho9BGSw+2yHGK_b&Q^HiZLQG$1NHo!`vc2lBIrLiAQy% z`k51tsvBpOhKZ0AQ6c4^ixoAt|aGIFr zJg5#IktDyECJsjCn~x{WM~`2Wp|LETAJfdo3Owo#az^xS`)&5_=vX}*t+H6s+4HVi23fVv#Q}g0p zsQ7Nm7A3ZRk*$BcSHIZSSLax3Yx3e$tMoH-qV!8_{V6%N|597Ol=aPnj~8FAl>TlA zVz^a|{)ktEBO#Y#G}CN0&ytpbViqrF>x>#lF-;*!OwEt>bznb;Ujl+xYDoX#|d=a$$ z53=>o2BzN>mo-D9A)!3YB zSjXH%yi~(FNrh3IhS{9z3T;od(6Y7@FV#Y8Z)8O;d>O;$UgE{Vt>CU+xQ=0SBk^Jl zSMcdxcsO8d8&P*{7d;diP$UY_;fHBQWO|V((V-n-cVh(Wm|Kbm%em6oRwT-FXnpwP zrslTNf44|f1|H)%+5oNI4Wy7Bdp9TO&rPsMOPZ6f8|3r=I4cV4`>L z83o~8k-4QJFGo!~H8DrCV_eZN302L>qqenF)aX$ggQngcXACUtjeJ@vhH7{$!`7BF zmf^u=Vt@|8I6DO6n2ELfjAJHumWgy70x!OGs1T@}*7G48B#LJngj2Ya i8f#y5yef?Dl#$}JFA`oPT-}aF@vYw>>bt*3P5eJt($Mb! delta 9605 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 a6JPn`vFnAq+ci^sA8_5!)cse~#Qy{LQl7T}