mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
カード読み込み導入、ヘッダの検証処理まで成功
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1342 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
f88d4aaa49
commit
1980634f89
@ -124,6 +124,7 @@ CardDataReadState HOTSW_ReadCardData(void* src, void* dest, u32 size)
|
|||||||
{
|
{
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
|
SYSMi_GetWork()->flags.hotsw.isCardReadCompleted = FALSE;
|
||||||
|
|
||||||
return SYSMi_GetWork()->cardReadParam.result;
|
return SYSMi_GetWork()->cardReadParam.result;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -190,6 +190,11 @@ static void FSi_WramThread(void* arg)
|
|||||||
break;
|
break;
|
||||||
case FS_WRAM_COMMAND_READ_CARD:
|
case FS_WRAM_COMMAND_READ_CARD:
|
||||||
// カードリード
|
// カードリード
|
||||||
|
if(!FSi_IsValidAddressForARM7(cmd->addr, (u32)cmd->length))
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
HOTSW_ReadCardData( FSiWramWork.card_src, cmd->addr, (u32)cmd->length);
|
HOTSW_ReadCardData( FSiWramWork.card_src, cmd->addr, (u32)cmd->length);
|
||||||
result = cmd->length;//暫定
|
result = cmd->length;//暫定
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -417,6 +417,7 @@ static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )
|
|||||||
FSFile file[1];
|
FSFile file[1];
|
||||||
BOOL bSuccess;
|
BOOL bSuccess;
|
||||||
BOOL isTwlApp = TRUE;
|
BOOL isTwlApp = TRUE;
|
||||||
|
BOOL isCardApp = FALSE;
|
||||||
|
|
||||||
switch( pBootTitle->flags.bootType )
|
switch( pBootTitle->flags.bootType )
|
||||||
{
|
{
|
||||||
@ -425,7 +426,8 @@ static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )
|
|||||||
NAM_GetTitleBootContentPathFast(path, pBootTitle->titleID);
|
NAM_GetTitleBootContentPathFast(path, pBootTitle->titleID);
|
||||||
break;
|
break;
|
||||||
case LAUNCHER_BOOTTYPE_ROM:
|
case LAUNCHER_BOOTTYPE_ROM:
|
||||||
// TODO:CARD未読の場合の処理
|
// CARD
|
||||||
|
isCardApp = TRUE;
|
||||||
break;
|
break;
|
||||||
case LAUNCHER_BOOTTYPE_TEMP:
|
case LAUNCHER_BOOTTYPE_TEMP:
|
||||||
// tmpフォルダ
|
// tmpフォルダ
|
||||||
@ -436,8 +438,14 @@ static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FS_InitFile( file );
|
if(!isCardApp)
|
||||||
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
|
{
|
||||||
|
FS_InitFile( file );
|
||||||
|
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
bSuccess = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if( ! bSuccess )
|
if( ! bSuccess )
|
||||||
{
|
{
|
||||||
@ -456,7 +464,13 @@ OS_TPrintf("RebootSystem failed: cant open file\n");
|
|||||||
|
|
||||||
// まずROMヘッダを読み込む
|
// まずROMヘッダを読み込む
|
||||||
// (本来ならここでSRLの正当性判定)
|
// (本来ならここでSRLの正当性判定)
|
||||||
bSuccess = FS_SeekFile(file, 0x00000000, FS_SEEK_SET);
|
if(!isCardApp)
|
||||||
|
{
|
||||||
|
bSuccess = FS_SeekFile(file, 0x00000000, FS_SEEK_SET);
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
bSuccess = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if( ! bSuccess )
|
if( ! bSuccess )
|
||||||
{
|
{
|
||||||
@ -464,7 +478,14 @@ OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
|
|||||||
goto ERROR;
|
goto ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
readLen = FS_ReadFile(file, header, (s32)sizeof(header));
|
if(!isCardApp)
|
||||||
|
{
|
||||||
|
readLen = FS_ReadFile(file, header, (s32)sizeof(header));
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
HOTSW_ReadCardData((void*) 0, (void*)header, (s32)sizeof(header));
|
||||||
|
readLen = (s32)sizeof(header);
|
||||||
|
}
|
||||||
|
|
||||||
if( readLen != (s32)sizeof(header) )
|
if( readLen != (s32)sizeof(header) )
|
||||||
{
|
{
|
||||||
@ -496,7 +517,8 @@ OS_TPrintf("RebootSystem failed: logo CRC error\n");
|
|||||||
// NTR-DLアプリの場合はDLアプリ署名データを取得しておく
|
// NTR-DLアプリの場合はDLアプリ署名データを取得しておく
|
||||||
u32 valid_size = ( head->s.rom_valid_size ? head->s.rom_valid_size : 0x01000000 );
|
u32 valid_size = ( head->s.rom_valid_size ? head->s.rom_valid_size : 0x01000000 );
|
||||||
|
|
||||||
bSuccess = FS_SeekFile(file, (s32)valid_size, FS_SEEK_SET);
|
bSuccess = FS_SeekFile(file, (s32)valid_size, FS_SEEK_SET);
|
||||||
|
|
||||||
if( ! bSuccess )
|
if( ! bSuccess )
|
||||||
{
|
{
|
||||||
OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
|
OS_TPrintf("RebootSystem failed: cant seek file(0)\n");
|
||||||
@ -567,8 +589,13 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode,
|
|||||||
u32 len = MATH_ROUNDUP( length[i], SYSM_ALIGNMENT_LOAD_MODULE );// AES暗号化領域の関係で、ロードサイズは32バイトアライメントに補正
|
u32 len = MATH_ROUNDUP( length[i], SYSM_ALIGNMENT_LOAD_MODULE );// AES暗号化領域の関係で、ロードサイズは32バイトアライメントに補正
|
||||||
|
|
||||||
if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroでは読み込まない領域
|
if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroでは読み込まない領域
|
||||||
|
if(!isCardApp)
|
||||||
bSuccess = FS_SeekFile(file, (s32)source[i], FS_SEEK_SET);
|
{
|
||||||
|
bSuccess = FS_SeekFile(file, (s32)source[i], FS_SEEK_SET);
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
bSuccess = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if( ! bSuccess )
|
if( ! bSuccess )
|
||||||
{
|
{
|
||||||
@ -588,8 +615,15 @@ OS_TPrintf("RebootSystem : Load VIA WRAM %d.\n", i);
|
|||||||
SVC_SHA1Init( &arg.ctx );
|
SVC_SHA1Init( &arg.ctx );
|
||||||
arg.hash_length = (u32)(region_header != i ? length[i] :
|
arg.hash_length = (u32)(region_header != i ? length[i] :
|
||||||
(isTwlApp ? TWL_ROM_HEADER_HASH_CALC_DATA_LEN : NTR_ROM_HEADER_HASH_CALC_DATA_LEN) );
|
(isTwlApp ? TWL_ROM_HEADER_HASH_CALC_DATA_LEN : NTR_ROM_HEADER_HASH_CALC_DATA_LEN) );
|
||||||
result = FS_ReadFileViaWram(file, (void *)destaddr[i], (s32)len, MI_WRAM_C,
|
if(!isCardApp)
|
||||||
WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, SYSMi_CalcSHA1Callback, &arg );
|
{
|
||||||
|
result = FS_ReadFileViaWram(file, (void *)destaddr[i], (s32)len, MI_WRAM_C,
|
||||||
|
WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, SYSMi_CalcSHA1Callback, &arg );
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
result = HOTSW_ReadCardViaWram((void *)source[i], (void *)destaddr[i], (s32)len, MI_WRAM_C,
|
||||||
|
WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, SYSMi_CalcSHA1Callback, &arg );
|
||||||
|
}
|
||||||
SVC_SHA1GetHash( &arg.ctx, &s_calc_hash[i * SVC_SHA1_DIGEST_SIZE] );
|
SVC_SHA1GetHash( &arg.ctx, &s_calc_hash[i * SVC_SHA1_DIGEST_SIZE] );
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
@ -597,8 +631,15 @@ OS_TPrintf("RebootSystem : Load VIA WRAM %d.\n", i);
|
|||||||
CalcHMACSHA1CallbackArg arg;
|
CalcHMACSHA1CallbackArg arg;
|
||||||
SVC_HMACSHA1Init( &arg.ctx, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1 );
|
SVC_HMACSHA1Init( &arg.ctx, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1 );
|
||||||
arg.hash_length = length[i];
|
arg.hash_length = length[i];
|
||||||
result = FS_ReadFileViaWram(file, (void *)destaddr[i], (s32)len, MI_WRAM_C,
|
if(!isCardApp)
|
||||||
WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, SYSMi_CalcHMACSHA1Callback, &arg );
|
{
|
||||||
|
result = FS_ReadFileViaWram(file, (void *)destaddr[i], (s32)len, MI_WRAM_C,
|
||||||
|
WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, SYSMi_CalcHMACSHA1Callback, &arg );
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
result = HOTSW_ReadCardViaWram((void *)source[i], (void *)destaddr[i], (s32)len, MI_WRAM_C,
|
||||||
|
WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, SYSMi_CalcHMACSHA1Callback, &arg );
|
||||||
|
}
|
||||||
SVC_HMACSHA1GetHash( &arg.ctx, &s_calc_hash[i * SVC_SHA1_DIGEST_SIZE] );
|
SVC_HMACSHA1GetHash( &arg.ctx, &s_calc_hash[i * SVC_SHA1_DIGEST_SIZE] );
|
||||||
}
|
}
|
||||||
if ( !result )
|
if ( !result )
|
||||||
@ -618,14 +659,20 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)FS_CloseFile(file);
|
if(!isCardApp)
|
||||||
|
{
|
||||||
|
(void)FS_CloseFile(file);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
|
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ERROR:
|
ERROR:
|
||||||
(void)FS_CloseFile(file);
|
if(!isCardApp)
|
||||||
|
{
|
||||||
|
(void)FS_CloseFile(file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -660,14 +707,11 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
|
|||||||
if( !pBootTitle->flags.isAppLoadCompleted ) {
|
if( !pBootTitle->flags.isAppLoadCompleted ) {
|
||||||
SYSMi_GetWork()->flags.common.isLoadFinished = FALSE;
|
SYSMi_GetWork()->flags.common.isLoadFinished = FALSE;
|
||||||
|
|
||||||
if( pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM ) {
|
SYSMi_GetWork()->flags.common.isLoadSucceeded = FALSE;
|
||||||
SYSMi_AppendRelocateInfoCardSecureArea();
|
OS_InitThread();
|
||||||
}else {
|
OS_CreateThread( &s_thread, (void (*)(void *))SYSMi_LoadTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO );
|
||||||
SYSMi_GetWork()->flags.common.isLoadSucceeded = FALSE;
|
OS_WakeupThreadDirect( &s_thread );
|
||||||
OS_InitThread();
|
|
||||||
OS_CreateThread( &s_thread, (void (*)(void *))SYSMi_LoadTitleThreadFunc, (void*)pBootTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO );
|
|
||||||
OS_WakeupThreadDirect( &s_thread );
|
|
||||||
}
|
|
||||||
}else {
|
}else {
|
||||||
// アプリロード済み
|
// アプリロード済み
|
||||||
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
|
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
|
||||||
@ -710,14 +754,15 @@ BOOL SYSM_IsLoadTitleFinished( void )
|
|||||||
{
|
{
|
||||||
// ロード済みの時は、常にTRUE
|
// ロード済みの時は、常にTRUE
|
||||||
if( !SYSMi_GetWork()->flags.common.isLoadFinished ) {
|
if( !SYSMi_GetWork()->flags.common.isLoadFinished ) {
|
||||||
|
/*
|
||||||
if( SYSMi_GetWork()->flags.common.isCardBoot ) {
|
if( SYSMi_GetWork()->flags.common.isCardBoot ) {
|
||||||
// カードブートの時は、HOTSWライブラリのロード完了をチェック。
|
// カードブートの時は、HOTSWライブラリのロード完了をチェック。
|
||||||
SYSMi_GetWork()->flags.common.isLoadFinished = SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted;
|
SYSMi_GetWork()->flags.common.isLoadFinished = SYSMi_GetWork()->flags.hotsw.isCardLoadCompleted;
|
||||||
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
|
SYSMi_GetWork()->flags.common.isLoadSucceeded = TRUE;
|
||||||
}else {
|
}else {
|
||||||
// NANDブートの時は、ロードスレッドの完了をチェック。
|
*/
|
||||||
SYSMi_GetWork()->flags.common.isLoadFinished = OS_IsThreadTerminated( &s_thread );
|
// NANDブートの時は、ロードスレッドの完了をチェック。
|
||||||
}
|
SYSMi_GetWork()->flags.common.isLoadFinished = OS_IsThreadTerminated( &s_thread );
|
||||||
}
|
}
|
||||||
return SYSMi_GetWork()->flags.common.isLoadFinished ? TRUE : FALSE;
|
return SYSMi_GetWork()->flags.common.isLoadFinished ? TRUE : FALSE;
|
||||||
}
|
}
|
||||||
@ -894,7 +939,7 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
|
|||||||
}
|
}
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
OS_TPrintf("Authenticate failed: %s module hash check failed.\n", str[l]);
|
OS_TPrintf("Authenticate failed: %s module hash calc failed.\n", str[l]);
|
||||||
if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED;
|
if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SYSM_HOTSW_ENABLE_ROMEMU
|
#define SYSM_HOTSW_ENABLE_ROMEMU
|
||||||
//#define USE_WRAM_LOAD
|
#define USE_WRAM_LOAD
|
||||||
|
|
||||||
// enum -------------------------------------------------------------------
|
// enum -------------------------------------------------------------------
|
||||||
// スレッドに送るメッセージのステート
|
// スレッドに送るメッセージのステート
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user