証明書とROMヘッダの署名確認、Static領域のハッシュ確認の実装

メインメモリのサイズ判定をコメントアウト (使うなら戻す)
新しいヘッダファイルに対応 (妥当かどうかのチェックはしていない)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@38 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yutaka 2007-10-03 10:20:03 +00:00
parent cbac3f86b7
commit e38e7a9d7f
5 changed files with 48 additions and 45 deletions

View File

@ -43,7 +43,7 @@ BOOL FATFS_OpenRecentMenu( int driveno )
{ {
return FALSE; return FALSE;
} }
menufile[0] = (char)('A' + driveno); menufile[0] += (char)driveno;
menu_fd = po_open((u8*)menufile, PO_BINARY, 0); menu_fd = po_open((u8*)menufile, PO_BINARY, 0);
if (menu_fd < 0) if (menu_fd < 0)
{ {
@ -72,7 +72,7 @@ BOOL FATFS_OpenSpecifiedMenu( const char* menufile )
} }
#define HEADER_SIZE 0x1000 #define HEADER_SIZE 0x1000
#define AUTH_SIZE 0xe00 #define AUTH_SIZE ROM_HEADER_SIGN_TARGET_SIZE
#define SLOT_SIZE 0x8000 #define SLOT_SIZE 0x8000
@ -198,12 +198,38 @@ BOOL FATFS_LoadHeader( void )
static AESCounter* FATFSi_GetCounter( u32 offset ) static AESCounter* FATFSi_GetCounter( u32 offset )
{ {
static AESCounter counter; static AESCounter counter;
MI_CpuCopy8(rh->s.main_static_digest, &counter, 12); MI_CpuCopy8( rh->s.main_static_digest, &counter, 12 );
counter.words[3] = 0; counter.words[3] = 0;
AESi_AddCounter(&counter, offset - offsetof(ROM_Header, s.main_ltd_rom_offset)); AESi_AddCounter( &counter, offset - offsetof(ROM_Header, s.aes_target_rom_offset) );
return &counter; return &counter;
} }
/*---------------------------------------------------------------------------*
Name: FATFSi_SetupAES
Description: setup whiere to use AES
Arguments: offset offset of region from head of ROM_Header
size size of region
Returns: counter
*---------------------------------------------------------------------------*/
static void FATFSi_SetupAES( u32 offset, u32 size )
{
if ( !rh->s.enable_aes )
{
FATFS_DisableAES();
}
else if ( offset >= rh->s.aes_target_rom_offset &&
offset + size <= rh->s.aes_target_rom_offset + rh->s.aes_target_size )
{
AESi_WaitKey();
//AESi_LoadKey( AES_KEY_SLOT_A );
AESi_LoadKey( AES_KEY_SLOT_C );
FATFS_EnableAES( FATFSi_GetCounter( rh->s.main_ltd_rom_offset ) );
}
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: FATFS_LoadMenu Name: FATFS_LoadMenu
@ -226,7 +252,7 @@ BOOL FATFS_LoadMenu( void )
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM9_STATIC; // checkpoint profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM9_STATIC; // checkpoint
#endif #endif
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM9_STATIC ); PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM9_STATIC );
FATFS_DisableAES(); FATFSi_SetupAES( rh->s.main_rom_offset, rh->s.main_size );
if ( !FATFS_LoadBuffer( rh->s.main_rom_offset, rh->s.main_size ) || if ( !FATFS_LoadBuffer( rh->s.main_rom_offset, rh->s.main_size ) ||
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM9_STATIC ) PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM9_STATIC )
{ {
@ -248,7 +274,7 @@ BOOL FATFS_LoadMenu( void )
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM7_STATIC; // checkpoint profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM7_STATIC; // checkpoint
#endif #endif
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM7_STATIC ); PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM7_STATIC );
FATFS_DisableAES(); FATFSi_SetupAES( rh->s.sub_rom_offset, rh->s.sub_size );
if ( !FATFS_LoadBuffer( rh->s.sub_rom_offset, rh->s.sub_size ) || if ( !FATFS_LoadBuffer( rh->s.sub_rom_offset, rh->s.sub_size ) ||
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM7_STATIC ) PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM7_STATIC )
{ {
@ -270,16 +296,7 @@ BOOL FATFS_LoadMenu( void )
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC; // checkpoint profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC; // checkpoint
#endif #endif
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC ); PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM9_LTD_STATIC );
if ( !rh->s.enable_aes ) FATFSi_SetupAES( rh->s.main_ltd_rom_offset, rh->s.main_ltd_size );
{
FATFS_DisableAES();
}
else
{
AESi_WaitKey();
AESi_LoadKey( AES_KEY_SLOT_A );
FATFS_EnableAES( FATFSi_GetCounter( rh->s.main_ltd_rom_offset ) );
}
if ( !FATFS_LoadBuffer( rh->s.main_ltd_rom_offset, rh->s.main_ltd_size ) || if ( !FATFS_LoadBuffer( rh->s.main_ltd_rom_offset, rh->s.main_ltd_size ) ||
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM9_LTD_STATIC ) PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM9_LTD_STATIC )
{ {
@ -301,16 +318,7 @@ BOOL FATFS_LoadMenu( void )
profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC; // checkpoint profile[pf_cnt++] = (u32)PROFILE_PXI_SEND | FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC; // checkpoint
#endif #endif
PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC ); PXI_NotifyID( FIRM_PXI_ID_LOAD_ARM7_LTD_STATIC );
if ( !rh->s.enable_aes ) FATFSi_SetupAES( rh->s.sub_ltd_rom_offset, rh->s.sub_ltd_size );
{
FATFS_DisableAES();
}
else
{
AESi_WaitKey();
AESi_LoadKey( AES_KEY_SLOT_A );
FATFS_EnableAES( FATFSi_GetCounter( rh->s.sub_ltd_rom_offset ) );
}
if ( !FATFS_LoadBuffer( rh->s.sub_ltd_rom_offset, rh->s.sub_ltd_size ) || if ( !FATFS_LoadBuffer( rh->s.sub_ltd_rom_offset, rh->s.sub_ltd_size ) ||
PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM7_LTD_STATIC ) PXI_RecvID() != FIRM_PXI_ID_AUTH_ARM7_LTD_STATIC )
{ {

View File

@ -127,7 +127,7 @@ SDK_WEAK_SYMBOL asm void _start( void )
bcc @2 bcc @2
//---- detect main memory size //---- detect main memory size
bl detect_main_memory_size // bl detect_main_memory_size // shared memory will be cleared
//---- set interrupt vector //---- set interrupt vector
ldr r1, =HW_INTR_VECTOR_BUF ldr r1, =HW_INTR_VECTOR_BUF

View File

@ -191,7 +191,7 @@ static const u8 s_digestDefaultKey[ DIGEST_HASH_BLOCK_SIZE_SHA1 ] = {
static BOOL CheckRomCertificate( int* pool, const RomCertificate *pCert, const void* pCAPubKey, u32 gameCode ) static BOOL CheckRomCertificate( int* pool, const RomCertificate *pCert, const void* pCAPubKey, u32 gameCode )
{ {
SignatureData sd; u8 digest[DIGEST_SIZE_SHA1];
u8 md[DIGEST_SIZE_SHA1]; u8 md[DIGEST_SIZE_SHA1];
int i; int i;
BOOL result = TRUE; BOOL result = TRUE;
@ -204,7 +204,7 @@ static BOOL CheckRomCertificate( int* pool, const RomCertificate *pCert, const v
result = FALSE; result = FALSE;
} }
// 証明書署名チェック // 証明書署名チェック
SVC_DecryptoSign( pool, &sd, pCert->sign, pCAPubKey ); SVC_DecryptoSign( pool, &digest, pCert->sign, pCAPubKey );
// ダイジェストの計算 // ダイジェストの計算
SHA1_Calc( md, pCert, ROM_CERT_SIGN_OFFSET ); SHA1_Calc( md, pCert, ROM_CERT_SIGN_OFFSET );
@ -212,7 +212,7 @@ static BOOL CheckRomCertificate( int* pool, const RomCertificate *pCert, const v
// 比較 // 比較
for (i = 0; i < DIGEST_SIZE_SHA1; i++) for (i = 0; i < DIGEST_SIZE_SHA1; i++)
{ {
if ( md[i] != sd.digest[i] ) if ( md[i] != digest[i] )
{ {
result = FALSE; result = FALSE;
} }
@ -295,9 +295,7 @@ static /*inline*/ BOOL MI_LoadModule(void* dest, u32 size, const u8 digest[DIGES
{ {
if ( md[i] != digest[i] ) if ( md[i] != digest[i] )
{ {
#if 0 /* Footerもダイジェストに入れる必要がある (いらなくしてもらう) */
result = FALSE; result = FALSE;
#endif
} }
} }
@ -319,9 +317,7 @@ BOOL MI_LoadHeader( int* pool, const void* rsa_key )
SHA1_CTX ctx; SHA1_CTX ctx;
u8 md[DIGEST_SIZE_SHA1]; u8 md[DIGEST_SIZE_SHA1];
SignatureData sd; SignatureData sd;
#if 0
int i; int i;
#endif
BOOL result = TRUE; BOOL result = TRUE;
SHA1_Init(&ctx); SHA1_Init(&ctx);
@ -355,8 +351,7 @@ BOOL MI_LoadHeader( int* pool, const void* rsa_key )
// コンテンツ証明書 // コンテンツ証明書
if ( CheckRomCertificate( pool, &rh->certificate, rsa_key, *(u32*)rh->s.game_code ) ) if ( CheckRomCertificate( pool, &rh->certificate, rsa_key, *(u32*)rh->s.game_code ) )
{ {
#if 0 /* 証明書内の公開鍵FORMATをどうするか */ rsa_key = rh->certificate.pubKeyMod; // ヘッダ用の鍵の取り出し
rsa_key = rh->certificate.pubKey; // ヘッダ用の鍵の取り出し
} }
else else
{ {
@ -371,7 +366,6 @@ BOOL MI_LoadHeader( int* pool, const void* rsa_key )
{ {
result = FALSE; result = FALSE;
} }
#endif
} }
#ifndef SDK_FINALROM #ifndef SDK_FINALROM
// 1x: after RSA, before PXI // 1x: after RSA, before PXI

View File

@ -214,7 +214,7 @@ void TwlSpMain( void )
// failed // failed
PXI_NotifyID( FIRM_PXI_ID_NULL ); PXI_NotifyID( FIRM_PXI_ID_NULL );
OS_SetDebugLED( (u8)(0xF0 | ++step)); OS_SetDebugLED( (u8)(0xF0 | step));
OS_Terminate(); OS_Terminate();
} }

View File

@ -60,6 +60,14 @@ u32 pf_cnt = 0;
static void PreInit(void) static void PreInit(void)
{ {
/*
*/
// SHARED領域クリア (IS-TWL-DEBUGGERの更新待ち)
#ifdef SDK_FINALROM
MIi_CpuClearFast( 0, (void*)HW_MAIN_MEM_SHARED, HW_MAIN_MEM_SHARED_END-HW_MAIN_MEM_SHARED );
#endif
/* /*
FromBromŠÖ˜A FromBromŠÖ˜A
@ -70,13 +78,6 @@ static void PreInit(void)
#endif #endif
MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) ); MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) );
// メインメモリ関連
// SHARED領域クリア (IS-TWL-DEBUGGERの更新待ち)
#ifdef SDK_FINALROM
MIi_CpuClearFast( 0, (void*)HW_MAIN_MEM_SHARED, HW_MAIN_MEM_SHARED_END-HW_MAIN_MEM_SHARED );
#endif
} }
void TwlMain( void ) void TwlMain( void )