mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ヘッダの正当性検証処理をstatic領域ロード直前のタイミングへ
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1409 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
0657f22398
commit
77d735af8c
@ -73,9 +73,9 @@ extern const u8 g_devPubKey[ 4 ][ 0x80 ];
|
|||||||
static s32 ReadFile( FSFile* pf, void* buffer, s32 size );
|
static s32 ReadFile( FSFile* pf, void* buffer, s32 size );
|
||||||
|
|
||||||
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle );
|
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle );
|
||||||
static void SYSMi_AppendRelocateInfoCardSecureArea( void );
|
|
||||||
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
|
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
|
||||||
static void SYSMi_makeTitleIdList( void );
|
static void SYSMi_makeTitleIdList( void );
|
||||||
|
static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Header *head );
|
||||||
|
|
||||||
// global variable-------------------------------------------------------------
|
// global variable-------------------------------------------------------------
|
||||||
// static variable-------------------------------------------------------------
|
// static variable-------------------------------------------------------------
|
||||||
@ -516,21 +516,29 @@ OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
|
|||||||
goto ERROR;
|
goto ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
//[TODO:]ヘッダ読み込みと同時に各種ハッシュ計算
|
//ヘッダ読み込みと同時に各種ハッシュ計算
|
||||||
|
{
|
||||||
|
BOOL result;
|
||||||
|
u32 len = MATH_ROUNDUP( (s32)sizeof(header), SYSM_ALIGNMENT_LOAD_MODULE );
|
||||||
|
CalcSHA1CallbackArg arg;
|
||||||
|
SVC_SHA1Init( &arg.ctx );
|
||||||
|
arg.hash_length = (u32)( isTwlApp ? TWL_ROM_HEADER_HASH_CALC_DATA_LEN : NTR_ROM_HEADER_HASH_CALC_DATA_LEN );
|
||||||
if(!isCardApp)
|
if(!isCardApp)
|
||||||
{
|
{
|
||||||
readLen = FS_ReadFile(file, header, (s32)sizeof(header));
|
result = FS_ReadFileViaWram(file, (void *)header, (s32)len, MI_WRAM_C,
|
||||||
|
WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, SYSMi_CalcSHA1Callback, &arg );
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
HOTSW_ReadCardData((void*) 0, (void*)header, (s32)sizeof(header));
|
result = HOTSW_ReadCardViaWram((void*) 0, (void*)header, (s32)len, MI_WRAM_C,
|
||||||
readLen = (s32)sizeof(header);
|
WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, SYSMi_CalcSHA1Callback, &arg );
|
||||||
}
|
}
|
||||||
|
SVC_SHA1GetHash( &arg.ctx, &s_calc_hash[0] );
|
||||||
if( readLen != (s32)sizeof(header) )
|
if ( !result )
|
||||||
{
|
{
|
||||||
OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", header, 0, sizeof(header), readLen);
|
OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", 0, len);
|
||||||
goto ERROR;
|
goto ERROR;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( head->s.nintendo_logo_crc16 != 0xCF56 )
|
if( head->s.nintendo_logo_crc16 != 0xCF56 )
|
||||||
{
|
{
|
||||||
@ -573,12 +581,22 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
//[TODO:]この時点でヘッダの正当性検証
|
//[TODO:]この時点でヘッダの正当性検証
|
||||||
|
// ※ROMヘッダ認証
|
||||||
|
if( AUTH_RESULT_SUCCEEDED != SYSMi_AuthenticateHeader( pBootTitle, head ) )
|
||||||
|
{
|
||||||
|
goto ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 正当性の検証されたヘッダを、本来のヘッダバッファへコピー
|
||||||
|
MI_CpuCopy8( head, (void*)SYSM_APP_ROM_HEADER_BUF, HW_TWL_ROM_HEADER_BUF_SIZE );
|
||||||
|
|
||||||
|
// ヘッダ読み込み完了直後の処理
|
||||||
|
// ヘッダ読み込み完了フラグを立てる
|
||||||
|
SYSMi_GetWork()->flags.common.isHeaderLoadCompleted = TRUE;
|
||||||
|
// HOTSW終了処理有効化
|
||||||
|
SYSMi_FinalizeHotSWAsync( pBootTitle, (void*)SYSM_APP_ROM_HEADER_BUF );
|
||||||
|
|
||||||
// 各領域を読み込む
|
// 各領域を読み込む
|
||||||
source [region_header ] = 0x00000000;
|
|
||||||
length [region_header ] = HW_TWL_ROM_HEADER_BUF_SIZE;
|
|
||||||
destaddr[region_header ] = SYSM_APP_ROM_HEADER_BUF;
|
|
||||||
|
|
||||||
source [region_arm9_ntr] = head->s.main_rom_offset;
|
source [region_arm9_ntr] = head->s.main_rom_offset;
|
||||||
length [region_arm9_ntr] = head->s.main_size;
|
length [region_arm9_ntr] = head->s.main_size;
|
||||||
destaddr[region_arm9_ntr] = (u32)head->s.main_ram_address;
|
destaddr[region_arm9_ntr] = (u32)head->s.main_ram_address;
|
||||||
@ -612,7 +630,10 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = region_header; i < region_max; ++i)
|
// AES初期化(ヘッダと再配置情報がそろってから)
|
||||||
|
(void)SYSM_InitDecryptAESRegion_W( (ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF );
|
||||||
|
|
||||||
|
for (i = region_arm9_ntr; i < region_max; ++i)
|
||||||
{
|
{
|
||||||
BOOL result;
|
BOOL result;
|
||||||
|
|
||||||
@ -638,14 +659,12 @@ OS_TPrintf("RebootSystem : Load VIA WRAM %d.\n", i);
|
|||||||
// 別スレッドで同じWRAM使おうとすると多分コケるので注意
|
// 別スレッドで同じWRAM使おうとすると多分コケるので注意
|
||||||
|
|
||||||
// コールバック関数に与える引数を初期化してRead
|
// コールバック関数に与える引数を初期化してRead
|
||||||
// [TODO:]ヘッダは先で読んだものをコピーするだけ
|
if( !isTwlApp && pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_TEMP )
|
||||||
if(region_header == i || (!isTwlApp && pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_TEMP ) )
|
|
||||||
{
|
{
|
||||||
// ヘッダか、NTRダウンロードアプリのモジュール
|
// NTRダウンロードアプリのモジュール
|
||||||
CalcSHA1CallbackArg arg;
|
CalcSHA1CallbackArg arg;
|
||||||
SVC_SHA1Init( &arg.ctx );
|
SVC_SHA1Init( &arg.ctx );
|
||||||
arg.hash_length = (u32)(region_header != i ? length[i] :
|
arg.hash_length = (u32)length[i];
|
||||||
(isTwlApp ? TWL_ROM_HEADER_HASH_CALC_DATA_LEN : NTR_ROM_HEADER_HASH_CALC_DATA_LEN) );
|
|
||||||
if(!isCardApp)
|
if(!isCardApp)
|
||||||
{
|
{
|
||||||
result = FS_ReadFileViaWram(file, (void *)destaddr[i], (s32)len, MI_WRAM_C,
|
result = FS_ReadFileViaWram(file, (void *)destaddr[i], (s32)len, MI_WRAM_C,
|
||||||
@ -688,18 +707,6 @@ OS_TPrintf("RebootSystem : Load VIA WRAM %d.\n", i);
|
|||||||
OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
|
OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
|
||||||
goto ERROR;
|
goto ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ヘッダ読み込み完了
|
|
||||||
if( i == region_header )
|
|
||||||
{
|
|
||||||
// ヘッダ読み込み完了フラグを立てる
|
|
||||||
SYSMi_GetWork()->flags.common.isHeaderLoadCompleted = TRUE;
|
|
||||||
// HOTSW終了処理有効化
|
|
||||||
SYSMi_FinalizeHotSWAsync( pBootTitle, (void*)destaddr[region_header] );
|
|
||||||
// WRAM経由ロードの場合はAES初期化
|
|
||||||
(void)SYSM_InitDecryptAESRegion_W( (ROM_Header_Short *)destaddr[region_header] );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isCardApp)
|
if(!isCardApp)
|
||||||
@ -769,29 +776,6 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// カードアプリのセキュア領域を再配置情報に追加
|
|
||||||
static void SYSMi_AppendRelocateInfoCardSecureArea( void )
|
|
||||||
{
|
|
||||||
u32 size;
|
|
||||||
u32 *dest;
|
|
||||||
// NTRセキュア領域の再配置は後でbootAPIおよびrebootライブラリにて行う
|
|
||||||
if( SYSM_GetCardRomHeader()->platform_code & PLATFORM_CODE_FLAG_TWL ) {
|
|
||||||
// TWLモード
|
|
||||||
// TWLセキュア領域の再配置
|
|
||||||
dest = SYSM_GetCardRomHeader()->main_ltd_ram_address;
|
|
||||||
DC_InvalidateRange( (void *)SYSM_CARD_TWL_SECURE_BUF, SECURE_AREA_SIZE ); // キャッシュケア
|
|
||||||
size = ( SYSM_GetCardRomHeader()->main_ltd_size < SECURE_AREA_SIZE ) ?
|
|
||||||
SYSM_GetCardRomHeader()->main_ltd_size : SECURE_AREA_SIZE;
|
|
||||||
// romの再配置情報を参照して、セキュア領域の再配置先を変更する必要が無いか調べる
|
|
||||||
if( SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC].src != NULL )
|
|
||||||
{
|
|
||||||
dest = (u32 *)SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC].src;
|
|
||||||
}
|
|
||||||
MI_CpuCopyFast( (void *)SYSM_CARD_TWL_SECURE_BUF, dest, size );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// アプリロード済みかどうかをチェック
|
// アプリロード済みかどうかをチェック
|
||||||
BOOL SYSM_IsLoadTitleFinished( void )
|
BOOL SYSM_IsLoadTitleFinished( void )
|
||||||
{
|
{
|
||||||
@ -820,54 +804,30 @@ BOOL SYSM_IsLoadTitleFinished( void )
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
// TWLアプリおよびNTR拡張NANDアプリ共通のヘッダ認証処理
|
// TWLアプリおよびNTR拡張NANDアプリ共通のヘッダ認証処理
|
||||||
static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
|
static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle, ROM_Header *head )
|
||||||
{
|
{
|
||||||
ROM_Header *head;
|
|
||||||
OSTick start,prev;
|
|
||||||
start = OS_GetTick();
|
|
||||||
|
|
||||||
head = ( ROM_Header *)SYSM_APP_ROM_HEADER_BUF;
|
|
||||||
|
|
||||||
// NANDアプリの場合、NAM_CheckTitleLaunchRights()を呼んでチェック
|
|
||||||
if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_NAND )
|
|
||||||
{
|
|
||||||
s32 result = NAM_CheckTitleLaunchRights( pBootTitle->titleID );
|
|
||||||
if( NAM_OK != result)
|
|
||||||
{
|
|
||||||
OS_TPrintf("Authenticate failed: NAM_CheckTitleLaunchRights failed. %d \n",result);
|
|
||||||
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
OS_TPrintf("Authenticate : NAM_CheckTitleLaunchRights succeed. %d ms.\n", OS_TicksToMilliSeconds(OS_GetTick() - start) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 署名処理
|
// 署名処理
|
||||||
{
|
|
||||||
const u8 *key;
|
const u8 *key;
|
||||||
u32 hi;
|
u32 hi;
|
||||||
u8 keynum;
|
u8 keynum;
|
||||||
SignatureData sigbuf;
|
SignatureData sigbuf;
|
||||||
SVCSignHeapContext con;
|
SVCSignHeapContext con;
|
||||||
int l;
|
|
||||||
u32 *module_addr[RELOCATE_INFO_NUM];
|
|
||||||
u32 module_size[RELOCATE_INFO_NUM];
|
|
||||||
u8 *hash_addr[RELOCATE_INFO_NUM];
|
|
||||||
int module_num;
|
|
||||||
BOOL b_dev = FALSE;
|
BOOL b_dev = FALSE;
|
||||||
char *gamecode = (char *)&(pBootTitle->titleID);
|
char *gamecode = (char *)&(pBootTitle->titleID);
|
||||||
|
OSTick start,prev;
|
||||||
|
start = OS_GetTick();
|
||||||
|
|
||||||
// pBootTitle->titleIDとROMヘッダのtitleIDの一致確認をする。
|
// pBootTitle->titleIDとROMヘッダのtitleIDの一致確認をする。
|
||||||
if( pBootTitle->titleID != head->s.titleID )
|
if( pBootTitle->titleID != head->s.titleID )
|
||||||
{
|
{
|
||||||
//TWL対応ROMで、ヘッダのtitleIDが起動指定されたIDと違う
|
//TWL対応ROMで、ヘッダのtitleIDが起動指定されたIDと違う
|
||||||
OS_TPrintf( "Authenticate failed: header TitleID error\n" );
|
OS_TPrintf( "Authenticate_Header failed: header TitleID error\n" );
|
||||||
OS_TPrintf( "Authenticate failed: selectedTitleID=%.16llx\n", pBootTitle->titleID );
|
OS_TPrintf( "Authenticate_Header failed: selectedTitleID=%.16llx\n", pBootTitle->titleID );
|
||||||
OS_TPrintf( "Authenticate failed: headerTitleID=%.16llx\n", head->s.titleID );
|
OS_TPrintf( "Authenticate_Header failed: headerTitleID=%.16llx\n", head->s.titleID );
|
||||||
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
OS_TPrintf( "Authenticate : header TitleID check succeed.\n" );
|
OS_TPrintf( "Authenticate_Header : header TitleID check succeed.\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
prev = OS_GetTick();
|
prev = OS_GetTick();
|
||||||
@ -923,7 +883,7 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
|
|||||||
SVC_InitSignHeap( &con, (void *)SIGN_HEAP_ADDR, SIGN_HEAP_SIZE );// ヒープの初期化
|
SVC_InitSignHeap( &con, (void *)SIGN_HEAP_ADDR, SIGN_HEAP_SIZE );// ヒープの初期化
|
||||||
if( !SVC_DecryptSign( &con, sigbuf.digest, head->signature, key ))
|
if( !SVC_DecryptSign( &con, sigbuf.digest, head->signature, key ))
|
||||||
{
|
{
|
||||||
OS_TPrintf("Authenticate failed: Sign decryption failed.\n");
|
OS_TPrintf("Authenticate_Header failed: Sign decryption failed.\n");
|
||||||
if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED;
|
if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
}
|
}
|
||||||
if(s_calc_hash)
|
if(s_calc_hash)
|
||||||
@ -931,17 +891,54 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
|
|||||||
// 署名のハッシュ値とヘッダのハッシュ値を比較
|
// 署名のハッシュ値とヘッダのハッシュ値を比較
|
||||||
if(!SVC_CompareSHA1(sigbuf.digest, (const void *)&s_calc_hash[0]))
|
if(!SVC_CompareSHA1(sigbuf.digest, (const void *)&s_calc_hash[0]))
|
||||||
{
|
{
|
||||||
OS_TPrintf("Authenticate failed: Sign check failed.\n");
|
OS_TPrintf("Authenticate_Header failed: Sign check failed.\n");
|
||||||
if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED;
|
if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
OS_TPrintf("Authenticate : Sign check succeed. %dms.\n", OS_TicksToMilliSeconds(OS_GetTick() - prev));
|
OS_TPrintf("Authenticate_Header : Sign check succeed. %dms.\n", OS_TicksToMilliSeconds(OS_GetTick() - prev));
|
||||||
}
|
}
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
OS_TPrintf("Authenticate failed: Sign check failed.\n");
|
OS_TPrintf("Authenticate_Header failed: Sign check failed.\n");
|
||||||
if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED;
|
if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
}
|
}
|
||||||
|
OS_TPrintf("Authenticate_Header : total %d ms.\n", OS_TicksToMilliSeconds(OS_GetTick() - start) );
|
||||||
|
|
||||||
|
return AUTH_RESULT_SUCCEEDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TWLアプリおよびNTR拡張NANDアプリ共通の認証
|
||||||
|
static AuthResult SYSMi_AuthenticateTWLTitle( TitleProperty *pBootTitle )
|
||||||
|
{
|
||||||
|
ROM_Header *head;
|
||||||
|
OSTick start,prev;
|
||||||
|
start = OS_GetTick();
|
||||||
|
|
||||||
|
head = ( ROM_Header *)SYSM_APP_ROM_HEADER_BUF;
|
||||||
|
|
||||||
|
// NANDアプリの場合、NAM_CheckTitleLaunchRights()を呼んでチェック
|
||||||
|
if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_NAND )
|
||||||
|
{
|
||||||
|
s32 result = NAM_CheckTitleLaunchRights( pBootTitle->titleID );
|
||||||
|
if( NAM_OK != result)
|
||||||
|
{
|
||||||
|
OS_TPrintf("Authenticate failed: NAM_CheckTitleLaunchRights failed. %d \n",result);
|
||||||
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
OS_TPrintf("Authenticate : NAM_CheckTitleLaunchRights succeed. %d ms.\n", OS_TicksToMilliSeconds(OS_GetTick() - start) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ハッシュ比較
|
||||||
|
{
|
||||||
|
int l;
|
||||||
|
u32 *module_addr[RELOCATE_INFO_NUM];
|
||||||
|
u32 module_size[RELOCATE_INFO_NUM];
|
||||||
|
u8 *hash_addr[RELOCATE_INFO_NUM];
|
||||||
|
int module_num;
|
||||||
|
BOOL b_dev = FALSE;
|
||||||
|
char *gamecode = (char *)&(pBootTitle->titleID);
|
||||||
|
|
||||||
// それぞれARM9,7のFLXおよびLTDについてハッシュを計算してヘッダに格納されているハッシュと比較
|
// それぞれARM9,7のFLXおよびLTDについてハッシュを計算してヘッダに格納されているハッシュと比較
|
||||||
module_addr[ARM9_STATIC] = head->s.main_ram_address;
|
module_addr[ARM9_STATIC] = head->s.main_ram_address;
|
||||||
@ -971,7 +968,7 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
|
|||||||
|
|
||||||
if(s_calc_hash)
|
if(s_calc_hash)
|
||||||
{
|
{
|
||||||
// カード以外のアプリをロードする時に計算したハッシュを検証
|
// アプリをロードする時に計算したハッシュを検証
|
||||||
if(!SVC_CompareSHA1((const void *)hash_addr[l], (const void *)&s_calc_hash[(l+1) * SVC_SHA1_DIGEST_SIZE]))
|
if(!SVC_CompareSHA1((const void *)hash_addr[l], (const void *)&s_calc_hash[(l+1) * SVC_SHA1_DIGEST_SIZE]))
|
||||||
{
|
{
|
||||||
OS_TPrintf("Authenticate failed: %s module hash check failed.\n", str[l]);
|
OS_TPrintf("Authenticate failed: %s module hash check failed.\n", str[l]);
|
||||||
@ -1004,13 +1001,27 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NTR版特殊NANDアプリ(pictochat等)のヘッダ認証処理
|
// NTR版特殊NANDアプリ(pictochat等)のヘッダ認証処理
|
||||||
static AuthResult SYSMi_AuthenticateNTRNandAppHeader( TitleProperty *pBootTitle)
|
static AuthResult SYSMi_AuthenticateNTRNandAppHeader( TitleProperty *pBootTitle, ROM_Header *head )
|
||||||
{
|
{
|
||||||
return SYSMi_AuthenticateTWLHeader( pBootTitle );
|
return SYSMi_AuthenticateTWLHeader( pBootTitle, head );
|
||||||
|
}
|
||||||
|
|
||||||
|
// NTR版特殊NANDアプリ(pictochat等)の認証
|
||||||
|
static AuthResult SYSMi_AuthenticateNTRNandTitle( TitleProperty *pBootTitle)
|
||||||
|
{
|
||||||
|
return SYSMi_AuthenticateTWLTitle( pBootTitle );
|
||||||
}
|
}
|
||||||
|
|
||||||
// NTR版ダウンロードアプリ(TMPアプリ)のヘッダ認証処理
|
// NTR版ダウンロードアプリ(TMPアプリ)のヘッダ認証処理
|
||||||
static AuthResult SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTitle)
|
static AuthResult SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTitle, ROM_Header *head )
|
||||||
|
{
|
||||||
|
#pragma unused(pBootTitle, head)
|
||||||
|
// [TODO:]署名はstaticに絡んでくるので、それ以外にヘッダ認証処理があれば
|
||||||
|
return AUTH_RESULT_SUCCEEDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NTR版ダウンロードアプリ(TMPアプリ)の認証
|
||||||
|
static AuthResult SYSMi_AuthenticateNTRDownloadTitle( TitleProperty *pBootTitle)
|
||||||
{
|
{
|
||||||
#pragma unused(pBootTitle)
|
#pragma unused(pBootTitle)
|
||||||
ROM_Header *head;
|
ROM_Header *head;
|
||||||
@ -1083,19 +1094,88 @@ static AuthResult SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NTR版カードアプリのヘッダ認証処理
|
// NTR版カードアプリのヘッダ認証処理
|
||||||
static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle)
|
static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, ROM_Header *head )
|
||||||
|
{
|
||||||
|
#pragma unused(pBootTitle,head)
|
||||||
|
// [TODO:]NTRカード ホワイトリストorホワイトリスト署名チェック
|
||||||
|
return AUTH_RESULT_SUCCEEDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NTR版カードアプリの認証
|
||||||
|
static AuthResult SYSMi_AuthenticateNTRCardTitle( TitleProperty *pBootTitle)
|
||||||
{
|
{
|
||||||
#pragma unused(pBootTitle)
|
#pragma unused(pBootTitle)
|
||||||
// [TODO:]NTRカード ホワイトリストorホワイトリスト署名チェック+DHTチェック
|
// [TODO:]DHTチェック
|
||||||
return AUTH_RESULT_SUCCEEDED;
|
return AUTH_RESULT_SUCCEEDED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ヘッダ認証
|
// ヘッダ認証
|
||||||
static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle)
|
static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Header *head )
|
||||||
|
{
|
||||||
|
ROM_Header_Short *hs = ( ROM_Header_Short *)head;
|
||||||
|
// [TODO:]認証結果はどこかワークに保存しておく?
|
||||||
|
// [TODO:]署名チェックを行う場合、ヘッダに署名ビットがあるはずなので、それを確認して署名チェックを行う
|
||||||
|
if( hs->platform_code & PLATFORM_CODE_FLAG_TWL )
|
||||||
|
{
|
||||||
|
// TWLアプリ
|
||||||
|
// 認証処理
|
||||||
|
switch( pBootTitle->flags.bootType )
|
||||||
|
{
|
||||||
|
case LAUNCHER_BOOTTYPE_NAND:
|
||||||
|
OS_TPrintf( "Authenticate_Header :TWL_NAND start.\n" );
|
||||||
|
return SYSMi_AuthenticateTWLHeader( pBootTitle, head );
|
||||||
|
case LAUNCHER_BOOTTYPE_ROM:
|
||||||
|
OS_TPrintf( "Authenticate_Header :TWL_ROM start.\n" );
|
||||||
|
return SYSMi_AuthenticateTWLHeader( pBootTitle, head );
|
||||||
|
case LAUNCHER_BOOTTYPE_TEMP:
|
||||||
|
OS_TPrintf( "Authenticate_Header :TWL_TEMP start.\n" );
|
||||||
|
if (!hs->permit_landing_tmp_jump)
|
||||||
|
{
|
||||||
|
OS_TPrintf("Authenticate failed: TMP flag error.\n");
|
||||||
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
|
}
|
||||||
|
return SYSMi_AuthenticateTWLHeader( pBootTitle, head );
|
||||||
|
default:
|
||||||
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( hs->platform_code & PLATFORM_CODE_FLAG_NOT_NTR )
|
||||||
|
{
|
||||||
|
// TWLでもNTRでもない不正なアプリ
|
||||||
|
OS_TPrintf( "Authenticate_Header failed :NOT NTR NOT TWL.\n" );
|
||||||
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
|
}
|
||||||
|
// NTRアプリ
|
||||||
|
switch( pBootTitle->flags.bootType )
|
||||||
|
{
|
||||||
|
case LAUNCHER_BOOTTYPE_NAND:
|
||||||
|
OS_TPrintf( "Authenticate_Header :NTR_NAND start.\n" );
|
||||||
|
return SYSMi_AuthenticateNTRNandAppHeader( pBootTitle, head );
|
||||||
|
case LAUNCHER_BOOTTYPE_TEMP:
|
||||||
|
OS_TPrintf( "Authenticate_Header :NTR_TEMP start.\n" );
|
||||||
|
if (!hs->permit_landing_tmp_jump)
|
||||||
|
{
|
||||||
|
OS_TPrintf("Authenticate_Header failed : TMP flag error.\n");
|
||||||
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
|
}
|
||||||
|
return SYSMi_AuthenticateNTRDownloadAppHeader( pBootTitle, head );
|
||||||
|
case LAUNCHER_BOOTTYPE_ROM:
|
||||||
|
OS_TPrintf( "Authenticate_Header :NTR_ROM start.\n" );
|
||||||
|
return SYSMi_AuthenticateNTRCardAppHeader( pBootTitle, head );
|
||||||
|
default:
|
||||||
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 認証
|
||||||
|
static AuthResult SYSMi_AuthenticateTitleCore( TitleProperty *pBootTitle)
|
||||||
{
|
{
|
||||||
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF;
|
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF;
|
||||||
// [TODO:]認証結果はどこかワークに保存しておく
|
// [TODO:]認証結果はどこかワークに保存しておく?
|
||||||
// [TODO:]ヘッダに署名ビットがあるはずなので、それを確認して署名チェックを行う
|
// [TODO:]署名チェックを行う場合、ヘッダに署名ビットがあるはずなので、それを確認して署名チェックを行う
|
||||||
if( hs->platform_code & PLATFORM_CODE_FLAG_TWL )
|
if( hs->platform_code & PLATFORM_CODE_FLAG_TWL )
|
||||||
{
|
{
|
||||||
// TWLアプリ
|
// TWLアプリ
|
||||||
@ -1104,10 +1184,10 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle)
|
|||||||
{
|
{
|
||||||
case LAUNCHER_BOOTTYPE_NAND:
|
case LAUNCHER_BOOTTYPE_NAND:
|
||||||
OS_TPrintf( "Authenticate :TWL_NAND start.\n" );
|
OS_TPrintf( "Authenticate :TWL_NAND start.\n" );
|
||||||
return SYSMi_AuthenticateTWLHeader( pBootTitle );
|
return SYSMi_AuthenticateTWLTitle( pBootTitle );
|
||||||
case LAUNCHER_BOOTTYPE_ROM:
|
case LAUNCHER_BOOTTYPE_ROM:
|
||||||
OS_TPrintf( "Authenticate :TWL_ROM start.\n" );
|
OS_TPrintf( "Authenticate :TWL_ROM start.\n" );
|
||||||
return SYSMi_AuthenticateTWLHeader( pBootTitle );
|
return SYSMi_AuthenticateTWLTitle( 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_landing_tmp_jump)
|
if (!hs->permit_landing_tmp_jump)
|
||||||
@ -1115,7 +1195,7 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle)
|
|||||||
OS_TPrintf("Authenticate failed: TMP flag error.\n");
|
OS_TPrintf("Authenticate failed: TMP flag error.\n");
|
||||||
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
}
|
}
|
||||||
return SYSMi_AuthenticateTWLHeader( pBootTitle );
|
return SYSMi_AuthenticateTWLTitle( pBootTitle );
|
||||||
default:
|
default:
|
||||||
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
}
|
}
|
||||||
@ -1133,7 +1213,7 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle)
|
|||||||
{
|
{
|
||||||
case LAUNCHER_BOOTTYPE_NAND:
|
case LAUNCHER_BOOTTYPE_NAND:
|
||||||
OS_TPrintf( "Authenticate :NTR_NAND start.\n" );
|
OS_TPrintf( "Authenticate :NTR_NAND start.\n" );
|
||||||
return SYSMi_AuthenticateNTRNandAppHeader( pBootTitle );
|
return SYSMi_AuthenticateNTRNandTitle( 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_landing_tmp_jump)
|
if (!hs->permit_landing_tmp_jump)
|
||||||
@ -1141,10 +1221,10 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle)
|
|||||||
OS_TPrintf("Authenticate failed: TMP flag error.\n");
|
OS_TPrintf("Authenticate failed: TMP flag error.\n");
|
||||||
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
}
|
}
|
||||||
return SYSMi_AuthenticateNTRDownloadAppHeader( pBootTitle );
|
return SYSMi_AuthenticateNTRDownloadTitle( pBootTitle );
|
||||||
case LAUNCHER_BOOTTYPE_ROM:
|
case LAUNCHER_BOOTTYPE_ROM:
|
||||||
OS_TPrintf( "Authenticate :NTR_ROM start.\n" );
|
OS_TPrintf( "Authenticate :NTR_ROM start.\n" );
|
||||||
return SYSMi_AuthenticateNTRCardAppHeader( pBootTitle );
|
return SYSMi_AuthenticateNTRCardTitle( pBootTitle );
|
||||||
default:
|
default:
|
||||||
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
}
|
}
|
||||||
@ -1188,8 +1268,8 @@ static void SYSMi_AuthenticateTitleThreadFunc( TitleProperty *pBootTitle )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ※ROMヘッダ認証
|
// 認証
|
||||||
s_authResult = SYSMi_AuthenticateHeader( pBootTitle );
|
s_authResult = SYSMi_AuthenticateTitleCore( pBootTitle );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1260,6 +1340,7 @@ static void SYSMi_makeTitleIdList( void )
|
|||||||
{
|
{
|
||||||
// [TODO:]現在ブート不可タイトルについても入れるようにしているが
|
// [TODO:]現在ブート不可タイトルについても入れるようにしているが
|
||||||
// これで良いのか?
|
// これで良いのか?
|
||||||
|
// カード以外はもっと早いタイミングで作れるのでは?->高速化
|
||||||
OSTitleIDList *list = ( OSTitleIDList * )HW_OS_TITLE_ID_LIST;
|
OSTitleIDList *list = ( OSTitleIDList * )HW_OS_TITLE_ID_LIST;
|
||||||
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF;
|
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF;
|
||||||
int l;
|
int l;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user