From 8bbf34aee9e78a07074c8cbfd309405a8b25a268 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Thu, 21 Feb 2008 04:26:41 +0000 Subject: [PATCH] =?UTF-8?q?=E9=96=8B=E7=99=BA=E7=89=88TWL=E3=82=A2?= =?UTF-8?q?=E3=83=97=E3=83=AA=E3=81=A7=E3=81=AF=E7=BD=B2=E5=90=8D=E3=83=81?= =?UTF-8?q?=E3=82=A7=E3=83=83=E3=82=AF=E5=A4=B1=E6=95=97=E3=81=A7=E3=82=82?= =?UTF-8?q?=E5=BC=B7=E5=88=B6=E7=9A=84=E3=81=AB=E8=B5=B7=E5=8B=95=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=80=81=E4=B8=80=E6=99=82=E7=9A=84?= =?UTF-8?q?=E3=81=AA=E5=A4=89=E6=9B=B4=20=EF=BC=88=E3=81=9F=E3=81=A0?= =?UTF-8?q?=E3=81=97=E3=80=81=E7=BD=B2=E5=90=8D=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E7=B5=90=E6=9E=9C=E3=81=AF=E3=82=B3=E3=83=B3=E3=82=BD?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E3=81=AB=E8=A1=A8=E7=A4=BA=E3=81=95=E3=82=8C?= =?UTF-8?q?=E3=82=8B=EF=BC=89?= 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@711 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../sysmenu/ARM9/src/title.c | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index d576afa2..ecbeda14 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -389,7 +389,7 @@ OS_TPrintf("RebootSystem failed: cant seek file(0)\n"); return; } - readLen = FS_ReadFile(file, header, (s32)sizeof(header)); + readLen = ReadFile(file, header, (s32)sizeof(header)); if( readLen != (s32)sizeof(header) ) { @@ -634,6 +634,7 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle ) u32 module_size[RELOCATE_INFO_NUM]; u8 *hash_addr[RELOCATE_INFO_NUM]; int module_num; + BOOL b_dev = FALSE; // pBootTitle->titleIDとROMヘッダのtitleIDの一致確認をする。 if( pBootTitle->titleID != head->s.titleID ) @@ -659,6 +660,7 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle ) }else { // 開発版 key = g_devPubKey[keynum]; + b_dev = TRUE; } // 署名を鍵で復号 MI_CpuClear8( buf, 0x80 ); @@ -666,7 +668,7 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle ) if( !SVC_DecryptSign( &con, buf, head->signature, key )) { OS_TPrintf("Authenticate failed: Sign decryption failed.\n"); - return AUTH_RESULT_AUTHENTICATE_FAILED; + if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED; } // ヘッダのハッシュ(SHA1)計算 SVC_CalcSHA1( calculated_hash, (const void*)head, ROM_HEADER_HASH_CALC_DATA_LEN ); @@ -674,7 +676,7 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle ) if(!SVC_CompareSHA1((const void *)(&buf[ROM_HEADER_HASH_OFFSET]), (const void *)calculated_hash)) { OS_TPrintf("Authenticate failed: Sign check failed.\n"); - return AUTH_RESULT_AUTHENTICATE_FAILED; + if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED; }else { OS_TPrintf("Authenticate : Sign check succeed. %dms.\n", OS_TicksToMilliSeconds(OS_GetTick() - prev)); @@ -732,7 +734,7 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle ) if(!SVC_CompareSHA1((const void *)hash_addr[l], (const void *)calculated_hash)) { OS_TPrintf("Authenticate failed: %s module hash check failed.\n", str[l]); - return AUTH_RESULT_AUTHENTICATE_FAILED; + if(!b_dev) return AUTH_RESULT_AUTHENTICATE_FAILED; }else { OS_TPrintf("Authenticate : %s module hash check succeed. %dms.\n", str[l], OS_TicksToMilliSeconds(OS_GetTick() - prev)); @@ -761,6 +763,8 @@ static AuthResult SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTi // 署名処理 { + u8 buf[0x80]; + SVCSignHeapContext con; u8 calculated_hash[SVC_SHA1_DIGEST_SIZE * 3]; u8 final_hash[SVC_SHA1_DIGEST_SIZE]; int l; @@ -771,7 +775,16 @@ static AuthResult SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTi // [TODO:]pBootTitle->titleIDと、NTRヘッダのなんらかのデータとの一致確認をする。 // [TODO:]NTRダウンロードアプリ署名(DERフォーマット)の計算、ハッシュの取得。 - + MI_CpuClear8( buf, 0x80 ); + SVC_InitSignHeap( &con, (void *)SIGN_HEAP_ADDR, SIGN_HEAP_SIZE );// ヒープの初期化 + /* + if( !SVC_DecryptSign( &con, buf, head->signature, key )) + { + OS_TPrintf("Authenticate failed: Sign decryption failed.\n"); + return AUTH_RESULT_AUTHENTICATE_FAILED; + } + */ + // それぞれARM9,7のFLXについてハッシュを計算して、それら3つを並べたものに対してまたハッシュをとる module_addr[ARM9_STATIC] = head->s.main_ram_address; module_addr[ARM7_STATIC] = head->s.sub_ram_address; @@ -809,6 +822,7 @@ static AuthResult SYSMi_AuthenticateNTRDownloadAppHeader( TitleProperty *pBootTi // ヘッダ認証 static AuthResult SYSMi_AuthenticateHeader( TitleProperty *pBootTitle) { + // [TODO:]認証結果はどこかワークに保存しておく if( ( (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->platform_code ) != 0 ) { // TWLアプリ