From 60de8aeed5b3285bde12f5cbf103aad204407bdb Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Thu, 15 May 2008 06:35:20 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=9B=E3=83=AF=E3=82=A4=E3=83=88=E3=83=AA?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=81=AE?= =?UTF-8?q?=E7=B5=84=E3=81=BF=E8=BE=BC=E3=81=BF=E5=8F=8A=E3=81=B3=E3=83=98?= =?UTF-8?q?=E3=83=83=E3=83=80=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E5=A4=89=E6=9B=B4=E6=BA=96=E5=82=99?= 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@1361 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../sysmenu/ARM9/src/title.c | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index ff23b959..33c2ed27 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -43,7 +43,7 @@ #define AUTH_KEY_BUFFER_LEN 128 #define MB_AUTH_SIGN_SIZE (128) /* digital sign size */ -#define WRAM_SLOT_FOR_FS 4 +#define WRAM_SLOT_FOR_FS 5 #define WRAM_SIZE_FOR_FS MI_WRAM_SIZE_96KB typedef struct MbAuthCode @@ -462,8 +462,19 @@ OS_TPrintf("RebootSystem failed: cant open file\n"); s32 readLen; ROM_Header *head = (ROM_Header *)header; + // WRAM利用Read関数の準備、WRAMCのスロットのうち後ろ3つだけ解放しておく + FS_InitWramTransfer(3); + MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM7 ); + MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9 ); + MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_DSP ); + MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM7 ); + MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9 ); + MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_DSP ); + + // ハッシュ格納用バッファ(ヒープから取っているけど変更するかも) + s_calc_hash = SYSM_Alloc( region_max * SVC_SHA1_DIGEST_SIZE ); + // まずROMヘッダを読み込む - // (本来ならここでSRLの正当性判定) if(!isCardApp) { bSuccess = FS_SeekFile(file, 0x00000000, FS_SEEK_SET); @@ -478,6 +489,7 @@ OS_TPrintf("RebootSystem failed: cant seek file(0)\n"); goto ERROR; } + //[TODO:]ヘッダ読み込みと同時に各種ハッシュ計算 if(!isCardApp) { readLen = FS_ReadFile(file, header, (s32)sizeof(header)); @@ -533,6 +545,8 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode, } } + //[TODO:]この時点でヘッダの正当性検証 + // 各領域を読み込む source [region_header ] = 0x00000000; length [region_header ] = HW_TWL_ROM_HEADER_BUF_SIZE; @@ -571,22 +585,11 @@ OS_TPrintf("RebootSystem failed: cant read file(%p, %d, %d, %d)\n", &s_authcode, } } - // WRAM利用Read関数の準備、WRAMCの後半だけ解放しておく - FS_InitWramTransfer(3); - MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM7 ); - MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9 ); - MI_FreeWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_DSP ); - MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM7 ); - MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9 ); - MI_CancelWramSlot_C( WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_DSP ); - - s_calc_hash = SYSM_Alloc( region_max * SVC_SHA1_DIGEST_SIZE ); - for (i = region_header; i < region_max; ++i) { BOOL result; - u32 len = MATH_ROUNDUP( length[i], SYSM_ALIGNMENT_LOAD_MODULE );// AES暗号化領域の関係で、ロードサイズは32バイトアライメントに補正 + u32 len = MATH_ROUNDUP( length[i], SYSM_ALIGNMENT_LOAD_MODULE );// AESおよびDMA転送サイズの仕様で、ロードサイズは32バイトアライメントに補正 if ( !isTwlApp && i >= region_arm9_twl ) continue;// nitroでは読み込まない領域 if(!isCardApp) @@ -608,6 +611,7 @@ OS_TPrintf("RebootSystem : Load VIA WRAM %d.\n", i); // 別スレッドで同じWRAM使おうとすると多分コケるので注意 // コールバック関数に与える引数を初期化してRead + // [TODO:]ヘッダは先で読んだものをコピーするだけ if(region_header == i || (!isTwlApp && pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_TEMP ) ) { // ヘッダか、NTRダウンロードアプリのモジュール @@ -627,6 +631,11 @@ OS_TPrintf("RebootSystem : Load VIA WRAM %d.\n", i); SVC_SHA1GetHash( &arg.ctx, &s_calc_hash[i * SVC_SHA1_DIGEST_SIZE] ); }else { + //[TODO:]TWLアプリとNTRNANDアプリはこのままで良いが、NTRカードアプリはDHTのため更に処理を分ける必要あり + // ヘッダ署名用にヘッダのSHA1(HMACでない)をとりつつ(これは上でやっている) + // DHTチェックphase1用のハッシュを計算(DHT_CheckHashPhase1Update 関数)し、結果まで出しておく + // DHTチェック用にヘッダのHMACSHA1を計算する必要もあるが面倒なのでヘッダ読み込み後に + // DHT_CheckHashPhase1Init を呼べば良い気もする(最小単位32KBよりも小さいし) // それ以外 CalcHMACSHA1CallbackArg arg; SVC_HMACSHA1Init( &arg.ctx, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1 ); @@ -639,6 +648,11 @@ OS_TPrintf("RebootSystem : Load VIA WRAM %d.\n", i); { 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 ); + //speed test code + /* + HOTSW_ReadCardData((void *)source[i], (void *)destaddr[i], (u32)len); + SVC_HMACSHA1Update( &arg.ctx, (void *)destaddr[i], length[i] ); + */ } SVC_HMACSHA1GetHash( &arg.ctx, &s_calc_hash[i * SVC_SHA1_DIGEST_SIZE] ); } @@ -1039,6 +1053,14 @@ static AuthResult SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTi return AUTH_RESULT_SUCCEEDED; } +// NTR版カードアプリのヘッダ認証処理 +static AuthResult SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle) +{ +#pragma unused(pBootTitle) + // [TODO:]NTRカード ホワイトリストorホワイトリスト署名チェック+DHTチェック + return AUTH_RESULT_SUCCEEDED; +} + // ヘッダ認証 static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle) { @@ -1093,8 +1115,7 @@ static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle) return SYSMi_AuthenticateNTRDownloadAppHeader( pBootTitle ); case LAUNCHER_BOOTTYPE_ROM: OS_TPrintf( "Authenticate :NTR_ROM start.\n" ); - // NTRカードは今のところ認証予定無し - return AUTH_RESULT_SUCCEEDED; + return SYSMi_AuthenticateNTRCardAppHeader( pBootTitle ); default: return AUTH_RESULT_AUTHENTICATE_FAILED; }