マスタリング済みDSソフト対応 (DHT_TEST=TRUE時)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1142 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yutaka 2008-04-15 07:05:05 +00:00
parent 003982a6b5
commit fd9db3ca3a
4 changed files with 70 additions and 51 deletions

View File

@ -238,22 +238,22 @@ void DHT_CheckHashPhase1Update(SVCHMACSHA1Context* ctx, const void* ptr, u32 len
// ARM9 or ARM7 static // ARM9 or ARM7 static
SVC_HMACSHA1Update(ctx, ptr, length); SVC_HMACSHA1Update(ctx, ptr, length);
} }
BOOL DHT_CheckHashPhase1Final(SVCHMACSHA1Context* ctx, const DHTDatabase *db) BOOL DHT_CheckHashPhase1Final(SVCHMACSHA1Context* ctx, const u8 *hash)
{ {
u8 md[20]; u8 md[20];
BOOL result; BOOL result;
SVC_HMACSHA1GetHash(ctx, md); SVC_HMACSHA1GetHash(ctx, md);
result = SVC_CompareSHA1(db->hash[0], md); result = SVC_CompareSHA1(hash, md);
if ( !result ) if ( !result )
{ {
OS_TPrintf("\n"); OS_TPrintf("\n");
OS_TPrintfEx("DB = % 20B\n", db->hash[0]); OS_TPrintfEx("DB = % 20B\n", hash);
OS_TPrintfEx("HASH = % 20B\n", md); OS_TPrintfEx("HASH = % 20B\n", md);
OS_TPrintf("%s: hash[0] is not valid.\n", __func__); OS_TPrintf("%s: hash[0] is not valid.\n", __func__);
} }
return result; 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; SVCHMACSHA1Context ctx;
BOOL result; BOOL result;
@ -271,7 +271,7 @@ BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHead
DHT_CheckHashPhase1Update(&ctx, pARM7, pROMHeader->sub_size); DHT_CheckHashPhase1Update(&ctx, pARM7, pROMHeader->sub_size);
// ŒŸ<C592>Ø // ŒŸ<C592>Ø
PROFILE_COUNT(); PROFILE_COUNT();
result = DHT_CheckHashPhase1Final(&ctx, db); result = DHT_CheckHashPhase1Final(&ctx, hash);
// Œ‰Ê•ñ<E280A2><C3B1> // Œ‰Ê•ñ<E280A2><C3B1>
#ifdef PRINT_PROFILE #ifdef PRINT_PROFILE
PROFILE_COUNT(); 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) static BOOL GetOverlayInfo(int no, int fat_offset, int* pOffset, int* pLength)
{ {
ROM_FAT *fat; ROM_FAT *fat;
static u8 fat_cache[PAGE_SIZE]; // 本当にページをまたがないのか? static u8 fat_cache[PAGE_SIZE*2];
static int last_page = 0; static int last_page = 0;
int page = (fat_offset + no * (s32)sizeof(ROM_FAT)) / PAGE_SIZE; int page = (fat_offset + no * (s32)sizeof(ROM_FAT)) / PAGE_SIZE;
if ( last_page != page ) 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; last_page = page;
} }
@ -326,7 +337,7 @@ static BOOL GetOverlayInfo(int no, int fat_offset, int* pOffset, int* pLength)
return TRUE; 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)); int overlay_nums = (int)(pROMHeader->main_ovt_size / sizeof(ROM_OVT));
u8 md[20]; u8 md[20];
@ -400,10 +411,10 @@ BOOL DHT_CheckHashPhase2(const DHTDatabase *db, const ROM_Header_Short* pROMHead
PROFILE_COUNT(); PROFILE_COUNT();
MI_CpuClear8(md, sizeof(md)); MI_CpuClear8(md, sizeof(md));
} }
if ( !SVC_CompareSHA1(md, db->hash[1]) ) if ( !SVC_CompareSHA1(md, hash) )
{ {
OS_TPrintf("\n"); OS_TPrintf("\n");
OS_TPrintfEx("DB = % 20B\n", db->hash[1]); OS_TPrintfEx("DB = % 20B\n", hash);
OS_TPrintfEx("HASH = % 20B\n", md); OS_TPrintfEx("HASH = % 20B\n", md);
OS_TPrintf("%s: hash[1] is not valid.\n", __func__); OS_TPrintf("%s: hash[1] is not valid.\n", __func__);
return FALSE; return FALSE;

View File

@ -894,11 +894,12 @@ static HotSwState LoadStaticModule(void)
#ifdef DHT_TEST #ifdef DHT_TEST
else 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; const DHTDatabase* db;
while (!dht) while (!dht)
{ {
OS_Sleep(1); OS_Sleep(1);
@ -912,35 +913,42 @@ static HotSwState LoadStaticModule(void)
return HOTSW_HASH_CHECK_ERROR; return HOTSW_HASH_CHECK_ERROR;
} }
OS_TPrintf(" Done.\n"); OS_TPrintf(" Done.\n");
hash0 = db->hash[0];
OS_TPrintf("DHT Pahse1..."); hash1 = db->hash[1];
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");
} }
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 #endif
@ -1044,7 +1052,7 @@ static void GenVA_VB_VD(void)
SYSM_work* sw = SYSMi_GetWork(); SYSM_work* sw = SYSMi_GetWork();
u32 dummy = 0; u32 dummy = 0;
MATHRandContext32 rnd; MATHRandContext32 rnd;
// 乱数を初期化 // 乱数を初期化
// チックRTC初回ロード値を種とする。 // チックRTC初回ロード値を種とする。
// (起動する度に変化するパラメータと組み合わせる。 // (起動する度に変化するパラメータと組み合わせる。

View File

@ -154,12 +154,12 @@ static BOOL CheckValidation(FSFile* fp)
} }
//OS_TPrintf("FOUND: 0x%08X: %.4s(%d)\n", db, db->game_code, db->rom_version); //OS_TPrintf("FOUND: 0x%08X: %.4s(%d)\n", db, db->game_code, db->rom_version);
// ハッシュ計算 (1) - 隠蔽可能なはず // ハッシュ計算 (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; return FALSE;
} }
// ハッシュ計算 (2) - 隠蔽は難しいか // ハッシュ計算 (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; return FALSE;
} }

View File

@ -106,25 +106,25 @@ void DHT_CheckHashPhase1Update(SVCHMACSHA1Context* ctx, const void* ptr, u32 len
Description: ROMヘッダおよびARM9/ARM7スタティック領域の検証の結果判定 Description: ROMヘッダおよびARM9/ARM7スタティック領域の検証の結果判定
Arguments: ctx SVCHMACSHA1コンテキスト Arguments: ctx SVCHMACSHA1コンテキスト
db hash (db->hash[0])
Returns: TRUE Returns: TRUE
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL DHT_CheckHashPhase1Final(SVCHMACSHA1Context* ctx, const DHTDatabase *db); BOOL DHT_CheckHashPhase1Final(SVCHMACSHA1Context* ctx, const u8* hash);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: DHT_CheckHashPhase1 Name: DHT_CheckHashPhase1
Description: ROMヘッダおよびARM9/ARM7スタティック領域の検証 Description: ROMヘッダおよびARM9/ARM7スタティック領域の検証
Arguments: db Arguments: hash (db->hash[0])
pROMHeader ROMヘッダ格納先 pROMHeader ROMヘッダ格納先
pARM9 ARM9スタティック格納先 pARM9 ARM9スタティック格納先
pARM7 ARM7スタティック格納先 pARM7 ARM7スタティック格納先
Returns: TRUE 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 Name: DHT_CheckHashPhase2
@ -132,7 +132,7 @@ BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHead
Description: Description:
(Read APIを登録できるべき) (Read APIを登録できるべき)
Arguments: db Arguments: hash (db->hash[1])
pROMHeader ROMヘッダ格納先 pROMHeader ROMヘッダ格納先
fctx (FS版) FSFile構造体へのポインタ fctx (FS版) FSFile構造体へのポインタ
(CARD版) dma番号をvoid* (CARD版) dma番号をvoid*
@ -141,7 +141,7 @@ BOOL DHT_CheckHashPhase1(const DHTDatabase *db, const ROM_Header_Short* pROMHead
Returns: TRUE 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 #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */