mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ARM9側FATFSの追加 (FS用前処理)
ARM9側AESライブラリの追加 (ユーティリティのみ) ハッシュサイズマクロをSVC_SHA1_DIGEST_SIZEに統一 専用ローダーを使わない版FS APIの追加 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@300 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
e70669201a
commit
a0f0501af7
@ -84,6 +84,8 @@ FIRM_LIBS_BASE ?= \
|
|||||||
libos \
|
libos \
|
||||||
libpxi \
|
libpxi \
|
||||||
libfs \
|
libfs \
|
||||||
|
libfatfs \
|
||||||
|
libaes \
|
||||||
libmi \
|
libmi \
|
||||||
|
|
||||||
else # ($(CODEGEN_PROC),ARM7)
|
else # ($(CODEGEN_PROC),ARM7)
|
||||||
|
|||||||
@ -28,7 +28,7 @@ TWL_CODEGEN_ALL ?= TRUE
|
|||||||
# Codegen for sub processer
|
# Codegen for sub processer
|
||||||
TWL_PROC = ARM7
|
TWL_PROC = ARM7
|
||||||
|
|
||||||
SRCDIR = .
|
SRCDIR = . ../common
|
||||||
|
|
||||||
SRCS = \
|
SRCS = \
|
||||||
aes_init.c \
|
aes_init.c \
|
||||||
|
|||||||
@ -21,7 +21,7 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs
|
|||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
SUBDIRS = ARM7
|
SUBDIRS = ARM9 ARM7
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
42
build/libraries/fatfs/ARM9/Makefile
Normal file
42
build/libraries/fatfs/ARM9/Makefile
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: TwlFirm - libraries - fatfs
|
||||||
|
# File: Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
#
|
||||||
|
# These coded instructions, statements, and computer programs contain
|
||||||
|
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
# Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
# not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
# in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
#
|
||||||
|
# $Date:: $
|
||||||
|
# $Rev$
|
||||||
|
# $Author$
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SUBDIRS =
|
||||||
|
SUBMAKES =
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SRCS = fatfs_firm.c
|
||||||
|
|
||||||
|
TARGET_LIB = libfatfs$(FIRM_LIBSUFFIX).a
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
include $(TWLIPL_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
INSTALL_TARGETS = $(TARGETS)
|
||||||
|
INSTALL_DIR = $(FIRM_INSTALL_LIBDIR)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
do-build: $(TARGETS)
|
||||||
|
|
||||||
|
include $(TWLIPL_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
31
build/libraries/fatfs/ARM9/src/fatfs_firm.c
Normal file
31
build/libraries/fatfs/ARM9/src/fatfs_firm.c
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlIPL - libraries - fatfs
|
||||||
|
File: fatfs_firm.c
|
||||||
|
|
||||||
|
Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
|
||||||
|
$Date:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <firm.h>
|
||||||
|
#include <twl/types.h>
|
||||||
|
|
||||||
|
void FATFS_InitFIRM( void )
|
||||||
|
{
|
||||||
|
FATFSiCommandBuffer = (void*)FIRM_FATFS_COMMAND_BUFFER;
|
||||||
|
FATFS_Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FATFSi_GetUnicodeConversionTable(const u8 **u2s, const u16 **s2u)
|
||||||
|
{
|
||||||
|
*u2s = NULL;
|
||||||
|
*s2u = NULL;
|
||||||
|
}
|
||||||
@ -21,7 +21,7 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs
|
|||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
SUBDIRS = ARM7
|
SUBDIRS = ARM9 ARM7
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@ -21,6 +21,10 @@
|
|||||||
|
|
||||||
#define FS_HEADER_AUTH_SIZE 0xe00
|
#define FS_HEADER_AUTH_SIZE 0xe00
|
||||||
|
|
||||||
|
#define MODULE_ALIGNMENT 0x10 // 16バイト単位で読み込む
|
||||||
|
//#define MODULE_ALIGNMENT 0x200 // 512バイト単位で読み込む
|
||||||
|
#define RoundUpModuleSize(value) (((value) + MODULE_ALIGNMENT - 1) & -MODULE_ALIGNMENT)
|
||||||
|
|
||||||
#define CONTENT_INDEX_SRL 0
|
#define CONTENT_INDEX_SRL 0
|
||||||
#define HASH_UNIT 0x1000
|
#define HASH_UNIT 0x1000
|
||||||
|
|
||||||
@ -97,15 +101,15 @@ static inline BOOL CheckDigest( u8* a, u8* b, BOOL aClr, BOOL bClr )
|
|||||||
{
|
{
|
||||||
BOOL result = TRUE;
|
BOOL result = TRUE;
|
||||||
int i;
|
int i;
|
||||||
for ( i = 0; i < SVC_SHA1_BLOCK_SIZE; i++ )
|
for ( i = 0; i < SVC_SHA1_DIGEST_SIZE; i++ )
|
||||||
{
|
{
|
||||||
if ( a[i] != b[i] )
|
if ( a[i] != b[i] )
|
||||||
{
|
{
|
||||||
result = FALSE;
|
result = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( aClr ) MI_CpuClear8(a, SVC_SHA1_BLOCK_SIZE);
|
if ( aClr ) MI_CpuClear8(a, SVC_SHA1_DIGEST_SIZE);
|
||||||
if ( bClr ) MI_CpuClear8(b, SVC_SHA1_BLOCK_SIZE);
|
if ( bClr ) MI_CpuClear8(b, SVC_SHA1_DIGEST_SIZE);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,8 +130,8 @@ static inline BOOL CheckDigest( u8* a, u8* b, BOOL aClr, BOOL bClr )
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static BOOL CheckRomCertificate( SVCSignHeapContext* pool, const RomCertificate *pCert, const void* pCAPubKey, u32 gameCode )
|
static BOOL CheckRomCertificate( SVCSignHeapContext* pool, const RomCertificate *pCert, const void* pCAPubKey, u32 gameCode )
|
||||||
{
|
{
|
||||||
u8 digest[SVC_SHA1_BLOCK_SIZE];
|
u8 digest[SVC_SHA1_DIGEST_SIZE];
|
||||||
u8 md[SVC_SHA1_BLOCK_SIZE];
|
u8 md[SVC_SHA1_DIGEST_SIZE];
|
||||||
|
|
||||||
// 証明書ヘッダのマジックナンバーチェック
|
// 証明書ヘッダのマジックナンバーチェック
|
||||||
if( pCert->header.magicNumber != TWL_ROM_CERT_MAGIC_NUMBER ||
|
if( pCert->header.magicNumber != TWL_ROM_CERT_MAGIC_NUMBER ||
|
||||||
@ -197,6 +201,7 @@ BOOL FS_LoadBuffer( u8* dest, u32 size, SVCSHA1Context *ctx )
|
|||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: GetTransferSize
|
Name: GetTransferSize
|
||||||
|
|
||||||
@ -252,10 +257,10 @@ static u32 GetTransferSize( u32 offset, u32 size )
|
|||||||
|
|
||||||
Returns: TRUE if success
|
Returns: TRUE if success
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
BOOL FS_LoadModule( u8* dest, u32 offset, u32 size, const u8 digest[SVC_SHA1_BLOCK_SIZE] )
|
BOOL FS_LoadModule( u8* dest, u32 offset, u32 size, const u8 digest[SVC_SHA1_DIGEST_SIZE] )
|
||||||
{
|
{
|
||||||
SVCHMACSHA1Context ctx;
|
SVCHMACSHA1Context ctx;
|
||||||
u8 md[SVC_SHA1_BLOCK_SIZE];
|
u8 md[SVC_SHA1_DIGEST_SIZE];
|
||||||
|
|
||||||
SVC_HMACSHA1Init(&ctx, currentKey, SVC_SHA1_BLOCK_SIZE );
|
SVC_HMACSHA1Init(&ctx, currentKey, SVC_SHA1_BLOCK_SIZE );
|
||||||
while ( size > 0 )
|
while ( size > 0 )
|
||||||
@ -287,8 +292,8 @@ BOOL FS_LoadModule( u8* dest, u32 offset, u32 size, const u8 digest[SVC_SHA1_BLO
|
|||||||
BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
||||||
{
|
{
|
||||||
SVCSHA1Context ctx;
|
SVCSHA1Context ctx;
|
||||||
u8 md[SVC_SHA1_BLOCK_SIZE];
|
u8 md[SVC_SHA1_DIGEST_SIZE];
|
||||||
u8 digest[SVC_SHA1_BLOCK_SIZE];
|
u8 digest[SVC_SHA1_DIGEST_SIZE];
|
||||||
SignatureData sd;
|
SignatureData sd;
|
||||||
|
|
||||||
SVC_SHA1Init( &ctx );
|
SVC_SHA1Init( &ctx );
|
||||||
@ -314,7 +319,10 @@ BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
|||||||
|
|
||||||
// ヘッダ署名チェック
|
// ヘッダ署名チェック
|
||||||
SVC_DecryptSign( pool, &sd, rh->signature, rsa_key );
|
SVC_DecryptSign( pool, &sd, rh->signature, rsa_key );
|
||||||
MI_CpuCopy8( sd.digest, digest, SVC_SHA1_BLOCK_SIZE ); // ダイジェストの取り出し
|
MI_CpuCopy8( sd.digest, digest, SVC_SHA1_DIGEST_SIZE ); // ダイジェストの取り出し
|
||||||
|
|
||||||
|
// ダイジェスト以外のデータのチェックが必要!!
|
||||||
|
|
||||||
MI_CpuClear8( &sd, sizeof(sd) ); // 残り削除 (他に必要なものはない?)
|
MI_CpuClear8( &sd, sizeof(sd) ); // 残り削除 (他に必要なものはない?)
|
||||||
return CheckDigest( md, digest, TRUE, TRUE );
|
return CheckDigest( md, digest, TRUE, TRUE );
|
||||||
}
|
}
|
||||||
@ -361,3 +369,225 @@ BOOL FS_LoadStatic( void )
|
|||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
以下、LoadBufferを使わない版 (通常FS APIを使用する)
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void EnableAes( AESCounter* pCounter ) // ドライバAPIと置き換える
|
||||||
|
{
|
||||||
|
(void)pCounter;
|
||||||
|
}
|
||||||
|
static void DisableAes( void ) // ドライバAPIと置き換える
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GetAesCounter( AESCounter* pCounter, u32 offset )
|
||||||
|
{
|
||||||
|
MI_CpuCopy32( rh->s.main_static_digest, pCounter, AES_BLOCK_SIZE );
|
||||||
|
AESi_AddCounter( pCounter, offset - rh->s.aes_target_rom_offset );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: GetSrlTransferSize
|
||||||
|
|
||||||
|
Description: get size to transfer once
|
||||||
|
|
||||||
|
一度に受信するサイズを返します。
|
||||||
|
AESのセットアップもすべきです。
|
||||||
|
|
||||||
|
転送範囲がAES領域をまたぐ場合は、境界までのサイズ (引数より
|
||||||
|
小さなサイズ) を返します。
|
||||||
|
makerom.TWLまたはIPLの使用に依存します。
|
||||||
|
|
||||||
|
Arguments: offset offset of region from head of ROM_Header
|
||||||
|
size size of region
|
||||||
|
|
||||||
|
Returns: size to transfer once
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
static u32 GetSrlTransferSize( u32 offset, u32 size )
|
||||||
|
{
|
||||||
|
u32 aes_offset = rh->s.aes_target_rom_offset;
|
||||||
|
u32 aes_end = aes_offset + RoundUpModuleSize(rh->s.aes_target_size);
|
||||||
|
u32 end = offset + RoundUpModuleSize(size);
|
||||||
|
if ( rh->s.enable_aes )
|
||||||
|
{
|
||||||
|
if ( offset >= aes_offset && offset < aes_end )
|
||||||
|
{
|
||||||
|
AESCounter counter;
|
||||||
|
if ( end > aes_end )
|
||||||
|
{
|
||||||
|
size = aes_end - offset;
|
||||||
|
}
|
||||||
|
AESi_WaitKey();
|
||||||
|
if ( rh->s.developer_encrypt )
|
||||||
|
{
|
||||||
|
AESi_LoadKey( AES_KEY_SLOT_C );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AESi_LoadKey( AES_KEY_SLOT_A );
|
||||||
|
}
|
||||||
|
GetAesCounter( &counter, offset );
|
||||||
|
EnableAes( &counter );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( offset < aes_offset && offset + size > aes_offset )
|
||||||
|
{
|
||||||
|
size = aes_offset - offset;
|
||||||
|
}
|
||||||
|
DisableAes();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DisableAes();
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_LoadSrlModule
|
||||||
|
|
||||||
|
Description: receive data from ARM7 via WRAM-B and store in destination address
|
||||||
|
in view of AES settings in the ROM header at HW_TWL_ROM_HEADER_BUF,
|
||||||
|
then verify the digest
|
||||||
|
|
||||||
|
Arguments: pFile pointer to FSFile streucture
|
||||||
|
dest destination address to read
|
||||||
|
offset file offset to start to read in bytes
|
||||||
|
size total length to read in bytes
|
||||||
|
digest digest to verify
|
||||||
|
|
||||||
|
Returns: TRUE if success
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL FS_LoadSrlModule( FSFile *pFile, u8* dest, u32 offset, u32 size, const u8 digest[SVC_SHA1_DIGEST_SIZE] )
|
||||||
|
{
|
||||||
|
u8 md[SVC_SHA1_DIGEST_SIZE];
|
||||||
|
u8* hmacDest = dest;
|
||||||
|
u32 hmacSize = size;
|
||||||
|
|
||||||
|
if ( !FS_SeekFile( pFile, (s32)offset, FS_SEEK_SET ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
while ( size > 0 )
|
||||||
|
{
|
||||||
|
u32 unit = GetSrlTransferSize( offset, size );
|
||||||
|
if ( !FS_ReadFile( pFile, dest, (s32)unit ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
dest += unit;
|
||||||
|
offset += unit;
|
||||||
|
size -= unit;
|
||||||
|
}
|
||||||
|
SVC_CalcHMACSHA1( md, hmacDest, hmacSize, currentKey, SVC_SHA1_BLOCK_SIZE );
|
||||||
|
return CheckDigest(md, (u8*)digest, TRUE, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_OpenSrl
|
||||||
|
|
||||||
|
Description: open srl file named at HW_TWL_FS_BOOT_SRL_PATH_BUF
|
||||||
|
|
||||||
|
Arguments: pFile pointer to FSFile streucture
|
||||||
|
|
||||||
|
Returns: TRUE if success
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL FS_OpenSrl( FSFile *pFile )
|
||||||
|
{
|
||||||
|
return FS_OpenFileEx( pFile, (char*)HW_TWL_FS_BOOT_SRL_PATH_BUF, FS_FILEMODE_R );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_LoadSrlHeader
|
||||||
|
|
||||||
|
Description: load ROM header to HW_TWL_ROM_HEADER_BUF using normal FS,
|
||||||
|
and verify signature
|
||||||
|
|
||||||
|
Arguments: pFile pointer to FSFile streucture
|
||||||
|
pool heap context to call SVC_DecryptSign
|
||||||
|
rsa_key public key to verify the signature
|
||||||
|
|
||||||
|
Returns: TRUE if success
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL FS_LoadSrlHeader( FSFile *pFile, SVCSignHeapContext* pool, const void* rsa_key )
|
||||||
|
{
|
||||||
|
u8 md[SVC_SHA1_DIGEST_SIZE];
|
||||||
|
u8 digest[SVC_SHA1_DIGEST_SIZE];
|
||||||
|
SignatureData sd;
|
||||||
|
|
||||||
|
if ( !FS_SeekFile( pFile, 0, FS_SEEK_SET ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if ( !FS_ReadFile( pFile, rh, HW_TWL_ROM_HEADER_BUF_SIZE ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
SVC_CalcSHA1( md, rh, FS_HEADER_AUTH_SIZE );
|
||||||
|
|
||||||
|
// コンテンツ証明書
|
||||||
|
if ( CheckRomCertificate( pool, &rh->certificate, rsa_key, *(u32*)rh->s.game_code ) )
|
||||||
|
{
|
||||||
|
rsa_key = rh->certificate.pubKeyMod; // ヘッダ用の鍵の取り出し
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// とりあえずコンテンツ証明書用の鍵がそのまま使えると仮定
|
||||||
|
}
|
||||||
|
|
||||||
|
// ヘッダ署名チェック
|
||||||
|
SVC_DecryptSign( pool, &sd, rh->signature, rsa_key );
|
||||||
|
MI_CpuCopy8( sd.digest, digest, SVC_SHA1_DIGEST_SIZE ); // ダイジェストの取り出し
|
||||||
|
|
||||||
|
// ダイジェスト以外のデータのチェックが必要!!
|
||||||
|
|
||||||
|
MI_CpuClear8( &sd, sizeof(sd) ); // 残り削除 (他に必要なものはない?)
|
||||||
|
return CheckDigest( md, digest, TRUE, TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_LoadSrlStatic
|
||||||
|
|
||||||
|
Description: receive static regions from ARM6 via WRAM-B and store them
|
||||||
|
specified by ROM header at HW_TWL_ROM_HEADER_BUF
|
||||||
|
|
||||||
|
Arguments: pFile pointer to FSFile streucture
|
||||||
|
|
||||||
|
Returns: TRUE if success
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL FS_LoadSrlStatic( FSFile *pFile )
|
||||||
|
{
|
||||||
|
if ( rh->s.main_size > 0 )
|
||||||
|
{
|
||||||
|
if ( !FS_LoadSrlModule( pFile, rh->s.main_ram_address, rh->s.main_rom_offset, rh->s.main_size, rh->s.main_static_digest ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( rh->s.sub_size > 0 )
|
||||||
|
{
|
||||||
|
if ( !FS_LoadSrlModule( pFile, rh->s.sub_ram_address, rh->s.sub_rom_offset, rh->s.sub_size, rh->s.sub_static_digest ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( rh->s.main_ltd_size > 0 )
|
||||||
|
{
|
||||||
|
if ( !FS_LoadSrlModule( pFile, rh->s.main_ltd_ram_address, rh->s.main_ltd_rom_offset, rh->s.main_ltd_size, rh->s.main_ltd_static_digest ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( rh->s.sub_ltd_size > 0 )
|
||||||
|
{
|
||||||
|
if ( !FS_LoadSrlModule( pFile, rh->s.sub_ltd_ram_address, rh->s.sub_ltd_rom_offset, rh->s.sub_ltd_size, rh->s.sub_ltd_static_digest ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|||||||
@ -12,8 +12,8 @@
|
|||||||
# in whole or in part, without the prior written consent of Nintendo.
|
# in whole or in part, without the prior written consent of Nintendo.
|
||||||
#
|
#
|
||||||
# $Date:: $
|
# $Date:: $
|
||||||
# $Rev:$
|
# $Rev$
|
||||||
# $Author:$
|
# $Author$
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
include $(TWLIPL_ROOT)/build/buildtools/commondefs
|
include $(TWLIPL_ROOT)/build/buildtools/commondefs
|
||||||
@ -21,7 +21,7 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs
|
|||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
SUBDIRS = ARM7 ARM9
|
SUBDIRS = ARM9 ARM7
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@ -89,8 +89,8 @@ static const u8 s_digestDefaultKey[ SVC_SHA1_BLOCK_SIZE ] = {
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static BOOL CheckRomCertificate( SVCSignHeapContext* pool, const RomCertificate *pCert, const void* pCAPubKey, u32 gameCode )
|
static BOOL CheckRomCertificate( SVCSignHeapContext* pool, const RomCertificate *pCert, const void* pCAPubKey, u32 gameCode )
|
||||||
{
|
{
|
||||||
u8 digest[DIGEST_SIZE_SHA1];
|
u8 digest[SVC_SHA1_DIGEST_SIZE];
|
||||||
u8 md[DIGEST_SIZE_SHA1];
|
u8 md[SVC_SHA1_DIGEST_SIZE];
|
||||||
int i;
|
int i;
|
||||||
BOOL result = TRUE;
|
BOOL result = TRUE;
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ static BOOL CheckRomCertificate( SVCSignHeapContext* pool, const RomCertificate
|
|||||||
SVC_CalcSHA1( md, pCert, ROM_CERT_SIGN_OFFSET );
|
SVC_CalcSHA1( md, pCert, ROM_CERT_SIGN_OFFSET );
|
||||||
|
|
||||||
// 比較
|
// 比較
|
||||||
for (i = 0; i < DIGEST_SIZE_SHA1; i++)
|
for (i = 0; i < SVC_SHA1_DIGEST_SIZE; i++)
|
||||||
{
|
{
|
||||||
if ( md[i] != digest[i] )
|
if ( md[i] != digest[i] )
|
||||||
{
|
{
|
||||||
@ -230,7 +230,7 @@ BOOL MI_LoadBuffer(u8* dest, u32 size, SVCSHA1Context *ctx)
|
|||||||
BOOL MI_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
BOOL MI_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
||||||
{
|
{
|
||||||
SVCSHA1Context ctx;
|
SVCSHA1Context ctx;
|
||||||
u8 md[DIGEST_SIZE_SHA1];
|
u8 md[SVC_SHA1_DIGEST_SIZE];
|
||||||
SignatureData sd;
|
SignatureData sd;
|
||||||
int i;
|
int i;
|
||||||
BOOL result = TRUE;
|
BOOL result = TRUE;
|
||||||
@ -275,7 +275,7 @@ BOOL MI_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key )
|
|||||||
|
|
||||||
// ヘッダ署名チェック
|
// ヘッダ署名チェック
|
||||||
SVC_DecryptSign( pool, &sd, rh->signature, rsa_key );
|
SVC_DecryptSign( pool, &sd, rh->signature, rsa_key );
|
||||||
for (i = 0; i < DIGEST_SIZE_SHA1; i++)
|
for (i = 0; i < SVC_SHA1_DIGEST_SIZE; i++)
|
||||||
{
|
{
|
||||||
if ( md[i] != sd.digest[i] )
|
if ( md[i] != sd.digest[i] )
|
||||||
{
|
{
|
||||||
@ -362,10 +362,10 @@ static u32 MIi_GetTransferSize( u32 offset, u32 size )
|
|||||||
|
|
||||||
Returns: TRUE if success
|
Returns: TRUE if success
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
static /*inline*/ BOOL MIi_LoadModule(void* dest, u32 offset, u32 size, const u8 digest[DIGEST_SIZE_SHA1])
|
static /*inline*/ BOOL MIi_LoadModule(void* dest, u32 offset, u32 size, const u8 digest[SVC_SHA1_DIGEST_SIZE])
|
||||||
{
|
{
|
||||||
SVCHMACSHA1Context ctx;
|
SVCHMACSHA1Context ctx;
|
||||||
u8 md[DIGEST_SIZE_SHA1];
|
u8 md[SVC_SHA1_DIGEST_SIZE];
|
||||||
int i;
|
int i;
|
||||||
BOOL result = TRUE;
|
BOOL result = TRUE;
|
||||||
|
|
||||||
@ -387,14 +387,14 @@ static /*inline*/ BOOL MIi_LoadModule(void* dest, u32 offset, u32 size, const u8
|
|||||||
profile[pf_cnt++] = PROFILE_SHA1; // checkpoint
|
profile[pf_cnt++] = PROFILE_SHA1; // checkpoint
|
||||||
profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick());
|
profile[pf_cnt++] = (u32)OS_TicksToMicroSeconds(OS_GetTick());
|
||||||
#endif
|
#endif
|
||||||
for (i = 0; i < DIGEST_SIZE_SHA1; i++)
|
for (i = 0; i < SVC_SHA1_DIGEST_SIZE; i++)
|
||||||
{
|
{
|
||||||
if (md[i] != digest[i])
|
if (md[i] != digest[i])
|
||||||
{
|
{
|
||||||
result = FALSE;
|
result = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MI_CpuClear8(md, DIGEST_SIZE_SHA1);
|
MI_CpuClear8(md, SVC_SHA1_DIGEST_SIZE);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -20,10 +20,10 @@
|
|||||||
#define PXI_FIFO_TAG_DATA PXI_FIFO_TAG_USER_0
|
#define PXI_FIFO_TAG_DATA PXI_FIFO_TAG_USER_0
|
||||||
|
|
||||||
#include <twl/aes/common/type.h>
|
#include <twl/aes/common/type.h>
|
||||||
|
#include <firm/aes/common/aes_util.h>
|
||||||
|
|
||||||
#ifdef SDK_ARM7
|
#ifdef SDK_ARM7
|
||||||
#include <firm/aes/ARM7/aes_init.h>
|
#include <firm/aes/ARM7/aes_init.h>
|
||||||
#include <firm/aes/ARM7/aes_util.h>
|
|
||||||
#include <firm/aes/ARM7/aes_ids.h>
|
#include <firm/aes/ARM7/aes_ids.h>
|
||||||
#else // !SDK_ARM7
|
#else // !SDK_ARM7
|
||||||
#include <firm/aes/ARM9/aes_init.h>
|
#include <firm/aes/ARM9/aes_init.h>
|
||||||
|
|||||||
@ -21,6 +21,8 @@
|
|||||||
#ifdef SDK_ARM7
|
#ifdef SDK_ARM7
|
||||||
#include <firm/fatfs/ARM7/fatfs_loader.h>
|
#include <firm/fatfs/ARM7/fatfs_loader.h>
|
||||||
#include <firm/fatfs/ARM7/fatfs_firm.h>
|
#include <firm/fatfs/ARM7/fatfs_firm.h>
|
||||||
|
#else
|
||||||
|
#include <firm/fatfs/ARM9/fatfs_firm.h>
|
||||||
#endif // SDK_ARM7
|
#endif // SDK_ARM7
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
49
include/firm/fatfs/ARM9/fatfs_firm.h
Normal file
49
include/firm/fatfs/ARM9/fatfs_firm.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlIPL - include - fatfs
|
||||||
|
File: fatfs_firm.h
|
||||||
|
|
||||||
|
Copyright 2007 Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
|
||||||
|
$Date:: 2007-09-06$
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef FIRM_FATFS_FATFS_FIRM_H_
|
||||||
|
#define FIRM_FATFS_FATFS_FIRM_H_
|
||||||
|
|
||||||
|
#include <twl/types.h>
|
||||||
|
#include <twl/fatfs/common/api.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FIRM_FATFS_COMMAND_BUFFER (HW_MAIN_MEM + 0x00ffc000)
|
||||||
|
#define FIRM_FATFS_COMMAND_BUFFER_SIZE FATFS_COMMAND_BUFFER_MAX
|
||||||
|
#define FIRM_FATFS_COMMAND_BUFFER_END (FIRM_FATFS_COMMAND_BUFFER + FIRM_FATFS_COMMAND_BUFFER_SIZE)
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FATFS_InitFIRM
|
||||||
|
|
||||||
|
Description: initialize fatfs for firm
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void FATFS_InitFIRM( void );
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* FIRM_FATFS_FATFS_FIRM_H_ */
|
||||||
|
#endif
|
||||||
@ -104,6 +104,60 @@ BOOL FS_LoadHeader( SVCSignHeapContext* pool, const void* rsa_key );
|
|||||||
BOOL FS_LoadStatic( void );
|
BOOL FS_LoadStatic( void );
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_LoadSrlModule
|
||||||
|
|
||||||
|
Description: receive data from ARM7 via WRAM-B and store in destination address
|
||||||
|
in view of AES settings in the ROM header at HW_TWL_ROM_HEADER_BUF,
|
||||||
|
then verify the digest
|
||||||
|
|
||||||
|
Arguments: pFile pointer to FSFile streucture
|
||||||
|
dest destination address to read
|
||||||
|
offset file offset to start to read in bytes
|
||||||
|
size total length to read in bytes
|
||||||
|
digest digest to verify
|
||||||
|
|
||||||
|
Returns: TRUE if success
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL FS_LoadSrlModule( FSFile *pFile, u8* dest, u32 offset, u32 size, const u8 digest[SVC_SHA1_BLOCK_SIZE] );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_OpenSrl
|
||||||
|
|
||||||
|
Description: open srl file named at HW_TWL_FS_BOOT_SRL_PATH_BUF
|
||||||
|
|
||||||
|
Arguments: pFile pointer to FSFile streucture
|
||||||
|
|
||||||
|
Returns: TRUE if success
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL FS_OpenSrl( FSFile *pFile );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_LoadSrlHeader
|
||||||
|
|
||||||
|
Description: load ROM header to HW_TWL_ROM_HEADER_BUF using normal FS,
|
||||||
|
and verify signature
|
||||||
|
|
||||||
|
Arguments: pFile pointer to FSFile streucture
|
||||||
|
pool heap context to call SVC_DecryptSign
|
||||||
|
rsa_key public key to verify the signature
|
||||||
|
|
||||||
|
Returns: TRUE if success
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL FS_LoadSrlHeader( FSFile *pFile, SVCSignHeapContext* pool, const void* rsa_key );
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: FS_LoadSrlStatic
|
||||||
|
|
||||||
|
Description: receive static regions from ARM6 via WRAM-B and store them
|
||||||
|
specified by ROM header at HW_TWL_ROM_HEADER_BUF
|
||||||
|
|
||||||
|
Arguments: pFile pointer to FSFile streucture
|
||||||
|
|
||||||
|
Returns: TRUE if success
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL FS_LoadSrlStatic( FSFile *pFile );
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user