TMPアプリフラグへの対応

ROMデータロードのソース中、ヘッダ情報をオフセット値ハードコードで参照していた部分を整理

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@762 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-02-28 06:25:04 +00:00
parent 83098065ad
commit c357efaf26
2 changed files with 37 additions and 21 deletions

View File

@ -428,7 +428,7 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", header, 0, s
return; return;
} }
if( header[0x15C] != 0x56 || header[0x15D] != 0xCF ) if( head->s.nintendo_logo_crc16 != 0xCF56 )
{ {
int i, j; int i, j;
for( i = 0; i < 0x20; ++i ) for( i = 0; i < 0x20; ++i )
@ -444,10 +444,9 @@ OS_TPrintf("RebootSystem failed: logo CRC error\n");
return; return;
} }
if( !(head->s.platform_code & PLATFORM_CODE_FLAG_TWL) )
if( !(header[0x12] & 0x03) )
{ {
//NTR<EFBFBD>ê—pROM //NTR専用ROM or NTR TWL両方非対応のアプリ
isTwlApp = FALSE; isTwlApp = FALSE;
if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_TEMP) if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_TEMP)
{ {
@ -476,23 +475,23 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode,
length [region_header ] = HW_TWL_ROM_HEADER_BUF_SIZE; length [region_header ] = HW_TWL_ROM_HEADER_BUF_SIZE;
destaddr[region_header ] = HW_TWL_ROM_HEADER_BUF; destaddr[region_header ] = HW_TWL_ROM_HEADER_BUF;
source [region_arm9_ntr] = *(const u32*)&header[0x020]; source [region_arm9_ntr] = head->s.main_rom_offset;
length [region_arm9_ntr] = *(const u32*)&header[0x02C]; length [region_arm9_ntr] = head->s.main_size;
destaddr[region_arm9_ntr] = *(const u32*)&header[0x028]; destaddr[region_arm9_ntr] = (u32)head->s.main_ram_address;
source [region_arm7_ntr] = *(const u32*)&header[0x030]; source [region_arm7_ntr] = head->s.sub_rom_offset;
length [region_arm7_ntr] = *(const u32*)&header[0x03C]; length [region_arm7_ntr] = head->s.sub_size;
destaddr[region_arm7_ntr] = *(const u32*)&header[0x038]; destaddr[region_arm7_ntr] = (u32)head->s.sub_ram_address;
if( isTwlApp ) if( isTwlApp )
{ {
source [region_arm9_twl] = *(const u32*)&header[0x1C0]; source [region_arm9_twl] = head->s.main_ltd_rom_offset;
length [region_arm9_twl] = *(const u32*)&header[0x1CC]; length [region_arm9_twl] = head->s.main_ltd_size;
destaddr[region_arm9_twl] = *(const u32*)&header[0x1C8]; destaddr[region_arm9_twl] = (u32)head->s.main_ltd_ram_address;
source [region_arm7_twl] = *(const u32*)&header[0x1D0]; source [region_arm7_twl] = head->s.sub_ltd_rom_offset;
length [region_arm7_twl] = *(const u32*)&header[0x1DC]; length [region_arm7_twl] = head->s.sub_ltd_size;
destaddr[region_arm7_twl] = *(const u32*)&header[0x1D8]; destaddr[region_arm7_twl] = (u32)head->s.sub_ltd_ram_address;
} }
// 領域読み込み先のチェック及び再配置情報データの作成 // 領域読み込み先のチェック及び再配置情報データの作成
@ -674,7 +673,7 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
// 署名処理 // 署名処理
{ {
const u8 *key; const u8 *key;
u16 prop; u32 hi;
u8 keynum; u8 keynum;
u8 buf[0x80]; u8 buf[0x80];
u8 calculated_hash[SVC_SHA1_DIGEST_SIZE]; u8 calculated_hash[SVC_SHA1_DIGEST_SIZE];
@ -700,9 +699,8 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
} }
prev = OS_GetTick(); prev = OS_GetTick();
prop = ((u16 *)&(pBootTitle->titleID))[2]; hi = head->s.titleID_Hi;
prop = (u16)(prop & 0x3); // prop = 0:UserApp 1:SystemApp 2:ShopApp? keynum = (u8)( (hi & TITLE_ID_SECURE_FLAG_MASK) ? 1 : ( (hi & TITLE_ID_HI_APP_TYPE_MASK) ? 0 : 2 ) ); // keynum = 0:SystemApp 1:SecureApp 2:UserApp
keynum = (u8)( prop == 0 ? 2 : (prop == 1 ? 0 : 1) );// keynum = 0:SystemApp 1:ShopApp 2:UserApp
// アプリ種別とボンディングオプションによって使う鍵を分ける // アプリ種別とボンディングオプションによって使う鍵を分ける
// #define LNC_PDTKEY_DBG // #define LNC_PDTKEY_DBG
#ifdef LNC_PDTKEY_DBG #ifdef LNC_PDTKEY_DBG
@ -922,8 +920,9 @@ static AuthResult SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTi
// ヘッダ認証 // ヘッダ認証
static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle) static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle)
{ {
ROM_Header_Short *hs = ( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF;
// [TODO:]認証結果はどこかワークに保存しておく // [TODO:]認証結果はどこかワークに保存しておく
if( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->platform_code ) != 0 ) if( hs->platform_code & PLATFORM_CODE_FLAG_TWL )
{ {
// TWLアプリ // TWLアプリ
switch( pBootTitle->flags.bootType ) switch( pBootTitle->flags.bootType )
@ -936,6 +935,11 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle)
return SYSMi_AuthenticateTWLHeader( pBootTitle ); return SYSMi_AuthenticateTWLHeader( pBootTitle );
case LAUNCHER_BOOTTYPE_TEMP: case LAUNCHER_BOOTTYPE_TEMP:
OS_TPrintf( "Authenticate :TWL_TEMP start.\n" ); OS_TPrintf( "Authenticate :TWL_TEMP start.\n" );
if (!hs->permit_tmp_jump)
{
OS_TPrintf("Authenticate failed: TMP flag error.\n");
return AUTH_RESULT_AUTHENTICATE_FAILED;
}
return SYSMi_AuthenticateTWLHeader( pBootTitle ); return SYSMi_AuthenticateTWLHeader( pBootTitle );
default: default:
return AUTH_RESULT_AUTHENTICATE_FAILED; return AUTH_RESULT_AUTHENTICATE_FAILED;
@ -943,6 +947,12 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle)
} }
else else
{ {
if( hs->platform_code & PLATFORM_CODE_FLAG_NOT_NTR )
{
// TWLでもNTRでもない不正なアプリ
OS_TPrintf( "Authenticate :NOT NTR NOT TWL.\n" );
return AUTH_RESULT_AUTHENTICATE_FAILED;
}
// NTRアプリ // NTRアプリ
switch( pBootTitle->flags.bootType ) switch( pBootTitle->flags.bootType )
{ {
@ -951,6 +961,11 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle)
return SYSMi_AuthenticateNTRNandAppHeader( pBootTitle ); return SYSMi_AuthenticateNTRNandAppHeader( pBootTitle );
case LAUNCHER_BOOTTYPE_TEMP: case LAUNCHER_BOOTTYPE_TEMP:
OS_TPrintf( "Authenticate :NTR_TEMP start.\n" ); OS_TPrintf( "Authenticate :NTR_TEMP start.\n" );
if (!hs->permit_tmp_jump)
{
OS_TPrintf("Authenticate failed: TMP flag error.\n");
return AUTH_RESULT_AUTHENTICATE_FAILED;
}
return SYSMi_AuthenticateNTRDownloadAppHeader( pBootTitle ); return SYSMi_AuthenticateNTRDownloadAppHeader( pBootTitle );
case LAUNCHER_BOOTTYPE_ROM: case LAUNCHER_BOOTTYPE_ROM:
OS_TPrintf( "Authenticate :NTR_ROM start.\n" ); OS_TPrintf( "Authenticate :NTR_ROM start.\n" );

View File

@ -274,6 +274,7 @@ void TwlMain( void )
case AUTH_RESULT_AUTHENTICATE_FAILED: case AUTH_RESULT_AUTHENTICATE_FAILED:
case AUTH_RESULT_ENTRY_ADDRESS_ERROR: case AUTH_RESULT_ENTRY_ADDRESS_ERROR:
state = STOP; state = STOP;
// [TODO:]クリアしたほうが良いデータ(鍵など)があれば消す
break; break;
} }
} }