From fd9db3ca3afc23c7cf85e11d3b6c1402e549ce22 Mon Sep 17 00:00:00 2001 From: yutaka Date: Tue, 15 Apr 2008 07:05:05 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E6=B8=88=E3=81=BFDS=E3=82=BD=E3=83=95=E3=83=88?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=20(DHT=5FTEST=3DTRUE=E6=99=82)?= 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@1142 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/libraries_sysmenu/dht/common/src/dht.c | 33 ++++++--- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 72 ++++++++++--------- build/tests/CheckDSHashTable/src/main.c | 4 +- include/sysmenu/dht/dht.h | 12 ++-- 4 files changed, 70 insertions(+), 51 deletions(-) diff --git a/build/libraries_sysmenu/dht/common/src/dht.c b/build/libraries_sysmenu/dht/common/src/dht.c index 90f2220b..bf918760 100644 --- a/build/libraries_sysmenu/dht/common/src/dht.c +++ b/build/libraries_sysmenu/dht/common/src/dht.c @@ -238,22 +238,22 @@ void DHT_CheckHashPhase1Update(SVCHMACSHA1Context* ctx, const void* ptr, u32 len // ARM9 or ARM7 static SVC_HMACSHA1Update(ctx, ptr, length); } -BOOL DHT_CheckHashPhase1Final(SVCHMACSHA1Context* ctx, const DHTDatabase *db) +BOOL DHT_CheckHashPhase1Final(SVCHMACSHA1Context* ctx, const u8 *hash) { u8 md[20]; BOOL result; SVC_HMACSHA1GetHash(ctx, md); - result = SVC_CompareSHA1(db->hash[0], md); + result = SVC_CompareSHA1(hash, md); if ( !result ) { OS_TPrintf("\n"); - OS_TPrintfEx("DB = % 20B\n", db->hash[0]); + OS_TPrintfEx("DB = % 20B\n", hash); OS_TPrintfEx("HASH = % 20B\n", md); OS_TPrintf("%s: hash[0] is not valid.\n", __func__); } return result; } -BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHeader, const void* pARM9, const void* pARM7) +BOOL DHT_CheckHashPhase1(const u8* hash, const ROM_Header_Short* pROMHeader, const void* pARM9, const void* pARM7) { SVCHMACSHA1Context ctx; BOOL result; @@ -271,7 +271,7 @@ BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHead DHT_CheckHashPhase1Update(&ctx, pARM7, pROMHeader->sub_size); // 検証 PROFILE_COUNT(); - result = DHT_CheckHashPhase1Final(&ctx, db); + result = DHT_CheckHashPhase1Final(&ctx, hash); // 結果報告 #ifdef PRINT_PROFILE PROFILE_COUNT(); @@ -303,14 +303,25 @@ static BOOL ImageHMACSHA1Update(SVCHMACSHA1Context* ctx, s32 offset, s32 length, static BOOL GetOverlayInfo(int no, int fat_offset, int* pOffset, int* pLength) { ROM_FAT *fat; - static u8 fat_cache[PAGE_SIZE]; // 本当にページをまたがないのか? + static u8 fat_cache[PAGE_SIZE*2]; static int last_page = 0; int page = (fat_offset + no * (s32)sizeof(ROM_FAT)) / PAGE_SIZE; if ( last_page != page ) { - if ( !ReadFunc(&fat_cache, page * PAGE_SIZE, PAGE_SIZE, readArg) ) + if ( last_page + 1 == page ) // 1ページはキャッシュ済み { - return FALSE; + MI_CpuCopy8( &fat_cache[PAGE_SIZE], &fat_cache[0], PAGE_SIZE ); + if ( !ReadFunc(&fat_cache[PAGE_SIZE], (page+1) * PAGE_SIZE, PAGE_SIZE, readArg) ) + { + return FALSE; + } + } + else // 通常は2ページ読み + { + if ( !ReadFunc(fat_cache, page * PAGE_SIZE, PAGE_SIZE*2, readArg) ) + { + return FALSE; + } } last_page = page; } @@ -326,7 +337,7 @@ static BOOL GetOverlayInfo(int no, int fat_offset, int* pOffset, int* pLength) return TRUE; } -BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHeader, void* buffer, DHTReadFunc func, void* arg) +BOOL DHT_CheckHashPhase2(const u8* hash, const ROM_Header_Short* pROMHeader, void* buffer, DHTReadFunc func, void* arg) { int overlay_nums = (int)(pROMHeader->main_ovt_size / sizeof(ROM_OVT)); u8 md[20]; @@ -400,10 +411,10 @@ BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHead PROFILE_COUNT(); MI_CpuClear8(md, sizeof(md)); } - if ( !SVC_CompareSHA1(md, db->hash[1]) ) + if ( !SVC_CompareSHA1(md, hash) ) { OS_TPrintf("\n"); - OS_TPrintfEx("DB = % 20B\n", db->hash[1]); + OS_TPrintfEx("DB = % 20B\n", hash); OS_TPrintfEx("HASH = % 20B\n", md); OS_TPrintf("%s: hash[1] is not valid.\n", __func__); return FALSE; diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index bf6eb627..debf06bc 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -894,11 +894,12 @@ static HotSwState LoadStaticModule(void) #ifdef DHT_TEST else { - if ( !s_cbData.pBootSegBuf->rh.s.enable_signature ) + SVCHMACSHA1Context ctx; + const u8* hash0; + const u8* hash1; + if ( !s_cbData.pBootSegBuf->rh.s.enable_signature ) // ホワイトリストエントリ { - SVCHMACSHA1Context ctx; const DHTDatabase* db; - while (!dht) { OS_Sleep(1); @@ -912,35 +913,42 @@ static HotSwState LoadStaticModule(void) return HOTSW_HASH_CHECK_ERROR; } OS_TPrintf(" Done.\n"); - - OS_TPrintf("DHT Pahse1..."); - DHT_CheckHashPhase1Init(&ctx, (ROM_Header_Short*)s_cbData.pBootSegBuf); - if( s_cbData.pBootSegBuf->rh.s.main_size > SECURE_SEGMENT_SIZE ) - { - DHT_CheckHashPhase1Update(&ctx, s_cbData.pSecureSegBuf, SECURE_SEGMENT_SIZE); - DHT_CheckHashPhase1Update(&ctx, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE ); - } - else - { - DHT_CheckHashPhase1Update(&ctx, s_cbData.pSecureSegBuf, s_cbData.pBootSegBuf->rh.s.main_size); - } - - DHT_CheckHashPhase1Update(&ctx, (u32 *)s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size); - if ( !DHT_CheckHashPhase1Final(&ctx, db) ) - { - OS_TPrintf(" Failed.\n"); - return HOTSW_HASH_CHECK_ERROR; - } - OS_TPrintf(" Done.\n"); - - OS_TPrintf("DHT Pahse2..."); - if ( !DHT_CheckHashPhase2(db, &s_cbData.pBootSegBuf->rh.s, ov_buffer, ReadImage, &s_cbData) ) - { - OS_TPrintf(" Failed.\n"); - return HOTSW_HASH_CHECK_ERROR; - } - OS_TPrintf(" Done.\n"); + hash0 = db->hash[0]; + hash1 = db->hash[1]; } + else // マスタリング済みエントリ + { + hash0 = s_cbData.pBootSegBuf->rh.s.main_static_digest; + hash1 = s_cbData.pBootSegBuf->rh.s.sub_static_digest; + } + + OS_TPrintf("DHT Pahse1..."); + DHT_CheckHashPhase1Init(&ctx, (ROM_Header_Short*)s_cbData.pBootSegBuf); + if( s_cbData.pBootSegBuf->rh.s.main_size > SECURE_SEGMENT_SIZE ) + { + DHT_CheckHashPhase1Update(&ctx, s_cbData.pSecureSegBuf, SECURE_SEGMENT_SIZE); + DHT_CheckHashPhase1Update(&ctx, (u32 *)(s_cbData.arm9Stc + SECURE_SEGMENT_SIZE), s_cbData.pBootSegBuf->rh.s.main_size - SECURE_SEGMENT_SIZE ); + } + else + { + DHT_CheckHashPhase1Update(&ctx, s_cbData.pSecureSegBuf, s_cbData.pBootSegBuf->rh.s.main_size); + } + + DHT_CheckHashPhase1Update(&ctx, (u32 *)s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size); + if ( !DHT_CheckHashPhase1Final(&ctx, hash0) ) + { + OS_TPrintf(" Failed.\n"); + return HOTSW_HASH_CHECK_ERROR; + } + OS_TPrintf(" Done.\n"); + + OS_TPrintf("DHT Pahse2..."); + if ( !DHT_CheckHashPhase2(hash1, &s_cbData.pBootSegBuf->rh.s, ov_buffer, ReadImage, &s_cbData) ) + { + OS_TPrintf(" Failed.\n"); + return HOTSW_HASH_CHECK_ERROR; + } + OS_TPrintf(" Done.\n"); } #endif @@ -1044,7 +1052,7 @@ static void GenVA_VB_VD(void) SYSM_work* sw = SYSMi_GetWork(); u32 dummy = 0; MATHRandContext32 rnd; - + // 乱数を初期化 // チック&RTC初回ロード値を種とする。 // (起動する度に変化するパラメータと組み合わせる。 diff --git a/build/tests/CheckDSHashTable/src/main.c b/build/tests/CheckDSHashTable/src/main.c index 16d784fb..533650ad 100644 --- a/build/tests/CheckDSHashTable/src/main.c +++ b/build/tests/CheckDSHashTable/src/main.c @@ -154,12 +154,12 @@ static BOOL CheckValidation(FSFile* fp) } //OS_TPrintf("FOUND: 0x%08X: %.4s(%d)\n", db, db->game_code, db->rom_version); // ハッシュ計算 (1) - 隠蔽可能なはず - if ( !DHT_CheckHashPhase1(db, &rom_header, rom_arm9, rom_arm7) ) + if ( !DHT_CheckHashPhase1(db->hash[0], &rom_header, rom_arm9, rom_arm7) ) { return FALSE; } // ハッシュ計算 (2) - 隠蔽は難しいか - if ( !DHT_CheckHashPhase2(db, &rom_header, ov_buffer, ReadImage, fp) ) + if ( !DHT_CheckHashPhase2(db->hash[1], &rom_header, ov_buffer, ReadImage, fp) ) { return FALSE; } diff --git a/include/sysmenu/dht/dht.h b/include/sysmenu/dht/dht.h index 7f79a945..f578468f 100644 --- a/include/sysmenu/dht/dht.h +++ b/include/sysmenu/dht/dht.h @@ -106,25 +106,25 @@ void DHT_CheckHashPhase1Update(SVCHMACSHA1Context* ctx, const void* ptr, u32 len Description: ROMヘッダおよびARM9/ARM7スタティック領域の検証の結果判定 Arguments: ctx 検証用のSVCHMACSHA1コンテキスト - db 対象データベースへのポインタ + hash 対応するハッシュ (db->hash[0]) Returns: 問題なければTRUE *---------------------------------------------------------------------------*/ -BOOL DHT_CheckHashPhase1Final(SVCHMACSHA1Context* ctx, const DHTDatabase *db); +BOOL DHT_CheckHashPhase1Final(SVCHMACSHA1Context* ctx, const u8* hash); /*---------------------------------------------------------------------------* Name: DHT_CheckHashPhase1 Description: ROMヘッダおよびARM9/ARM7スタティック領域の検証 - Arguments: db 対象データベースへのポインタ + Arguments: hash 対応するハッシュ (db->hash[0]) pROMHeader 対象となるROMヘッダ格納先 pARM9 対象となるARM9スタティック格納先 pARM7 対象となるARM7スタティック格納先 Returns: 問題なければTRUE *---------------------------------------------------------------------------*/ -BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHeader, const void* pARM9, const void* pARM7); +BOOL DHT_CheckHashPhase1(const u8* hash, const ROM_Header_Short* pROMHeader, const void* pARM9, const void* pARM7); /*---------------------------------------------------------------------------* Name: DHT_CheckHashPhase2 @@ -132,7 +132,7 @@ BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHead Description: オーバーレイ領域の検証 (デバイスのRead APIを登録できるべき) - Arguments: db 対象データベースへのポインタ + Arguments: hash 対応するハッシュ (db->hash[1]) pROMHeader 対象となるROMヘッダ格納先 fctx (FS版) FSFile構造体へのポインタ (CARD版) dma番号をvoid*にキャストしたもの @@ -141,7 +141,7 @@ BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHead Returns: 問題なければTRUE *---------------------------------------------------------------------------*/ -BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHeader, void* buffer, DHTReadFunc func, void* arg); +BOOL DHT_CheckHashPhase2(const u8* hash, const ROM_Header_Short* pROMHeader, void* buffer, DHTReadFunc func, void* arg); #ifdef __cplusplus } /* extern "C" */