HMAC初期値を別APIではなくLoadStaticの引数で設定するようにした(使ってないが)、

システムアプリかどうかでRSA鍵を切り替えられるようにした


git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@718 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yutaka 2008-02-22 06:47:54 +00:00
parent b4ca66d9b1
commit 06b38f1271
8 changed files with 90 additions and 73 deletions

View File

@ -16,10 +16,12 @@
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <firm.h> #include <firm.h>
#define RSA_KEY_ADDR rsa_key #define RSA_KEY1_ADDR rsa_key1
#define RSA_KEY2_ADDR rsa_key2
#ifndef FIRM_USE_TWLSDK_KEYS #ifndef FIRM_USE_TWLSDK_KEYS
static const u8 rsa_key[128] = static const u8* rsa_key1 = NULL; // not acceptable
static const u8 rsa_key2[128] =
{ {
0xC7, 0x94, 0x50, 0x00, 0x3A, 0xE1, 0x0E, 0x6C, 0xA8, 0xD1, 0xC0, 0x2D, 0x77, 0xB7, 0x6D, 0xBC, 0xC7, 0x94, 0x50, 0x00, 0x3A, 0xE1, 0x0E, 0x6C, 0xA8, 0xD1, 0xC0, 0x2D, 0x77, 0xB7, 0x6D, 0xBC,
0x31, 0xDB, 0x12, 0x08, 0x09, 0x0D, 0x2A, 0xE8, 0xC9, 0x1A, 0x2B, 0x6E, 0x6C, 0x85, 0x78, 0xD7, 0x31, 0xDB, 0x12, 0x08, 0x09, 0x0D, 0x2A, 0xE8, 0xC9, 0x1A, 0x2B, 0x6E, 0x6C, 0x85, 0x78, 0xD7,
@ -31,7 +33,7 @@ static const u8 rsa_key[128] =
0x27, 0x75, 0x2B, 0x04, 0xD7, 0x26, 0xA8, 0x8A, 0x55, 0x2A, 0x76, 0xE5, 0x68, 0x80, 0x57, 0x85 0x27, 0x75, 0x2B, 0x04, 0xD7, 0x26, 0xA8, 0x8A, 0x55, 0x2A, 0x76, 0xE5, 0x68, 0x80, 0x57, 0x85
}; };
#else #else
static const u8 rsa_key[128] = static const u8 rsa_key1[128] =
{ {
0xAC, 0x93, 0xBB, 0xAC, 0x93, 0xBB,
0x3C, 0x15, 0x5C, 0x5F, 0x25, 0xB0, 0x4C, 0x37, 0xA4, 0x2D, 0x85, 0x29, 0x1D, 0x7A, 0x9D, 0x2D, 0x3C, 0x15, 0x5C, 0x5F, 0x25, 0xB0, 0x4C, 0x37, 0xA4, 0x2D, 0x85, 0x29, 0x1D, 0x7A, 0x9D, 0x2D,
@ -43,6 +45,17 @@ static const u8 rsa_key[128] =
0x62, 0x39, 0xFB, 0x10, 0x7E, 0x48, 0x7F, 0xDD, 0x82, 0x38, 0x38, 0x76, 0xB5, 0xCE, 0x21, 0x4B, 0x62, 0x39, 0xFB, 0x10, 0x7E, 0x48, 0x7F, 0xDD, 0x82, 0x38, 0x38, 0x76, 0xB5, 0xCE, 0x21, 0x4B,
0xC9, 0x6F, 0x31, 0x8D, 0x23, 0x57, 0x3D, 0xB6, 0x6C, 0xEE, 0xC2, 0x0D, 0x11 0xC9, 0x6F, 0x31, 0x8D, 0x23, 0x57, 0x3D, 0xB6, 0x6C, 0xEE, 0xC2, 0x0D, 0x11
}; };
static const u8 rsa_key2[128] =
{
0xe9, 0x9e, 0xa7, 0x9f, 0x59, 0x4d, 0xf4, 0xa7, 0x60, 0x04, 0xbd, 0x47, 0xf2, 0xb3, 0x64, 0xcd,
0x16, 0x79, 0xc1, 0x47, 0x39, 0xf6, 0xa9, 0xf8, 0xee, 0x1a, 0xd0, 0x72, 0xcf, 0x43, 0x97, 0x0c,
0x93, 0xa1, 0x38, 0x4e, 0x13, 0x40, 0x6c, 0x10, 0x59, 0x43, 0xe2, 0x71, 0x29, 0x54, 0x14, 0x2c,
0xc5, 0xda, 0x59, 0x4d, 0xb4, 0x6a, 0xef, 0x85, 0x61, 0x6f, 0x7f, 0x1c, 0x59, 0x34, 0x2c, 0xc6,
0x24, 0xf3, 0x7b, 0xc3, 0xb7, 0x40, 0xd1, 0x46, 0xf8, 0x90, 0xb7, 0xc2, 0x98, 0x50, 0xaf, 0x95,
0x52, 0x42, 0xdb, 0xac, 0xd6, 0x7e, 0xa9, 0xc3, 0x3d, 0x1b, 0x51, 0x56, 0x07, 0x06, 0xd0, 0x0b,
0x01, 0xbb, 0x58, 0x93, 0xea, 0xa0, 0x2c, 0xc7, 0x7d, 0x6a, 0x31, 0x7e, 0xc9, 0xe2, 0xda, 0xfe,
0x1f, 0x2e, 0x9d, 0xa7, 0x54, 0x84, 0xdc, 0x28, 0xb9, 0x18, 0xea, 0x16, 0xf2, 0x95, 0x55, 0x6d,
};
#endif #endif
#define RSA_HEAP_SIZE (4*1024) // RSA用ヒープサイズ (サイズ調整必要) #define RSA_HEAP_SIZE (4*1024) // RSA用ヒープサイズ (サイズ調整必要)
@ -135,8 +148,6 @@ static void PostInit(void)
{ {
// RSA用ヒープ設定 // RSA用ヒープ設定
SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) ); SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) );
// HMAC—pŒ®<C592>€”õ
FS_SetDigestKey( NULL );
// FS/FATFS初期化 // FS/FATFS初期化
FS_InitFIRM(); FS_InitFIRM();
} }
@ -259,7 +270,7 @@ void TwlMain( void )
// 5: after PXI // 5: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadHeader(&acPool, RSA_KEY_ADDR ) || !CheckHeader() ) if ( !FS_LoadHeader( &acPool, RSA_KEY1_ADDR, RSA_KEY2_ADDR ) || !CheckHeader() )
{ {
OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n"); OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n");
goto end; goto end;
@ -271,7 +282,7 @@ void TwlMain( void )
// 7: after PXI // 7: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadStatic() ) if ( !FS_LoadStatic( NULL ) )
{ {
OS_TPrintf("Failed to call FS_LoadStatic().\n"); OS_TPrintf("Failed to call FS_LoadStatic().\n");
goto end; goto end;

View File

@ -65,7 +65,7 @@ static const u8 defaultKey[ SVC_SHA1_BLOCK_SIZE ] =
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void FS_SetDigestKey( const u8* digestKey ) static inline void FS_SetDigestKey( const u8* digestKey )
{ {
if ( digestKey ) if ( digestKey )
{ {
@ -287,13 +287,16 @@ BOOL FS_LoadModule( u8* dest, u32 offset, u32 size, const u8 digest[SVC_SHA1_DIG
and verify signature and verify signature
Arguments: pool heap context to call SVC_DecryptSign Arguments: pool heap context to call SVC_DecryptSign
rsa_key public key to verify the signature rsa_key1 public key to verify the signature
rsa_key2 public key to verify the signature
for system applications
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key ) BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key1, const void* rsa_key2 )
{ {
#ifndef NO_SECURITY_CHECK #ifndef NO_SECURITY_CHECK
const void* rsa_key;
SVCSHA1Context ctx; SVCSHA1Context ctx;
u8 md[SVC_SHA1_DIGEST_SIZE]; u8 md[SVC_SHA1_DIGEST_SIZE];
SignatureData sd; SignatureData sd;
@ -309,6 +312,9 @@ BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
return FALSE; return FALSE;
} }
// Œ®ÌŠmè
rsa_key = (rh->s.titleID_Hi & 0x1) ? rsa_key2 : rsa_key1;
// ƒRƒ“ƒeƒ“ƒc<C692>ؾ<E28093> // ƒRƒ“ƒeƒ“ƒc<C692>ؾ<E28093>
if ( CheckRomCertificate( pool, &rh->certificate, rsa_key, *(u32*)rh->s.game_code ) ) if ( CheckRomCertificate( pool, &rh->certificate, rsa_key, *(u32*)rh->s.game_code ) )
{ {
@ -348,12 +354,14 @@ BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
Description: receive static regions from ARM6 via WRAM-B and store them Description: receive static regions from ARM6 via WRAM-B and store them
specified by ROM header at HW_TWL_ROM_HEADER_BUF specified by ROM header at HW_TWL_ROM_HEADER_BUF
Arguments: None Arguments: digestKey pointer to key for HMAC-SHA1
if NULL, use default key
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL FS_LoadStatic( void ) BOOL FS_LoadStatic( const u8* digestKey )
{ {
FS_SetDigestKey( digestKey );
if ( rh->s.main_size > 0 ) if ( rh->s.main_size > 0 )
{ {
if ( !FS_LoadModule( rh->s.main_ram_address, rh->s.main_rom_offset, rh->s.main_size, rh->s.main_static_digest ) ) if ( !FS_LoadModule( rh->s.main_ram_address, rh->s.main_rom_offset, rh->s.main_size, rh->s.main_static_digest ) )

View File

@ -71,7 +71,7 @@ static u8* const aesBuffer = (u8*)HW_FIRM_FS_AES_BUFFER; // 0x2ff3800
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
void FS2_SetDigestKey( const u8* digestKey ) static inline void FS2_SetDigestKey( const u8* digestKey )
{ {
if ( digestKey ) if ( digestKey )
{ {
@ -312,12 +312,15 @@ BOOL FS2_OpenSrl( FSFile *pFile )
Arguments: pFile pointer to FSFile streucture Arguments: pFile pointer to FSFile streucture
pool heap context to call SVC_DecryptSign pool heap context to call SVC_DecryptSign
rsa_key public key to verify the signature rsa_key1 public key to verify the signature
rsa_key2 public key to verify the signature
for system applications
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL FS2_LoadHeader( FSFile *pFile, SVCSignHeapContext* pool, const void* rsa_key ) BOOL FS2_LoadHeader( FSFile *pFile, SVCSignHeapContext* pool, const void* rsa_key1, const void* rsa_key2 )
{ {
const void* rsa_key;
u8 md[SVC_SHA1_DIGEST_SIZE]; u8 md[SVC_SHA1_DIGEST_SIZE];
SignatureData sd; SignatureData sd;
@ -331,6 +334,9 @@ BOOL FS2_LoadHeader( FSFile *pFile, SVCSignHeapContext* pool, const void* rsa_ke
} }
SVC_CalcSHA1( md, rh, FS_HEADER_AUTH_SIZE ); SVC_CalcSHA1( md, rh, FS_HEADER_AUTH_SIZE );
// Œ®ÌŠmè
rsa_key = (rh->s.titleID_Hi & 0x1) ? rsa_key2 : rsa_key1;
// ƒRƒ“ƒeƒ“ƒc<C692>ؾ<E28093> // ƒRƒ“ƒeƒ“ƒc<C692>ؾ<E28093>
if ( CheckRomCertificate( pool, &rh->certificate, rsa_key, *(u32*)rh->s.game_code ) ) if ( CheckRomCertificate( pool, &rh->certificate, rsa_key, *(u32*)rh->s.game_code ) )
{ {
@ -366,11 +372,14 @@ BOOL FS2_LoadHeader( FSFile *pFile, SVCSignHeapContext* pool, const void* rsa_ke
specified by ROM header at HW_TWL_ROM_HEADER_BUF specified by ROM header at HW_TWL_ROM_HEADER_BUF
Arguments: pFile pointer to FSFile streucture Arguments: pFile pointer to FSFile streucture
digestKey pointer to key for HMAC-SHA1
if NULL, use default key
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL FS2_LoadStatic( FSFile *pFile ) BOOL FS2_LoadStatic( FSFile *pFile, const u8* digestKey )
{ {
FS2_SetDigestKey( digestKey );
if ( rh->s.main_size > 0 ) if ( rh->s.main_size > 0 )
{ {
if ( !FS2_LoadModule( pFile, rh->s.main_ram_address, rh->s.main_rom_offset, rh->s.main_size, rh->s.main_static_digest ) ) if ( !FS2_LoadModule( pFile, rh->s.main_ram_address, rh->s.main_rom_offset, rh->s.main_size, rh->s.main_static_digest ) )

View File

@ -54,7 +54,7 @@ static SVCSignHeapContext acPool;
PRINT_MEMORY_ADDR SPrintfを行います() PRINT_MEMORY_ADDR SPrintfを行います()
FINALROM版でもコードが残るので注意してください FINALROM版でもコードが残るので注意してください
*/ */
#define PRINT_MEMORY_ADDR 0x02FFC000 #define PRINT_MEMORY_ADDR 0x02FFC200
//#ifdef SDK_FINALROM // FINALROMで無効化 //#ifdef SDK_FINALROM // FINALROMで無効化
//#undef PROFILE_ENABLE //#undef PROFILE_ENABLE
@ -117,8 +117,6 @@ static void PostInit(void)
{ {
// RSA用ヒープ設定 // RSA用ヒープ設定
SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) ); SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) );
// HMAC—pŒ®<C592>€”õ
FS_SetDigestKey( NULL );
// FS/FATFS初期化 // FS/FATFS初期化
FS_InitFIRM(); FS_InitFIRM();
} }
@ -281,7 +279,7 @@ void TwlMain( void )
// 6: after PXI // 6: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadHeader(&acPool, RSA_KEY_ADDR ) || !CheckHeader() ) if ( !FS_LoadHeader( &acPool, NULL, RSA_KEY_ADDR ) || !CheckHeader() )
{ {
OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n"); OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n");
goto end; goto end;
@ -293,7 +291,7 @@ void TwlMain( void )
// 8: after PXI // 8: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadStatic() ) if ( !FS_LoadStatic( NULL ) )
{ {
OS_TPrintf("Failed to call FS_LoadStatic().\n"); OS_TPrintf("Failed to call FS_LoadStatic().\n");
goto end; goto end;

View File

@ -24,15 +24,14 @@
#define RSA_KEY_ADDR rsa_key #define RSA_KEY_ADDR rsa_key
static const u8 rsa_key[128] = static const u8 rsa_key[128] =
{ {
0xAC, 0x93, 0xBB, 0xe9, 0x9e, 0xa7, 0x9f, 0x59, 0x4d, 0xf4, 0xa7, 0x60, 0x04, 0xbd, 0x47, 0xf2, 0xb3, 0x64, 0xcd,
0x3C, 0x15, 0x5C, 0x5F, 0x25, 0xB0, 0x4C, 0x37, 0xA4, 0x2D, 0x85, 0x29, 0x1D, 0x7A, 0x9D, 0x2D, 0x16, 0x79, 0xc1, 0x47, 0x39, 0xf6, 0xa9, 0xf8, 0xee, 0x1a, 0xd0, 0x72, 0xcf, 0x43, 0x97, 0x0c,
0xD5, 0x79, 0xB5, 0x5D, 0xB1, 0x08, 0x20, 0x9C, 0xF0, 0x4C, 0x56, 0x27, 0x97, 0xF8, 0x7E, 0x3E, 0x93, 0xa1, 0x38, 0x4e, 0x13, 0x40, 0x6c, 0x10, 0x59, 0x43, 0xe2, 0x71, 0x29, 0x54, 0x14, 0x2c,
0xCB, 0x94, 0x06, 0x05, 0x94, 0x00, 0x92, 0x9B, 0xB0, 0x5B, 0x06, 0xF6, 0xAF, 0xAA, 0x9C, 0xA5, 0xc5, 0xda, 0x59, 0x4d, 0xb4, 0x6a, 0xef, 0x85, 0x61, 0x6f, 0x7f, 0x1c, 0x59, 0x34, 0x2c, 0xc6,
0xF0, 0x11, 0xA7, 0x8A, 0xCB, 0x0C, 0x11, 0xD6, 0x0C, 0x3D, 0x30, 0xAC, 0x51, 0x79, 0x5A, 0xB5, 0x24, 0xf3, 0x7b, 0xc3, 0xb7, 0x40, 0xd1, 0x46, 0xf8, 0x90, 0xb7, 0xc2, 0x98, 0x50, 0xaf, 0x95,
0x7F, 0x11, 0x92, 0x74, 0x48, 0x82, 0x81, 0xBF, 0x3B, 0xFA, 0x93, 0xBF, 0x6B, 0x5B, 0x3F, 0x86, 0x52, 0x42, 0xdb, 0xac, 0xd6, 0x7e, 0xa9, 0xc3, 0x3d, 0x1b, 0x51, 0x56, 0x07, 0x06, 0xd0, 0x0b,
0x96, 0x4F, 0xCC, 0x90, 0x12, 0xB2, 0x39, 0x8D, 0x68, 0x16, 0x7B, 0xC6, 0x87, 0xF1, 0xF5, 0x60, 0x01, 0xbb, 0x58, 0x93, 0xea, 0xa0, 0x2c, 0xc7, 0x7d, 0x6a, 0x31, 0x7e, 0xc9, 0xe2, 0xda, 0xfe,
0x62, 0x39, 0xFB, 0x10, 0x7E, 0x48, 0x7F, 0xDD, 0x82, 0x38, 0x38, 0x76, 0xB5, 0xCE, 0x21, 0x4B, 0x1f, 0x2e, 0x9d, 0xa7, 0x54, 0x84, 0xdc, 0x28, 0xb9, 0x18, 0xea, 0x16, 0xf2, 0x95, 0x55, 0x6d,
0xC9, 0x6F, 0x31, 0x8D, 0x23, 0x57, 0x3D, 0xB6, 0x6C, 0xEE, 0xC2, 0x0D, 0x11
}; };
#endif #endif
@ -56,7 +55,7 @@ static SVCSignHeapContext acPool;
PRINT_MEMORY_ADDR SPrintfを行います() PRINT_MEMORY_ADDR SPrintfを行います()
FINALROM版でもコードが残るので注意してください FINALROM版でもコードが残るので注意してください
*/ */
#define PRINT_MEMORY_ADDR 0x02FFC000 #define PRINT_MEMORY_ADDR 0x02FFC200
//#ifdef SDK_FINALROM // FINALROMで無効化 //#ifdef SDK_FINALROM // FINALROMで無効化
//#undef PROFILE_ENABLE //#undef PROFILE_ENABLE
@ -120,8 +119,6 @@ static void PostInit(void)
AES_Init(); AES_Init();
// RSA用ヒープ設定 // RSA用ヒープ設定
SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) ); SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) );
// HMAC用鍵準備
FS2_SetDigestKey( NULL );
// FS/FATFS初期化 // FS/FATFS初期化
FS_InitFIRM(); FS_InitFIRM();
} }
@ -291,7 +288,7 @@ void TwlMain( void )
// 6: after FS_OpenSrl // 6: after FS_OpenSrl
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS2_LoadHeader( &file, &acPool, RSA_KEY_ADDR ) || !CheckHeader() ) if ( !FS2_LoadHeader( &file, &acPool, NULL, RSA_KEY_ADDR ) || !CheckHeader() )
{ {
OS_TPrintf("Failed to call FS2_LoadHeader() and/or CheckHeader().\n"); OS_TPrintf("Failed to call FS2_LoadHeader() and/or CheckHeader().\n");
goto end; goto end;
@ -303,7 +300,7 @@ void TwlMain( void )
// 8: after PXI // 8: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS2_LoadStatic( &file ) ) if ( !FS2_LoadStatic( &file, NULL ) )
{ {
OS_TPrintf("Failed to call FS2_LoadStatic().\n"); OS_TPrintf("Failed to call FS2_LoadStatic().\n");
goto end; goto end;

View File

@ -16,10 +16,12 @@
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#include <firm.h> #include <firm.h>
#define RSA_KEY_ADDR rsa_key #define RSA_KEY1_ADDR rsa_key1
#define RSA_KEY2_ADDR rsa_key2
#ifndef FIRM_USE_TWLSDK_KEYS #ifndef FIRM_USE_TWLSDK_KEYS
static const u8 rsa_key[128] = static const u8* rsa_key1 = NULL; // not acceptable
static const u8 rsa_key2[128] =
{ {
0xC7, 0x94, 0x50, 0x00, 0x3A, 0xE1, 0x0E, 0x6C, 0xA8, 0xD1, 0xC0, 0x2D, 0x77, 0xB7, 0x6D, 0xBC, 0xC7, 0x94, 0x50, 0x00, 0x3A, 0xE1, 0x0E, 0x6C, 0xA8, 0xD1, 0xC0, 0x2D, 0x77, 0xB7, 0x6D, 0xBC,
0x31, 0xDB, 0x12, 0x08, 0x09, 0x0D, 0x2A, 0xE8, 0xC9, 0x1A, 0x2B, 0x6E, 0x6C, 0x85, 0x78, 0xD7, 0x31, 0xDB, 0x12, 0x08, 0x09, 0x0D, 0x2A, 0xE8, 0xC9, 0x1A, 0x2B, 0x6E, 0x6C, 0x85, 0x78, 0xD7,
@ -31,7 +33,7 @@ static const u8 rsa_key[128] =
0x27, 0x75, 0x2B, 0x04, 0xD7, 0x26, 0xA8, 0x8A, 0x55, 0x2A, 0x76, 0xE5, 0x68, 0x80, 0x57, 0x85 0x27, 0x75, 0x2B, 0x04, 0xD7, 0x26, 0xA8, 0x8A, 0x55, 0x2A, 0x76, 0xE5, 0x68, 0x80, 0x57, 0x85
}; };
#else #else
static const u8 rsa_key[128] = static const u8 rsa_key1[128] =
{ {
0xAC, 0x93, 0xBB, 0xAC, 0x93, 0xBB,
0x3C, 0x15, 0x5C, 0x5F, 0x25, 0xB0, 0x4C, 0x37, 0xA4, 0x2D, 0x85, 0x29, 0x1D, 0x7A, 0x9D, 0x2D, 0x3C, 0x15, 0x5C, 0x5F, 0x25, 0xB0, 0x4C, 0x37, 0xA4, 0x2D, 0x85, 0x29, 0x1D, 0x7A, 0x9D, 0x2D,
@ -43,6 +45,17 @@ static const u8 rsa_key[128] =
0x62, 0x39, 0xFB, 0x10, 0x7E, 0x48, 0x7F, 0xDD, 0x82, 0x38, 0x38, 0x76, 0xB5, 0xCE, 0x21, 0x4B, 0x62, 0x39, 0xFB, 0x10, 0x7E, 0x48, 0x7F, 0xDD, 0x82, 0x38, 0x38, 0x76, 0xB5, 0xCE, 0x21, 0x4B,
0xC9, 0x6F, 0x31, 0x8D, 0x23, 0x57, 0x3D, 0xB6, 0x6C, 0xEE, 0xC2, 0x0D, 0x11 0xC9, 0x6F, 0x31, 0x8D, 0x23, 0x57, 0x3D, 0xB6, 0x6C, 0xEE, 0xC2, 0x0D, 0x11
}; };
static const u8 rsa_key2[128] =
{
0xe9, 0x9e, 0xa7, 0x9f, 0x59, 0x4d, 0xf4, 0xa7, 0x60, 0x04, 0xbd, 0x47, 0xf2, 0xb3, 0x64, 0xcd,
0x16, 0x79, 0xc1, 0x47, 0x39, 0xf6, 0xa9, 0xf8, 0xee, 0x1a, 0xd0, 0x72, 0xcf, 0x43, 0x97, 0x0c,
0x93, 0xa1, 0x38, 0x4e, 0x13, 0x40, 0x6c, 0x10, 0x59, 0x43, 0xe2, 0x71, 0x29, 0x54, 0x14, 0x2c,
0xc5, 0xda, 0x59, 0x4d, 0xb4, 0x6a, 0xef, 0x85, 0x61, 0x6f, 0x7f, 0x1c, 0x59, 0x34, 0x2c, 0xc6,
0x24, 0xf3, 0x7b, 0xc3, 0xb7, 0x40, 0xd1, 0x46, 0xf8, 0x90, 0xb7, 0xc2, 0x98, 0x50, 0xaf, 0x95,
0x52, 0x42, 0xdb, 0xac, 0xd6, 0x7e, 0xa9, 0xc3, 0x3d, 0x1b, 0x51, 0x56, 0x07, 0x06, 0xd0, 0x0b,
0x01, 0xbb, 0x58, 0x93, 0xea, 0xa0, 0x2c, 0xc7, 0x7d, 0x6a, 0x31, 0x7e, 0xc9, 0xe2, 0xda, 0xfe,
0x1f, 0x2e, 0x9d, 0xa7, 0x54, 0x84, 0xdc, 0x28, 0xb9, 0x18, 0xea, 0x16, 0xf2, 0x95, 0x55, 0x6d,
};
#endif #endif
#define RSA_HEAP_SIZE (4*1024) // RSA用ヒープサイズ (サイズ調整必要) #define RSA_HEAP_SIZE (4*1024) // RSA用ヒープサイズ (サイズ調整必要)
@ -139,8 +152,6 @@ static void PostInit(void)
{ {
// RSA用ヒープ設定 // RSA用ヒープ設定
SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) ); SVC_InitSignHeap( &acPool, acHeap, sizeof(acHeap) );
// HMAC—pŒ®<C592>€”õ
FS_SetDigestKey( NULL );
// FS/FATFS初期化 // FS/FATFS初期化
FS_InitFIRM(); FS_InitFIRM();
} }
@ -283,7 +294,7 @@ void TwlMain( void )
// 5: after PXI // 5: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadHeader(&acPool, RSA_KEY_ADDR ) || !CheckHeader() ) if ( !FS_LoadHeader( &acPool, RSA_KEY1_ADDR, RSA_KEY2_ADDR ) || !CheckHeader() )
{ {
OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n"); OS_TPrintf("Failed to call FS_LoadHeader() and/or CheckHeader().\n");
goto end; goto end;
@ -295,7 +306,7 @@ void TwlMain( void )
// 7: after PXI // 7: after PXI
PUSH_PROFILE(); PUSH_PROFILE();
if ( !FS_LoadStatic() ) if ( !FS_LoadStatic( NULL ) )
{ {
OS_TPrintf("Failed to call FS_LoadStatic().\n"); OS_TPrintf("Failed to call FS_LoadStatic().\n");
goto end; goto end;

View File

@ -26,18 +26,6 @@
extern "C" { extern "C" {
#endif #endif
/*---------------------------------------------------------------------------*
Name: FS_SetDigestKey
Description: set specified key or default key for HMAC-SHA-1
Arguments: digestKey pointer to key
if NULL, use default key
Returns: TRUE if success
*---------------------------------------------------------------------------*/
void FS_SetDigestKey( const u8* digestKey );
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: FS_LoadBuffer Name: FS_LoadBuffer
@ -75,11 +63,13 @@ BOOL FS_LoadModule( u8* dest, u32 offset, u32 size, const u8 digest[SVC_SHA1_BLO
and verify signature and verify signature
Arguments: pool heap context to call SVC_DecryptSign Arguments: pool heap context to call SVC_DecryptSign
rsa_key public key to verify the signature rsa_key1 public key to verify the signature
rsa_key2 public key to verify the signature
for system applications
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key ); BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key1, const void* rsa_key2 );
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: FS_LoadStatic Name: FS_LoadStatic
@ -87,11 +77,12 @@ BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key );
Description: receive static regions from ARM6 via WRAM-B and store them Description: receive static regions from ARM6 via WRAM-B and store them
specified by ROM header at HW_TWL_ROM_HEADER_BUF specified by ROM header at HW_TWL_ROM_HEADER_BUF
Arguments: None Arguments: digestKey pointer to key for HMAC-SHA1
if NULL, use default key
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL FS_LoadStatic( void ); BOOL FS_LoadStatic( const u8* digestKey );
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -26,18 +26,6 @@
extern "C" { extern "C" {
#endif #endif
/*---------------------------------------------------------------------------*
Name: FS2_SetDigestKey
Description: set specified key or default key for HMAC-SHA-1
Arguments: digestKey pointer to key
if NULL, use default key
Returns: TRUE if success
*---------------------------------------------------------------------------*/
void FS2_SetDigestKey( const u8* digestKey );
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: FS2_LoadModule Name: FS2_LoadModule
@ -74,11 +62,13 @@ BOOL FS2_OpenSrl( FSFile *pFile );
Arguments: pFile pointer to FSFile streucture Arguments: pFile pointer to FSFile streucture
pool heap context to call SVC_DecryptSign pool heap context to call SVC_DecryptSign
rsa_key public key to verify the signature rsa_key1 public key to verify the signature
rsa_key2 public key to verify the signature
for system applications
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL FS2_LoadHeader( FSFile *pFile, SVCSignHeapContext* pool, const void* rsa_key ); BOOL FS2_LoadHeader( FSFile *pFile, SVCSignHeapContext* pool, const void* rsa_key1, const void* rsa_key2 );
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: FS2_LoadStatic Name: FS2_LoadStatic
@ -87,10 +77,12 @@ BOOL FS2_LoadHeader( FSFile *pFile, SVCSignHeapContext* pool, const void* rsa_ke
specified by ROM header at HW_TWL_ROM_HEADER_BUF specified by ROM header at HW_TWL_ROM_HEADER_BUF
Arguments: pFile pointer to FSFile streucture Arguments: pFile pointer to FSFile streucture
digestKey pointer to key for HMAC-SHA1
if NULL, use default key
Returns: TRUE if success Returns: TRUE if success
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL FS2_LoadStatic( FSFile *pFile ); BOOL FS2_LoadStatic( FSFile *pFile, const u8* digestKey );
#ifdef __cplusplus #ifdef __cplusplus