・生産工程でNANDに書き込んで、以降はReadOnlyとなるHW情報を追加。

・HW情報や本体設定データを共通のTSFフォーマットにするため、TSF
 フォーマットのコードを追加。(現状はHW情報のみ対応)
・HW情報用のRSA鍵ペアを追加。
・acsignライブラリにRSA暗号化関数を追加。
・acsignライブラリのRSAでコード関数の値チェックを修正。
・HW情報をライトするHWInfoWriterを追加。
・NANDフラッシュマップ&フォルダツリーのフォルダ構成における各ファイルに
 ついて、RSA署名の有無と使用する鍵による色分けを行う。
・TWL_SystemMenuメモリマップにNANDファーム用バッファを記載。
 (ランチャーとメモリが重ならないように)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@312 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-12-05 12:19:30 +00:00
parent 84cd86d19d
commit 75a9423d25
41 changed files with 1903 additions and 84 deletions

View File

@ -24,7 +24,7 @@ SPACE ?= $(EMPTY) $(EMPTY)
ifndef TWL_KEYSDIR
DUMMY_KEYS_SUFFIX = .dummykey
endif
TWL_KEYSDIR ?= $(FIRM_ROOT)/keys/dummy
TWL_KEYSDIR ?= $(FIRM_ROOT)/keys/firm/dummy
TARGET_BIN ?= $(subst .,$(DUMMY_KEYS_SUFFIX).,$(TARGET_FIRM_BIN))

View File

@ -103,8 +103,8 @@ TwlSpMain(void)
// MMEMサイズチェックは、ARM7の_start内でやっているので、ーケアでOK.
// SCFGレジスタ→HWi_WSYS04 etc.→system shared領域への値セットは、ランチャー起動時点では行われていないので、
// ランチャー自身がこれらの値を使うには、自身でこれらの値をセットしてやる必要がある。
// ランチャーからアプリを起動する際には、reboot.cが
SetSCFGWork();
// ランチャーからアプリを起動する際には、reboot.cが値を再セットしてくれる。
// SetSCFGWork(); // [TODO]未デバッグ
// OS 初期化
OS_Init();

View File

@ -30,7 +30,9 @@ TWL_PROC = ARM9
INCDIR = include \
$(TWLSDK_ROOT)/build/libraries/mb/common/include
SRCS = acsign.c acmemory.c acsign_util.c
SRCS = acsign.c acmemory.c acsign_util.c \
acsign_encrypt.c \
ber_lib.c ber_isk.c ber_par.c
TARGET_LIB = libacsign$(TWL_LIBSUFFIX).a

View File

@ -25,6 +25,7 @@ extern "C" {
//
void ACMemory_Clear( );
void* ACMemory_Alloc( u32 size );
void* ACMemory_Realloc( void *adrs, u32 nowsize, u32 newsize );
void ACMemory_Free( void* adrs );
void* ACMemory_Memset( void* adrs, u32 val, u32 cnt );
void* ACMemory_Memcpy( void* dst, void* src, u32 cnt );

View File

@ -58,6 +58,18 @@ unsigned long aACMemoryPoolB[ 16 ];
#define nACMemory_TailBlock( _tail ) (((volatile unsigned long*)(_tail))[-1])
#define nACMemory_TailCheck( _tail ) (((volatile unsigned long*)(_tail))[-2])
static void *(*s_acsignAlloc)( u32 length );
static void (*s_acsignFree)( void *ptr );
void ACSign_SetAllocFunc( void *(*pAlloc)( u32 ), void (*pFree)( void * ) );
void ACSign_SetAllocFunc( void *(*pAlloc)( u32 ), void (*pFree)( void * ) )
{
s_acsignAlloc = pAlloc;
s_acsignFree = pFree;
}
//#define USE_OSALLOC
//#define USE_ACMEMORY_DEBUGDUMP
//#define USE_ACMEMORY_DEBUGFILL
@ -142,6 +154,12 @@ void ACMemory_Clear( )
//
void* ACMemory_Alloc( u32 size )
{
if( s_acsignAlloc ) {
return s_acsignAlloc( size );
}
return NULL;
/*
#if defined( USE_OSALLOC )
OSIntrMode nOSIntrMode;
void* alloc = NULL;
@ -220,11 +238,16 @@ void* ACMemory_Alloc( u32 size )
return (void*)pACMemory_FromHeadToBody( head );
#endif
*/
}
//
void ACMemory_Free( void* adrs )
{
if( s_acsignFree ) {
s_acsignFree( adrs );
}
/*
#if defined( USE_OSALLOC )
OSIntrMode nOSIntrMode;
@ -284,6 +307,7 @@ void ACMemory_Free( void* adrs )
ACMemory_DebugDump( );
#endif
*/
}
@ -304,3 +328,8 @@ void* ACMemory_Memcpy( void* dst, void* src, u32 cnt )
}
void* ACMemory_Realloc( void *adrs, u32 nowsize, u32 newsize )
{
#pragma unused( adrs, nowsize, newsize )
return NULL;
}

View File

@ -291,7 +291,7 @@ int ACSign_Decrypto(
if ( !key_ptr ) return 0;
//
ACMemory_Clear( );
// ACMemory_Clear( );
//
exp_ptr = &nDummyExp;

View File

@ -26,7 +26,8 @@ TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TWL_PROC = ARM9
SRCS = NTRSettings.c TWLSettings.c
SRCS = NTRSettings.c TWLSettings.c \
TWLHWInfo.c TWLStoreFile.c
TARGET_LIB = libsettings$(TWL_LIBSUFFIX).a

View File

@ -0,0 +1,348 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: TWLHWInfo.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 <twl.h>
#include <sysmenu/settings/common/TWLHWInfo.h>
// define data----------------------------------------------------------
//#define USE_SHA1_SIGNATURE // 署名内のハッシュにSHA1を使用未定義ならHMAC-SHA1を使用
// function's prototype-------------------------------------------------
static BOOL THWIi_CheckDigest( void *pTgt, u32 length, u8 *pDigest );
static BOOL THWIi_CheckNormalValue( const TWLHWNormalInfo *pSrcInfo );
static BOOL THWIi_CheckSignature( void *pTgt, u32 length, u8 *pSignature );
static BOOL THWIi_CheckSecureValue( const TWLHWSecureInfo *pSecure );
static void DEBUG_PrintDigest( u8 *pDigest );
static void DEBUG_Dump( u8 *pSrc, u32 len );
static void HMACSHA1( u8 *pDigest, u8 *pSrc, u32 len, u8 *pKey, u32 keyLen );
// static variables-----------------------------------------------------
TWLHWNormalInfo s_hwInfoN ATTRIBUTE_ALIGN(32);
TWLHWSecureInfo s_hwInfoS ATTRIBUTE_ALIGN(32);
static BOOL s_isReadNormal;
static BOOL s_isReadSecure;
// global variables-----------------------------------------------------
// const data-----------------------------------------------------------
// ノーマル情報 デフォルト値
static TWLHWNormalInfo s_normalDefault = {
0x5a,
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
};
// ノーマル情報 バージョン互換リスト
static const u8 s_normalVersionList[] = { 1, TSF_VERSION_TERMINATOR };
// ーマル情報 TSFリードパラメータ
static const TSFParam s_normalParam = {
sizeof(TWLHWNormalInfo),
TWL_HWINFO_FILE_LENGTH,
s_normalVersionList,
&s_normalDefault,
THWIi_CheckDigest,
(int (*)(void *))THWIi_CheckNormalValue,
};
// セキュア情報 デフォルト値
static TWLHWSecureInfo s_secureDefault = {
TWL_REGION_AMERICA,
{ TWL_HWINFO_SERIALNO_LEN_AMERICA, "0123456789A" },
};
// セキュア情報 バージョン互換リスト
static const u8 s_secureVersionList[] = { 1, TSF_VERSION_TERMINATOR };
// セキュア情報 TSFリードパラメータ
static const TSFParam s_secureParam = {
sizeof(TWLHWSecureInfo),
TWL_HWINFO_FILE_LENGTH,
s_secureVersionList,
&s_secureDefault,
THWIi_CheckSignature,
(int (*)(void *))THWIi_CheckSecureValue,
};
// セキュア情報 公開鍵
static const u8 s_publicKey[ RSA_KEY_LENGTH ] = {
0xc0, 0xe0, 0x88, 0x61, 0xc2, 0xc7, 0x0c, 0xef, 0x3c, 0xe5, 0x4e, 0xe4, 0x36, 0xce, 0xb4, 0x6f,
0x77, 0xde, 0xb0, 0x44, 0xc4, 0x60, 0xd6, 0x28, 0xcf, 0xa1, 0xf4, 0xc3, 0xce, 0x5f, 0xd5, 0x1f,
0xc2, 0x96, 0x6f, 0x54, 0x62, 0x60, 0x76, 0x34, 0x18, 0xbe, 0xff, 0xaa, 0xd8, 0x09, 0xea, 0x63,
0x95, 0xf7, 0xdb, 0xc5, 0x8f, 0x59, 0xb8, 0xac, 0x13, 0x84, 0xe3, 0x1c, 0x43, 0xb6, 0xf7, 0x4d,
0xd1, 0x91, 0xaf, 0x99, 0xf4, 0xef, 0xc3, 0x98, 0xb0, 0xcc, 0x39, 0xc8, 0x67, 0xf3, 0x83, 0x39,
0x30, 0x78, 0x98, 0x15, 0x72, 0x4a, 0xc0, 0x61, 0xad, 0x2b, 0xf6, 0xf8, 0xbd, 0x6d, 0x78, 0x7a,
0x84, 0xf3, 0x7b, 0x3d, 0x15, 0x26, 0xc3, 0xdb, 0x01, 0xa5, 0x2d, 0xbe, 0x2a, 0x68, 0xe6, 0xaf,
0x6f, 0x11, 0xa5, 0xd7, 0x76, 0xaf, 0x3f, 0xce, 0x75, 0x95, 0x08, 0xb2, 0x37, 0xfb, 0x85, 0xc9,
};
// ---------------------------------------------------------------------
// HWーマル情報
// ---------------------------------------------------------------------
// リード
TSFReadResult THW_ReadNormalInfo( void )
{
s_isReadNormal = TRUE;
return TSF_ReadFile( (char *)TWL_HWINFO_NORMAL_PATH, &s_hwInfoN, &s_normalParam, NULL );
}
// ライト
BOOL THW_WriteNormalInfo( void )
{
if( !s_isReadNormal ) {
return FALSE;
}
return THW_WriteNormalInfoDirect( &s_hwInfoN );
}
// 直接ライト
BOOL THW_WriteNormalInfoDirect( const TWLHWNormalInfo *pSrcInfo )
{
// ヘッダの作成
TSFHeader header;
MI_CpuClear8( &header, sizeof(TSFHeader) );
header.version = TWL_HWINFO_NORMAL_VERSION;
header.bodyLength = sizeof( TWLHWNormalInfo );
SVC_CalcSHA1( header.digest.sha1, pSrcInfo, sizeof(TWLHWNormalInfo) );
// ライト
if( !TSF_WriteFile( (char *)TWL_HWINFO_NORMAL_PATH,
&header,
(const void *)pSrcInfo,
DISABLE_SAVE_COUNT ) ) {
return FALSE;
}
// 未リード時、staticバッファへのコピーを行う
if( !s_isReadNormal ) {
s_isReadNormal = TRUE;
MI_CpuCopy8( pSrcInfo, &s_hwInfoN, sizeof(TWLHWNormalInfo) );
}
return TRUE;
}
// ファイルのリカバリ
BOOL THW_RecoveryNormalInfo( TSFReadResult err )
{
return TSF_RecoveryFile( err, (char *)TWL_HWINFO_NORMAL_PATH, TWL_HWINFO_FILE_LENGTH );
}
// ダイジェストチェック
static BOOL THWIi_CheckDigest( void *pTgt, u32 length, u8 *pDigest )
{
u8 digest[ SVC_SHA1_DIGEST_SIZE ];
SVC_CalcSHA1( digest, pTgt, length );
return SVC_CompareSHA1( digest, pDigest );
}
// 値チェック
static BOOL THWIi_CheckNormalValue( const TWLHWNormalInfo *pSrcInfo )
{
#pragma unused(pSrcInfo)
return TRUE;
}
// 新しいデフォルト値のセット
void TWH_SetNormalDefaultValue( const TWLHWNormalInfo *pSrcInfo )
{
MI_CpuCopy8( pSrcInfo, &s_normalDefault, sizeof(TWLHWNormalInfo) );
}
// ---------------------------------------------------------------------
// HWセキュア情報
// ---------------------------------------------------------------------
// リード
TSFReadResult THW_ReadSecureInfo( void )
{
s_isReadSecure = TRUE;
return TSF_ReadFile( (char *)TWL_HWINFO_SECURE_PATH, &s_hwInfoS, &s_secureParam, NULL );
}
#ifdef HW_SECURE_INFO_WRITE_ENABLE_
// ライト
BOOL THW_WriteSecureInfo( const u8 *pPrivKeyDER )
{
if( !s_isReadSecure ) {
return FALSE;
}
return THW_WriteSecureInfoDirect( &s_hwInfoS, pPrivKeyDER );
}
// 直接ライト
BOOL THW_WriteSecureInfoDirect( const TWLHWSecureInfo *pSrcInfo, const u8 *pPrivKeyDER )
{
// ヘッダの作成
TSFHeader header;
u8 digest[ SVC_SHA1_DIGEST_SIZE ];
u64 id = SCFG_ReadFuseData();
MI_CpuClear8( &header, sizeof(TSFHeader) );
header.version = TWL_HWINFO_SECURE_VERSION;
header.bodyLength = sizeof( TWLHWSecureInfo );
#ifdef USE_SHA1_SIGNATURE
SVC_CalcSHA1( digest, pSrcInfo, sizeof(TWLHWSecureInfo) );
#else
// SVC_CalcHMACSHA1( digest, pSrcInfo, sizeof(TWLHWSecureInfo), &id, sizeof(u64) );
HMACSHA1( digest, (unsigned char *)pSrcInfo, sizeof(TWLHWSecureInfo), (u8 *)&id, sizeof(u64) );
#endif
if( !ACSign_Encrypto( header.digest.rsa,
pPrivKeyDER,
digest,
SVC_SHA1_DIGEST_SIZE ) ) {
return FALSE;
}
// ライト
if( !TSF_WriteFile( (char *)TWL_HWINFO_SECURE_PATH,
&header,
(const void *)pSrcInfo,
DISABLE_SAVE_COUNT ) ) {
return FALSE;
}
// 未リード時、staticバッファへのコピーを行う
if( !s_isReadSecure ) {
s_isReadSecure = TRUE;
MI_CpuCopy8( pSrcInfo, &s_hwInfoS, sizeof(TWLHWSecureInfo) );
}
return TRUE;
}
// ファイルのリカバリ
BOOL THW_RecoverySecureInfo( TSFReadResult err )
{
return TSF_RecoveryFile( err, (char *)TWL_HWINFO_SECURE_PATH, TWL_HWINFO_FILE_LENGTH );
}
#endif // HW_SECURE_INFO_WRITE_ENABLE_
// 署名チェック
static BOOL THWIi_CheckSignature( void *pTgt, u32 length, u8 *pSignature )
{
static u32 heap[ 4096 / sizeof(u32) ];
SVCSignHeapContext acmemoryPool;
u8 digest_sign[ SVC_SHA1_DIGEST_SIZE ];
u8 digest_calc[ SVC_SHA1_DIGEST_SIZE ];
u64 id = SCFG_ReadFuseData();
#ifdef USE_SHA1_SIGNATURE
SVC_CalcSHA1( digest_calc, pTgt, length );
#else
// SVC_CalcHMACSHA1( digest_calc, pTgt, length, (u8 *)&id, sizeof(u64) );
HMACSHA1( digest_calc, pTgt, length, (u8 *)&id, sizeof(u64) );
#endif
SVC_InitSignHeap( &acmemoryPool, heap, 4096 );
SVC_DecryptSign( &acmemoryPool, digest_sign, pSignature, s_publicKey );
return SVC_CompareSHA1( digest_sign, digest_calc );
}
// HW Secure情報 値チェック
static BOOL THWIi_CheckSecureValue( const TWLHWSecureInfo *pSrcInfo )
{
if(
( pSrcInfo->region >= TWL_REGION_MAX ) ||
( ( pSrcInfo->serialNo.length != TWL_HWINFO_SERIALNO_LEN_AMERICA ) &&
( pSrcInfo->serialNo.length != TWL_HWINFO_SERIALNO_LEN_OTHERS ) )
) {
return FALSE;
}
return TRUE;
}
// 新しいデフォルト値のセット
void TWH_SetSecureDefaultValue( const TWLHWSecureInfo *pSrcInfo )
{
MI_CpuCopy8( pSrcInfo, &s_secureDefault, sizeof(TWLHWSecureInfo) );
}
const TWLHWNormalInfo *THW_GetDefaultNormalInfo( void );
const TWLHWSecureInfo *THW_GetDefaultSecureInfo( void );
const TWLHWNormalInfo *THW_GetNormalInfo( void );
const TWLHWSecureInfo *THW_GetSecureInfo( void );
const TWLHWNormalInfo *THW_GetDefaultNormalInfo( void )
{
return &s_normalDefault;
}
const TWLHWSecureInfo *THW_GetDefaultSecureInfo( void )
{
return &s_secureDefault;
}
const TWLHWNormalInfo *THW_GetNormalInfo( void )
{
return &s_hwInfoN;
}
const TWLHWSecureInfo *THW_GetSecureInfo( void )
{
return &s_hwInfoS;
}
static void DEBUG_PrintDigest( u8 *pDigest )
{
int i;
for( i = 0; i < SVC_SHA1_DIGEST_SIZE; i++ ) {
OS_TPrintf( "%02x", *pDigest++ );
}
OS_TPrintf( "\n" );
}
static void DEBUG_Dump( u8 *pSrc, u32 len )
{
int i;
for( i = 0; i < len; i++ ) {
if( ( i & 0x0f ) == 0 ) {
OS_TPrintf( "\n" );
}
OS_TPrintf( "%02x ", *pSrc++ );
}
OS_TPrintf( "\n" );
}
// HMAC SHA-1算出現SDKではSVC_CalcHMACSHA1にバグがあるので、これを使用
static void HMACSHA1( u8 *pDigest, u8 *pSrc, u32 len, u8 *pKey, u32 keyLen )
{
static SVCHMACSHA1Context s_hmac;
SVC_HMACSHA1Init( &s_hmac, pKey, keyLen );
SVC_HMACSHA1Update( &s_hmac, pSrc, len );
SVC_HMACSHA1GetHash( &s_hmac, pDigest );
}

View File

@ -50,15 +50,6 @@ static const char *s_TSDPath[ TSD_FILE_MIRROR_NUM ] = {
(const char *)"nand:/shared1/TWLCFG1.dat",
};
static const u16 s_validLangBitmapList[] = {
TWL_LANG_BITMAP_JAPAN,
TWL_LANG_BITMAP_AMERICA,
TWL_LANG_BITMAP_EUROPE,
TWL_LANG_BITMAP_AUSTRALIA,
TWL_LANG_BITMAP_CHINA,
TWL_LANG_BITMAP_KOREA,
};
// function's description-----------------------------------------------
@ -84,7 +75,7 @@ static BOOL TSDi_WriteSettingsDirect( TSDStore *pTSDStore )
pTSDStore->header.dataLength = sizeof(TWLSettingsData);
// ダイジェスト算出(自分のバージョンのデータサイズで算出)
SVC_CalcSHA1( pTSDStore->header.digest, &pTSDStore->tsd, sizeof(TWLSettingsData) );
SVC_CalcSHA1( pTSDStore->digest, &pTSDStore->tsd, sizeof(TWLSettingsData) );
FS_InitFile( &file );
@ -171,9 +162,9 @@ BOOL TSD_ReadSettings( TSDStore (*pTempBuffer)[2] )
goto NEXT;
}
// データのダイジェストチェック
// データのダイジェストチェックSHA1とCRC16の時間を計測したが、数十us差しかなかったので、SHA1のままでいく。
SVC_CalcSHA1( digest, &pTSDStore[ i ].tsd, pTSDStore[ i ].header.dataLength );
if( !SVC_CompareSHA1( digest, pTSDStore[ i ].header.digest ) ) {
if( !SVC_CompareSHA1( digest, pTSDStore[ i ].digest ) ) {
OS_TPrintf( "TSD[%d] : file digest error.\n", i );
dataErrFlag |= 0x01 << i;
goto NEXT;
@ -339,7 +330,5 @@ static void TSDi_ClearSettings( TWLSettingsData *pTSD )
pTSD->owner.birthday.day = 1;
pTSD->language = TWL_LANG_ENGLISH;
pTSD->region = TWL_DEFAULT_REGION; // リージョンは本体設定データからなくなる予定
pTSD->valid_language_bitmap = s_validLangBitmapList[ pTSD->region ];
// 対応言語ビットマップも本体設定データからなくなる予定
}

View File

@ -0,0 +1,252 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: TWLHWInfo.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 <twl.h>
#include <sysmenu/settings/common/TWLStoreFile.h>
// define data----------------------------------------------------------
// function's prototype-------------------------------------------------
// static variables-----------------------------------------------------
// global variables-----------------------------------------------------
// const data-----------------------------------------------------------
// function's description-----------------------------------------------
// TSFファイルの読み出し
TSFReadResult TSF_ReadFile( char *pPath, void *pDstBody, const TSFParam *pParam, u8 *pDstSaveCount )
{
TSFHeader header;
TSFReadResult retval;
FSFile file;
FS_InitFile( &file );
// ヘッダ用バッファのクリア
MI_CpuClear8( &header, sizeof(TSFHeader) );
// ボディ用バッファのクリア
if( pParam->pDefaultValue ) {
// デフォルト指定ありの時は、バージョン下位互換の場合を考慮して、デフォルト値をコピーしておく
MI_CpuCopy8( pParam->pDefaultValue, pDstBody, pParam->dataLength );
}else {
// そうでない場合は、リードバッファをクリア
MI_CpuClear8( pDstBody, pParam->dataLength );
}
// ファイルオープン
if( !FS_OpenFileEx( &file, pPath, FS_FILEMODE_R ) ) {
OS_TPrintf( "Read : file open error. %s\n", pPath );
retval = TSF_READ_RESULT_ERROR_FILE_EXIST;
goto END2;
}
// ファイル長チェック
if( FS_GetFileLength( &file ) != pParam->fileLength ) {
OS_TPrintf( "Read : file length error. : %s length = %d\n", pPath, FS_GetFileLength( &file ) );
retval = TSF_READ_RESULT_ERROR_FILE_LENGTH;
goto END;
}
// ヘッダリード
if( FS_ReadFile( &file, &header, sizeof(TSFHeader) ) < sizeof(TSFHeader) ) {
OS_TPrintf( "Read : file read error. %s\n", pPath );
retval = TSF_READ_RESULT_ERROR_DATA;
goto END;
}
// ヘッダチェック
if( header.bodyLength > pParam->dataLength ) {
OS_TPrintf( "Read : file header error. %s\n", pPath );
retval = TSF_READ_RESULT_ERROR_DATA;
goto END;
}
// ボディリード
if( FS_ReadFile( &file, pDstBody, (long)header.bodyLength ) < pParam->dataLength ) {
OS_TPrintf( "Read : file read error. %s\n", pPath );
retval = TSF_READ_RESULT_ERROR_DATA;
goto END;
}
// データのダイジェストチェック
if( pParam->pCheckDigestFunc &&
!pParam->pCheckDigestFunc( pDstBody, header.bodyLength, header.digest.dst ) ) {
OS_TPrintf( "Read : file digest error. %s\n", pPath );
retval = TSF_READ_RESULT_ERROR_DATA;
goto END;
}
// データの値チェック
if( pParam->pCheckValueFunc &&
!pParam->pCheckValueFunc( pDstBody ) ) {
OS_TPrintf( "Read : file data value error. %s\n", pPath );
retval = TSF_READ_RESULT_ERROR_DATA;
goto END;
}
// バージョン互換チェック
if( pParam->conpatibleVerList ) {
const u8 *pVersion = pParam->conpatibleVerList;
while( *pVersion++ != TSF_VERSION_TERMINATOR ) {
if( *pVersion == header.version ) {
break; // 互換あり
}
}
if( *pVersion == TSF_VERSION_TERMINATOR ) {
retval = TSF_READ_RESULT_ERROR_DATA;
goto END;
}
}
if( pDstSaveCount ) {
*pDstSaveCount = header.saveCount;
}
retval = TSF_READ_RESULT_SUCCEEDED;
END:
// ファイルクローズ
FS_CloseFile( &file );
END2:
if( retval != TSF_READ_RESULT_SUCCEEDED ) {
// ボディ用バッファのクリア
if( pParam->pDefaultValue ) {
// バージョン下位互換の場合を考慮して、デフォルト値をコピーしておく
MI_CpuCopy8( pParam->pDefaultValue, pDstBody, pParam->dataLength );
}else {
// そうでない場合は、リードバッファをクリア
MI_CpuClear8( pDstBody, pParam->dataLength );
}
}
return retval;
}
// TWLファイルのライト
BOOL TSF_WriteFile( char *pPath, TSFHeader *pHeader, const void *pSrcBody, u8 saveCount )
{
BOOL retval = FALSE;
FSFile file;
FS_InitFile( &file );
if( saveCount != DISABLE_SAVE_COUNT ) {
pHeader->saveCount = (u8)( ( saveCount + 1 ) & SAVE_COUNT_MASK );
}else {
pHeader->saveCount = 0;
}
OS_TPrintf( "Write > %s : 0x%02x\n", pPath, pHeader->saveCount );
// ファイルオープン
if( !FS_OpenFileEx( &file, pPath, FS_FILEMODE_R | FS_FILEMODE_W ) ) { // R|Wモードで開くと、既存ファイルを残したまま更新。
OS_TPrintf( "Write : file open error. %s\n", pPath );
return FALSE;
}
// ライト
if( FS_WriteFile( &file, pHeader, sizeof(TSFHeader) ) < sizeof(TSFHeader) ) {
OS_TPrintf( "Write : file header write error. %s\n", pPath );
goto END;
}
if( FS_WriteFile( &file, pSrcBody, (long)pHeader->bodyLength ) < pHeader->bodyLength ) {
OS_TPrintf( "Write : file body write error. %s\n", pPath );
goto END;
}
retval = TRUE;
END:
// ファイルクローズ
FS_CloseFile( &file );
return retval;
}
// TWLファイルのリカバリ
BOOL TSF_RecoveryFile( TSFReadResult err, char *pPath, u32 fileLength )
{
#define INITIAL_DATA_PATTERN 0xffffffff
#define READ_SIZE 1024
u32 buffer[ READ_SIZE / sizeof(u32) ];
u32 length;
BOOL retval = FALSE;
FSFile file;
FS_InitFile( &file );
if( err == TSF_READ_RESULT_SUCCEEDED ) {
return TRUE;
}
// ファイル生成
if( err == TSF_READ_RESULT_ERROR_FILE_EXIST ) {
if( !FS_CreateFile( pPath, FS_PERMIT_R | FS_PERMIT_W ) ) {
OS_TPrintf( "Recovery: create file error. %s\n", pPath );
goto END2;
}
}
// ファイルオープン
if( !FS_OpenFileEx( &file, pPath, FS_FILEMODE_R | FS_FILEMODE_W ) ) {
OS_TPrintf( "Recovery : file open error. %s\n", pPath );
goto END2;
}
// ファイル長変更
if( ( err == TSF_READ_RESULT_ERROR_FILE_EXIST ) ||
( err == TSF_READ_RESULT_ERROR_FILE_LENGTH ) ) {
if( FS_SetFileLength( &file, fileLength ) != FS_RESULT_SUCCESS ) {
OS_TPrintf( "Recovery : set file length error. %s\n", pPath );
goto END;
}
}
// ファイル内データ初期化0xff埋め
MI_CpuFillFast( buffer, INITIAL_DATA_PATTERN, sizeof(buffer) );
length = fileLength;
while( length ) {
u32 wrSize = ( length > READ_SIZE ) ? READ_SIZE : length;
if( FS_WriteFile( &file, buffer, (s32)wrSize ) < wrSize ) {
OS_TPrintf( "Recovery : write error. %s\n", pPath );
goto END;
}
length -= wrSize;
}
// ベリファイ
FS_SeekFile( &file, 0, FS_SEEK_SET );
length = fileLength;
while( length ) {
int i;
u32 rdSize = ( length > READ_SIZE ) ? READ_SIZE : length;
FS_ReadFile( &file, buffer, (s32)rdSize );
for( i = 0; i < rdSize / sizeof(u32); i++ ) {
if( buffer[ i ] != INITIAL_DATA_PATTERN ) {
OS_TPrintf( "Recovery : verify error. %s\n", pPath );
goto END;
}
}
length -= rdSize;
}
retval = TRUE;
END:
// ファイルクローズ
FS_CloseFile( &file );
END2:
return retval;
}

View File

@ -0,0 +1,60 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - demos - simpleShoot-1
# 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 = ../../../libraries_sysmenu/acsign \
../../../libraries_sysmenu/settings
#----------------------------------------------------------------------------
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TITLEID_LO = HIWR
TARGET_TAD = $(BINDIR)/$(TITLEID_LO).tad
TARGET_BIN = main.srl
ROM_SPEC = main.rsf
MISC_DIR = ../../misc
SRCS = main.c HWInfoWriter.c \
$(MISC_DIR)/src/misc.c $(MISC_DIR)/src/cmn.c
LINCLUDES = $(MISC_DIR)/include
MAKEROM_FLAGS += -DTITLEID_LO='$(TITLEID_LO)'
include $(TWLIPL_ROOT)/build/buildtools/commondefs
LDIRT_CLEAN = $(TARGET_TAD)
INSTALL_TARGETS = $(TARGET_TAD)
INSTALL_DIR = $(SDK_NMENU_DATADIR)
#----------------------------------------------------------------------------
do-build : $(TARGETS)
include $(TWLIPL_ROOT)/build/buildtools/modulerules
#----------------------------------------------------------------------------
#===== End of Makefile =====

View File

@ -0,0 +1,154 @@
#----------------------------------------------------------------------------
# Project: TwlSDK - include
# File: ROM-BB.rsf
#
# Copyright 2007 Nintendo. All rights reserved.
#
# These coded insructions, 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$
#----------------------------------------------------------------------------
#
# TWL ROM SPEC FILE
#
Arm9
{
Static "$(MAKEROM_ARM9:r).TWL.FLX.sbin$(COMPSUFFIX9)"
OverlayDefs "$(MAKEROM_ARM9:r)_defs.TWL.FLX.sbin$(COMPSUFFIX9)"
OverlayTable "$(MAKEROM_ARM9:r)_table.TWL.FLX.sbin$(COMPSUFFIX9)"
Elf "$(MAKEROM_ARM9:r).tef"
}
Arm7
{
Static "$(MAKEROM_ARM7_BASE:r).TWL.FLX.sbin$(COMPSUFFIX7)"
OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.TWL.FLX.sbin$(COMPSUFFIX7)"
OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.TWL.FLX.sbin$(COMPSUFFIX7)"
Elf "$(MAKEROM_ARM7_BASE:r).tef"
}
Arm9.Ltd
{
Static "$(MAKEROM_ARM9:r).TWL.LTD.sbin$(COMPSUFFIX9)"
OverlayDefs "$(MAKEROM_ARM9:r)_defs.TWL.LTD.sbin$(COMPSUFFIX9)"
OverlayTable "$(MAKEROM_ARM9:r)_table.TWL.LTD.sbin$(COMPSUFFIX9)"
}
Arm7.Ltd
{
Static "$(MAKEROM_ARM7_BASE:r).TWL.LTD.sbin$(COMPSUFFIX7)"
OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.TWL.LTD.sbin$(COMPSUFFIX7)"
OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.TWL.LTD.sbin$(COMPSUFFIX7)"
}
Property
{
###
### Settings for FinalROM
###
#### BEGIN
#
# TITLE NAME: Your product name within 12bytes
#
#TitleName "YourAppName"
#
# MAKER CODE: Your company ID# in 2 ascii words
# issued by NINTENDO
#
#MakerCode "00"
#
# REMASTER VERSION: Mastering version
#
#RomVersion 0
#
# ROM SPEED TYPE: [MROM/1TROM/UNDEFINED]
#
RomSpeedType $(MAKEROM_ROMSPEED)
#
# ROM SIZE: in bit [64M/128M/256M/512M/1G/2G]
#
#RomSize 128M
#RomSize 256M
#
# ROM PADDING: TRUE if finalrom
#
#RomFootPadding TRUE
#
# ROM HEADER TEMPLATE: Provided to every product by NINTENDO
#
#RomHeaderTemplate ./etc/rom_header.template.sbin
#
# BANNER FILE: generated from Banner Spec File
#
BannerFile ../banner/banner.bnr
###
### Setting for TWL
###
#
# BANNER FILE:
#
BannerTWLFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr
#
# Boot allowed Media: [GameCard/NAND/SDCard/DownloadPlay]
# possible to choose one or more.
#
BootMedia GameCard NAND SDCard DownloadPlay
#
# Certification FILE:
#
Certificate $(TWLSDK_ROOT)/include/twl/specfiles/default_sgn.sbin
#
# Digest parameters:
#
DigestParam 1024 32
#
# WRAM mapping: [MAP_BB_HYB/MAP_BB_LTD/MAP_TS_HYB/MAP_TS_LTD]
# don't have to edit
#
WramMapping $(MAKEROM_WRAM_MAPPING)
#
# Codec mode:
# don't have to edit
#
CodecMode $(MAKEROM_CODEC_MODE)
TitleID_Lo $(TITLEID_LO)
TitleID_Hi 0x00010001
# PrivateSaveDataSize 16K
# PublicSaveDataSize 16K
###
#### END
}
RomSpec
{
Offset 0x00000000
Segment ALL
HostRoot ../../data
Root /data
File NTR_IPL_font_m.NFTR
HostRoot ../../../../keys/HWInfo
Root /key
File privKeyHWInfo.der
}

View File

@ -0,0 +1,368 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: DS_Chat.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 <twl.h>
#include <sysmenu.h>
#include "misc.h"
#include "HWInfoWriter.h"
// define data------------------------------------------
#define WRITER_ELEMENT_NUM 7
#define MSG_X 3
#define MSG_Y 19
// extern data------------------------------------------
const TWLHWNormalInfo *THW_GetDefaultNormalInfo( void );
const TWLHWSecureInfo *THW_GetDefaultSecureInfo( void );
const TWLHWNormalInfo *THW_GetNormalInfo( void );
const TWLHWSecureInfo *THW_GetSecureInfo( void );
// function's prototype declaration---------------------
static void ReadPrivateKey( void );
static void ReadHWInfoFile( void );
static void WriteHWInfoFile( u8 region );
static BOOL WriteHWNormalInfoFile( void );
static BOOL WriteHWSecureInfoFile( u8 region );
static void DeleteHWInfoFile( void );
static void VerifyHWInfo( void );
static BOOL VerifyData( const u8 *pTgt, const u8 *pOrg, u32 len );
static void DispMessage( int x, int y, u16 color, const u16 *pMsg );
// global variable -------------------------------------
RTCDrawProperty g_rtcDraw = {
TRUE, RTC_DATE_TOP_X, RTC_DATE_TOP_Y, RTC_TIME_TOP_X, RTC_TIME_TOP_Y
};
// static variable -------------------------------------
static u16 s_csr;
static u8 *s_pPrivKeyBuffer = NULL;
// const data -----------------------------------------
static const u16 *const s_pStrWriter[ WRITER_ELEMENT_NUM ] = {
(const u16 *)L"Write HW Info REGION=JAPAN",
(const u16 *)L"Write HW Info REGION=AMERICA",
(const u16 *)L"Write HW Info REGION=EUROPE",
(const u16 *)L"Write HW Info REGION=AUSTRALIA",
(const u16 *)L"Write HW Info REGION=CHINA",
(const u16 *)L"Write HW Info REGION=KOREA",
(const u16 *)L"Delete HW Info",
};
static MenuPos s_writerPos[] = {
{ TRUE, 3 * 8, 4 * 8 },
{ TRUE, 3 * 8, 6 * 8 },
{ TRUE, 3 * 8, 8 * 8 },
{ TRUE, 3 * 8, 10 * 8 },
{ TRUE, 3 * 8, 12 * 8 },
{ TRUE, 3 * 8, 14 * 8 },
{ TRUE, 3 * 8, 16 * 8 },
};
static const MenuParam s_writerParam = {
WRITER_ELEMENT_NUM,
TXT_COLOR_BLACK,
TXT_COLOR_GREEN,
TXT_COLOR_RED,
&s_writerPos[ 0 ],
(const u16 **)&s_pStrWriter,
};
//======================================================
// HW情報ライター
//======================================================
// HW情報ライターの初期化
void HWInfoWriterInit( void )
{
GX_DispOff();
GXS_DispOff();
InitBG();
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
PutStringUTF16( 1 * 8, 0 * 8, TXT_COLOR_BLUE, (const u16 *)L"HW Info Writer");
GetAndDrawRTCData( &g_rtcDraw, TRUE );
ACSign_SetAllocFunc( Alloc, Free );
ReadPrivateKey();
ReadHWInfoFile();
// VerifyHWInfo();
OS_TPrintf( "region = %d\n", THW_GetRegion() );
s_csr = 0;
DrawMenu( s_csr, &s_writerParam );
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 );
GX_DispOn();
GXS_DispOn();
}
// HW情報ライターのメインループ
void HWInfoWriterMain( void )
{
// カーソル移動
if( pad.trg & PAD_KEY_DOWN ){
if( ++s_csr == WRITER_ELEMENT_NUM ) {
s_csr = 0;
}
}
if( pad.trg & PAD_KEY_UP ){
if( --s_csr & 0x8000 ) {
s_csr = WRITER_ELEMENT_NUM - 1;
}
}
DrawMenu( s_csr, &s_writerParam );
// 実行
if( pad.trg == PAD_BUTTON_A ) {
if( s_csr == WRITER_ELEMENT_NUM - 1 ) {
OS_TPrintf( "Delete start.\n" );
(void)DeleteHWInfoFile();
}else {
OS_TPrintf( "Write start.\n" );
WriteHWInfoFile( (u8)s_csr );
}
}
GetAndDrawRTCData( &g_rtcDraw, FALSE );
}
// 秘密鍵のリード
static void ReadPrivateKey( void )
{
BOOL result = FALSE;
u32 keyLength;
FSFile file;
FS_InitFile( &file );
if( !FS_OpenFileEx( &file, "rom:key/privKeyHWInfo.der", FS_FILEMODE_R ) ) {
OS_TPrintf( "PrivateKey read failed.\n" );
}else {
keyLength = FS_GetFileLength( &file );
if( keyLength > 0 ) {
s_pPrivKeyBuffer = Alloc( keyLength );
if( FS_ReadFile( &file, s_pPrivKeyBuffer, (s32)keyLength ) == keyLength ) {
OS_TPrintf( "PrivateKey read succeeded.\n" );
result = TRUE;
}else {
OS_TPrintf( "PrivateKey read failed.\n" );
}
}
FS_CloseFile( &file );
}
if( !result && s_pPrivKeyBuffer ) {
Free( s_pPrivKeyBuffer );
s_pPrivKeyBuffer = NULL;
}
}
// HW情報全体のリード
static void ReadHWInfoFile( void )
{
TSFReadResult retval;
retval = THW_ReadNormalInfo();
if( retval == TSF_READ_RESULT_SUCCEEDED ) {
OS_TPrintf( "HW Normal Info Read succeeded.\n" );
}else {
OS_TPrintf( "HW Normal Info Read failed.\n" );
}
retval = THW_ReadSecureInfo();
if( retval == TSF_READ_RESULT_SUCCEEDED ) {
OS_TPrintf( "HW Secure Info Read succeeded.\n" );
}else {
OS_TPrintf( "HW Secure Info Read failed.\n" );
}
}
// HW情報全体のライト
static void WriteHWInfoFile( u8 region )
{
static const u16 *pMsgNormalWriting = (const u16 *)L"Writing Normal File...";
static const u16 *pMsgSecureWriting = (const u16 *)L"Writing Secure File...";
static const u16 *pMsgSucceeded = (const u16 *)L"Succeeded!";
static const u16 *pMsgFailed = (const u16 *)L"Failed!";
// ノーマルファイルのライト
(void)PutStringUTF16( MSG_X * 8, MSG_Y * 8, TXT_COLOR_BLACK, pMsgNormalWriting );
if( WriteHWNormalInfoFile() ) {
(void)PutStringUTF16( ( MSG_X + 18 ) * 8, MSG_Y * 8, TXT_COLOR_BLUE, pMsgSucceeded );
}else {
(void)PutStringUTF16( ( MSG_X + 18 ) * 8, MSG_Y * 8, TXT_COLOR_RED, pMsgFailed );
}
// セキュアファイルのライト
(void)PutStringUTF16( MSG_X * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_BLACK, pMsgSecureWriting );
if( WriteHWSecureInfoFile( region ) ) {
(void)PutStringUTF16( ( MSG_X + 18 ) * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_BLUE, pMsgSucceeded );
}else {
(void)PutStringUTF16( ( MSG_X + 18 ) * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_RED, pMsgFailed );
}
// メッセージを一定時間表示して消去
DispMessage( 0, 0, TXT_COLOR_NULL, NULL );
NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_WHITE,
MSG_X * 8 , MSG_Y * 8, ( 32 - MSG_X ) * 8, ( MSG_Y + 4 ) * 8 );
}
// HWーマルInfoファイルのライト
static BOOL WriteHWNormalInfoFile( void )
{
BOOL isWrite = TRUE;
TSFReadResult result;
result = THW_ReadNormalInfo();
if( result != TSF_READ_RESULT_SUCCEEDED ) {
if( !THW_RecoveryNormalInfo( result ) ) {
OS_TPrintf( "HW Normal Info Recovery failed.\n" );
isWrite = FALSE;
}
}
if( isWrite &&
!THW_WriteNormalInfo() ) {
OS_TPrintf( "HW Normal Info Write failed.\n" );
}
return isWrite;
}
// HWセキュアInfoファイルのライト
static BOOL WriteHWSecureInfoFile( u8 region )
{
BOOL isWrite = TRUE;
TSFReadResult result;
// 秘密鍵が読み込めていないなら、エラー
if( s_pPrivKeyBuffer == NULL ) {
OS_TPrintf( "Private key not read.\n" );
return FALSE;
}
// ファイルのリード
result = THW_ReadSecureInfo();
// リードに失敗したらリカバリ
if( result != TSF_READ_RESULT_SUCCEEDED ) {
if( !THW_RecoverySecureInfo( result ) ) {
OS_TPrintf( "HW Secure Info Recovery failed.\n" );
isWrite = FALSE;
}
}
// リージョンのセット
THW_SetRegion( region );
if( isWrite &&
!THW_WriteSecureInfo( s_pPrivKeyBuffer ) ) {
isWrite = FALSE;
OS_TPrintf( "HW Secure Info Write failed.\n" );
}
return isWrite;
}
// HWInfoファイルの削除
static void DeleteHWInfoFile( void )
{
static const u16 *pMsgNormalDeleting = (const u16 *)L"Deleting Normal File...";
static const u16 *pMsgSecureDeleting = (const u16 *)L"Deteting Secure File...";
static const u16 *pMsgSucceeded = (const u16 *)L"Succeeded!";
static const u16 *pMsgFailed = (const u16 *)L"Failed!";
// ノーマルファイル
(void)PutStringUTF16( MSG_X * 8, MSG_Y * 8, TXT_COLOR_BLACK, pMsgNormalDeleting );
if( FS_DeleteFile( (char *)TWL_HWINFO_NORMAL_PATH ) ) {
OS_TPrintf( "%s delete succeeded.\n", (char *)TWL_HWINFO_NORMAL_PATH );
(void)PutStringUTF16( ( MSG_X + 19 ) * 8, MSG_Y * 8, TXT_COLOR_BLUE, pMsgSucceeded );
}else {
OS_TPrintf( "%s delete failed.\n", (char *)TWL_HWINFO_NORMAL_PATH );
(void)PutStringUTF16( ( MSG_X + 19 ) * 8, MSG_Y * 8, TXT_COLOR_RED, pMsgFailed );
}
// セキュアファイル
(void)PutStringUTF16( MSG_X * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_BLACK, pMsgSecureDeleting );
if( FS_DeleteFile( (char *)TWL_HWINFO_SECURE_PATH ) ) {
OS_TPrintf( "%s delete succeeded.\n", (char *)TWL_HWINFO_SECURE_PATH );
(void)PutStringUTF16( ( MSG_X + 19 ) * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_BLUE, pMsgSucceeded );
}else {
OS_TPrintf( "%s delete failed.\n", (char *)TWL_HWINFO_SECURE_PATH );
(void)PutStringUTF16( ( MSG_X + 19 ) * 8, ( MSG_Y + 2 ) * 8, TXT_COLOR_RED, pMsgFailed );
}
DispMessage( 0, 0, TXT_COLOR_NULL, NULL );
NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_WHITE,
MSG_X * 8 , MSG_Y * 8, ( 32 - MSG_X ) * 8, ( MSG_Y + 4 ) * 8 );
}
// HWInfoファイルのベリファイ
static void VerifyHWInfo( void )
{
if( VerifyData( (const u8 *)THW_GetNormalInfo(), (const u8 *)THW_GetDefaultNormalInfo(), sizeof(TWLHWNormalInfo) ) ) {
OS_TPrintf( "HW normal Info verify succeeded.\n" );
}else {
OS_TPrintf( "HW normal Info verify failed.\n" );
}
if( VerifyData( (const u8 *)THW_GetSecureInfo(), (const u8 *)THW_GetDefaultSecureInfo(), sizeof(TWLHWSecureInfo) ) ) {
OS_TPrintf( "HW secure Info verify succeeded.\n" );
}else {
OS_TPrintf( "HW secure Info verify failed.\n" );
}
}
// メモリ上のデータベリファイ
static BOOL VerifyData( const u8 *pTgt, const u8 *pOrg, u32 len )
{
while( len-- ) {
if( *pTgt++ != *pOrg++ ) {
return FALSE;
}
}
return TRUE;
}
// メッセージ表示
static void DispMessage( int x, int y, u16 color, const u16 *pMsg )
{
OSTick start = OS_GetTick();
// メッセージ表示
if( pMsg ) {
(void)PutStringUTF16( x, y, color, pMsg );
}
// ウェイト
while( OS_TicksToSeconds( OS_GetTick() - start ) < 2 ) {
OS_SpinWait( 0x1000 );
}
// メッセージ消去
if( pMsg ) {
(void)PutStringUTF16( x, y, TXT_COLOR_WHITE, pMsg );
}
}

View File

@ -0,0 +1,37 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: DS_Chat.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:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#ifndef __DS_CHAT_H__
#define __DS_CHAT_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <twl.h>
// define data----------------------------------------------------------
void HWInfoWriterInit( void );
void HWInfoWriterMain( void );
#ifdef __cplusplus
}
#endif
#endif // __DS_CHAT_H__

View File

@ -0,0 +1,85 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: main.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 <twl.h>
#include "misc.h"
#include "HWInfoWriter.h"
// extern data-----------------------------------------------------------------
extern void SYSMi_SetLauncherMountInfo( void );
// define data-----------------------------------------------------------------
// function's prototype-------------------------------------------------------
static void INTR_VBlank( void );
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
// const data------------------------------------------------------------------
// ============================================================================
// function's description
// ============================================================================
void TwlMain(void)
{
SYSMi_SetLauncherMountInfo();
// 初期化----------------------------------
OS_Init();
OS_InitTick();
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
GX_Init();
GX_SetPower(GX_POWER_ALL); // 各ロジック パワーON
// 割り込み許可----------------------------
(void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank);
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
(void)GX_VBlankIntr(TRUE);
// デバイス初期化-------------------------------
(void)RTC_Init();
// システムの初期化------------------
InitAllocator();
// メインループ----------------------------
HWInfoWriterInit();
while(1){
OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち
ReadKeyPad(); // キー入力の取得
HWInfoWriterMain();
}
}
// ============================================================================
// 割り込み処理
// ============================================================================
// Vブランク割り込み
static void INTR_VBlank(void)
{
OS_SetIrqCheckFlag(OS_IE_V_BLANK); // Vブランク割込チェックのセット
}

View File

@ -0,0 +1,30 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# 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$
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = banner ARM9
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,49 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# 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$
#----------------------------------------------------------------------------
include $(TWLIPL_ROOT)/build/buildtools/commondefs
ICON_DIR = ./icon
BANNER_ICON = $(ICON_DIR)/gameIcon.bmp
BANNER_SPEC = banner_v3.bsf
TARGETS = banner.bnr
INSTALL_DIR = ./
INSTALL_TARGETS = $(TARGETS)
BANNER_ICON_NAME = $(basename $(BANNER_ICON))
LDIRT_CLEAN = $(TARGETS) \
$(BANNER_ICON_NAME).nbfs \
$(BANNER_ICON_NAME).nbfc \
$(BANNER_ICON_NAME).nbfp \
$(TARGETS:.bnr=.srl)
include $(TWLIPL_ROOT)/build/buildtools/modulerules
#----------------------------------------------------------------------------
# build
#----------------------------------------------------------------------------
do-build: $(TARGETS)
$(TARGETS): $(BANNER_SPEC) $(BANNER_ICON)
$(NTEXCONV) -no -bg -bgb -bgnc $(BANNER_ICON) >/dev/null && \
$(MAKEBANNER) -d -N $(BANNER_ICON_NAME) $(BANNER_SPEC) $(TARGETS)
#

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

View File

@ -18,6 +18,7 @@
SUBDIRS = \
../../../libraries_sysmenu/sysmenu \
../../../libraries_sysmenu/settings \
../../../libraries_sysmenu/boot \
../../../libraries_sysmenu/hotsw \
../../../libraries_sysmenu/reset_param \

View File

@ -4,21 +4,21 @@ SystemMenu_RED
・カードアプリ取得 △ TWLバナーへの対応はまだ
・TWLカード起動 ○
・カード活線挿抜処理 ×
・NTRカードNTRモード起動 ×
・NTRカードNTRモード起動 × (作業中)
・NANDアプリリスト取得 ○
・NANDアプリ起動 ○
・アプリブート時の再配置処理 ×
・ISデバッガ対応 ×
・ファームウェアとして正規動作 ×
・アプリブート時の再配置処理 × (作業中)
・ISデバッガ対応 × (次タスク)
・ファームウェアとして正規動作 × (次タスク)
・アプリ起動時のWRAM-MAP設定 ○
・アプリ起動時のSCFGレジスタロック ×
・アプリ起動時のSCFGレジスタロック
  ・アプリ起動時のSDカードアクセス可否 △ (とりあえず解放にしておき、セキュリティ面での検討を行う。)
・署名・暗号処理 ×
・鍵管理 ×
・メモリマップFIX ○
・NTRコンポーネントパッチ ×
・本体設定
・設定データフォーマットFIX ×
・設定データフォーマットFIX × (作業中)
・言語選択 ○
・TP補正 ○
・日付・時刻設定 ○

View File

@ -35,6 +35,14 @@ int ACSign_Decrypto(
void* key_ptr // キーへのポインタ
);
//
BOOL ACSign_Encrypto(
void *sign, // 署名出力バッファへのポインタ
const void *key, // DERフォーマット秘密鍵へのポインタ
const void *data, // 署名対象データへのポインタ
int length // 署名対象データ長
);
//
int ACSign_Digest(
void* buffer, // 出力領域
@ -52,6 +60,8 @@ int ACSign_Compare(
void* digest // ACSign_Digestの出力
);
void ACSign_SetAllocFunc( void *(*pAlloc)( u32 ), void (*pFree)( void * ) );
#ifdef __cplusplus
}
#endif

View File

@ -18,6 +18,8 @@
#ifndef SYSM_MACHINE_SETTINGS_H_
#define SYSM_MACHINE_SETTINGS_H_
#include <sysmenu/settings/common/TWLStoreFile.h>
#include <sysmenu/settings/common/TWLHWInfo.h>
#include <sysmenu/settings/common/NTRSettings.h>
#include <sysmenu/settings/common/TWLSettings.h>

View File

@ -0,0 +1,198 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: HWInfo.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:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#ifndef TWL_HW_INFO_H_
#define TWL_HW_INFO_H_
#define HW_SECURE_INFO_WRITE_ENABLE_ // HWセキュア情報のライト許可コンパイルスイッチ
#include <twl.h>
#include <sysmenu/settings/common/TWLStoreFile.h>
#ifdef HW_SECURE_INFO_WRITE_ENABLE_
#include <sysmenu/acsign.h>
#endif // HW_SECURE_INFO_WRITE_ENABLE_
#ifdef __cplusplus
extern "C" {
#endif
// define data ------------------------------------
#define TWL_HWINFO_FILE_LENGTH ( 16 * 1024 )
#define TWL_HWINFO_NORMAL_PATH "nand:/sys/HWINFO_N.dat"
#define TWL_HWINFO_SECURE_PATH "nand:/sys/HWINFO_S.dat"
#define TWL_HWINFO_NORMAL_VERSION 1 // HW情報フォーマットバージョン(開始No.:1)
#define TWL_HWINFO_SECURE_VERSION 1 // HW情報フォーマットバージョン(開始No.:1)
#define TWL_HWINFO_SERIALNO_LEN_AMERICA 11 // 本体シリアルNo.長Max北米向けは11桁
#define TWL_HWINFO_SERIALNO_LEN_OTHERS 12 // 本体シリアルNo.長Max
#define TWL_HWINFO_SERIALNO_LEN_MAX 16 // 本体シリアルNo.長Max
#define TWL_HWINFO_CAMERA_LEN 1024 // カメラ情報 [TODO]サイズ未定
// リージョンコード(販社別になる見込み)
typedef enum TWLRegionCode {
TWL_REGION_JAPAN = 0, // NCL
TWL_REGION_AMERICA = 1, // NOA
TWL_REGION_EUROPE = 2, // NOE
TWL_REGION_AUSTRALIA = 3, // NAL
TWL_REGION_CHINA = 4, // IQue
TWL_REGION_KOREA = 5, // NOK
TWL_REGION_MAX
}TWLRegion;
// 本体シリアルNo.
typedef struct TWLSerialNo {
u8 length; // シリアルNo.長
u8 no[ TWL_HWINFO_SERIALNO_LEN_MAX ]; // シリアルNo.ASCII文字列
}TWLSerialNo;
// TWL_HWセキュア情報設定データ署名で改ざん保護する必要があるもの
// ※基本、過去ver互換を考慮して、追加しかしない方針で。
typedef struct TWLHWSecureInfo{
u8 region; // リージョン
TWLSerialNo serialNo; // 本体シリアルNo.
}TWLHWSecureInfo; // 18bytes
// TWL_HWーマル情報設定データ署名で改ざん保護する必要がないもの
// ※基本、過去ver互換を考慮して、追加しかしない方針で。
typedef struct TWLHWNormalInfo{
u8 rtcAdjust; // RTC調整値
u8 camera[ TWL_HWINFO_CAMERA_LEN ]; // カメラ情報
}TWLHWNormalInfo; // 1025byte
#ifdef SDK_ARM9
//=========================================================
// HW情報リードライト関数
//=========================================================
// Normal情報
// 内部変数へのリードfs
extern TSFReadResult THW_ReadNormalInfo( void );
// 内部変数の値のライト
extern BOOL THW_WriteNormalInfo( void );
// 直接値を指定してのライト(開発用)
extern BOOL THW_WriteNormalInfoDirect( const TWLHWNormalInfo *pSrcInfo );
// ファイルリカバリー
extern BOOL THW_RecoveryNormalInfo( TSFReadResult err );
// 上記Read,Write関数で使用されるデフォルト値のセット開発用
extern void TWH_SetNormalDefaultValue( const TWLHWNormalInfo *pSrcInfo );
// Secure情報
// リード
extern TSFReadResult THW_ReadSecureInfo( void );
// 下記コンパイルスイッチ定義時のみ有効
#ifdef HW_SECURE_INFO_WRITE_ENABLE_
// ライト
extern BOOL THW_WriteSecureInfo( const u8 *pPrivKeyDER );
// 直接値を指定してのライト(開発用)
extern BOOL THW_WriteSecureInfoDirect( const TWLHWSecureInfo *pSrcInfo, const u8 *pPrivKeyDER );
// ファイルリカバリー
extern BOOL THW_RecoverySecureInfo( TSFReadResult err );
#endif // HW_SECURE_INFO_WRITE_ENABLE_
// 上記Read,Write関数で使用されるデフォルト値のセット開発用
extern void TWH_SetSecureDefaultValue( const TWLHWSecureInfo *pSrcInfo );
//=========================================================
// 下記アクセス関数が使用するstatic変数
//=========================================================
extern TWLHWNormalInfo s_hwInfoN;
extern TWLHWSecureInfo s_hwInfoS;
#define GetHWN() ( &s_hwInfoN )
#define GetHWS() ( &s_hwInfoS )
//=========================================================
// データ取得THW_ReadNormalInfo, THW_ReadSecureInfoで内部ワークに読み出した情報の取得
//=========================================================
// RTCオフセット値の取得
static inline u8 THW_GetRTCAdjust( void )
{
return GetHWN()->rtcAdjust;
}
// カメラ情報の取得
static inline void THW_GetCameraInfo( u8 *pDst )
{
MI_CpuCopy8( GetHWN()->camera, pDst, TWL_HWINFO_CAMERA_LEN );
}
// リージョンの取得。
static inline u8 THW_GetRegion( void )
{
return (u8)GetHWS()->region;
}
// 本体シリアルNo.の取得
static inline void THW_GetSerialNo( TWLSerialNo *pDst )
{
MI_CpuCopy8( &GetHWS()->serialNo, pDst, sizeof(TWLSerialNo) );
}
//=========================================================
// データセットTSD_ReadSettingsで内部ワークに読み出した情報への値セット
//=========================================================
// RTCオフセット値のセット
static inline void THW_SetRTCAdjust( u8 adjust )
{
GetHWN()->rtcAdjust = adjust;
}
// カメラ情報のセット
static inline void THW_SetCameraInfo( u8 *pCamera )
{
MI_CpuCopy8( pCamera, GetHWN()->camera, TWL_HWINFO_CAMERA_LEN );
}
// リージョンのセット。
static inline void THW_SetRegion( u8 region )
{
GetHWS()->region = region;
}
// 本体シリアルNo.のセット
static inline void THW_SetSerialNo( TWLSerialNo *pSrc )
{
MI_CpuCopy8( pSrc, &GetHWS()->serialNo, sizeof(TWLSerialNo) );
}
#endif // SDK_ARM9
#ifdef __cplusplus
}
#endif
#endif // TWL_HWINFO_H_

View File

@ -77,31 +77,6 @@ const u8 LangCodeMapFromTWLtoNTR[][ 2 ] = {
};
#endif
#define TWL_LANG_BITMAP_JAPAN ( ( 0x0001 << TWL_LANG_JAPANESE ) ) // JPN版での対応言語ビットマップ
#define TWL_LANG_BITMAP_AMERICA ( ( 0x0001 << TWL_LANG_ENGLISH ) | \
( 0x0001 << TWL_LANG_FRENCH ) | \
( 0x0001 << TWL_LANG_SPANISH ) ) // AME版での対応言語ビットマップ
#define TWL_LANG_BITMAP_EUROPE ( ( 0x0001 << TWL_LANG_ENGLISH ) | \
( 0x0001 << TWL_LANG_FRENCH ) | \
( 0x0001 << TWL_LANG_GERMAN ) | \
( 0x0001 << TWL_LANG_ITALIAN ) | \
( 0x0001 << TWL_LANG_SPANISH ) ) // EUR版での対応言語ビットマップ
#define TWL_LANG_BITMAP_AUSTRALIA ( ( 0x0001 << TWL_LANG_ENGLISH ) ) // AUS版での対応言語ビットマップ
#define TWL_LANG_BITMAP_CHINA ( ( 0x0001 << TWL_LANG_SIMP_CHINESE ) ) // CHI版での対応言語ビットマップ
#define TWL_LANG_BITMAP_KOREA ( ( 0x0001 << TWL_LANG_KOREAN ) ) // KOR版での対応言語ビットマップ
// リージョンコード(販社別になる見込み)
typedef enum TWLRegionCode {
TWL_REGION_JAPAN = 0, // NCL
TWL_REGION_AMERICA = 1, // NOA
TWL_REGION_EUROPE = 2, // NOE
TWL_REGION_AUSTRALIA = 3, // NAL
TWL_REGION_CHINA = 4, // IQue
TWL_REGION_KOREA = 5, // NOK
TWL_REGION_MAX
}TWLRegion;
// 日付
#define TWLDate NTRDate
@ -111,21 +86,21 @@ typedef enum TWLRegionCode {
// TPキャリブレーションNTRとの違いは、予約領域あり
typedef struct TWLTPCalibData {
NTRTPCalibData data;
NTRTPCalibData data; // TPキャリブレーションデータ
u8 rsv[ 8 ];
}TWLTPCalibData;
// ニックネームNTRとの違いは、文字列に終端あり
typedef struct TWLNickname{
u16 buffer[ TWL_NICKNAME_LENGTH + 1 ]; // ニックネームUnicode(UTF16)で最大10文字、終端コードあり
u8 length; // 文字数
u8 length; // 文字数
u8 rsv;
}TWLNickname; // 24byte
// コメントNTRとの違いは、文字列に終端あり
typedef struct TWLComment{
u16 buffer[ TWL_COMMENT_LENGTH + 1 ]; //コメントUnicode(UTF16)で最大26文字、終端コードあり
u8 length; // 文字数
u8 length; // 文字数
u8 rsv;
}TWLComment; // 54byte
@ -179,36 +154,34 @@ typedef struct TWLParentalControl {
// TWL設定データヘッダ
typedef struct TWLSettingsHeader{
u8 version;
u8 saveCount;
u16 dataLength;
u8 digest[ SVC_SHA1_DIGEST_SIZE ]; // SHA1ダイジェスト  CRC16で十分かもなあ。。。
u8 version; // データver.
u8 saveCount; // セーブカウント数
u16 dataLength; // データ長
}TWLSettingsHeader;
// TWL設定データ基本、過去ver互換を考慮して、追加しかしない方針で。
typedef struct TWLSettingsData{
struct flags {
u32 initialSequence : 1;
u32 isSetCountry : 1;
u32 isSetLanguage : 1;
u32 isSetDateTime : 1;
u32 isSetNickname : 1;
u32 isSetUserColor : 1;
u32 isSetBirthday : 1;
u32 isSetTP : 1;
u32 isSetParentalControl : 1;
// u32 isSetBrowserRestriction : 1; // Wiiで存在。フルブラウザを制限するかどうか。TWLでは検討中。
u32 isAgreeEURA : 1;
u32 initialSequence : 1; // 初回起動シーケンス中?
u32 isSetCountry : 1; // 国コード設定済み?
u32 isSetLanguage : 1; // 言語設定済み?
u32 isSetDateTime : 1; // 日付・時刻設定済み?
u32 isSetNickname : 1; // ニックネーム設定済み?
u32 isSetUserColor : 1; // ユーザーカラー設定済み?
u32 isSetBirthday : 1; // 誕生日設定済み?
u32 isSetTP : 1; // TP設定済み
u32 isSetParentalControl : 1; // パレンタルコントロール設定済み?
// u32 isSetBrowserRestriction : 1; // Wiiで存在。フルブラウザを制限するかどうか。TWLでは検討中。
u32 isAgreeEURA : 1; // EURA同意済み
// WiFi設定は別データなので、ここに設定済みフラグは用意しない。
u32 isGBUseTopLCD : 1;
u32 isGBUseTopLCD : 1; // 画面のGBゲーム時に上画面を使う
u32 isAvailableWireless : 1; // 無線モジュールのRFユニットの有効化無効化
u32 isAvailableBatteryExtension : 1; // バッテリエクステンションモードの有効化/無効化
u32 rsv : 19;
}flags;
u16 valid_language_bitmap; // 対応言語ビットマップ(※ここじゃなく、"/sys/HWINFO.dat"内の方が良さそう)
u8 region;
TWLCountryCode country; // 国コード
u8 region; // リージョン(※ここじゃなく、"/sys/HWINFO.dat"内の方が良さそう)
u8 language; // 言語(NTRとの違いは、データサイズ8bit)
u8 backLightBrightness; // バックライト輝度(NTRとの違いは、データサイズ8bit)
u8 rtcLastSetYear; // RTCの前回設定年
@ -223,6 +196,7 @@ typedef struct TWLSettingsData{
// TWL設定データ保存フォーマット
typedef struct TSDStore {
u8 digest[ SVC_SHA1_DIGEST_SIZE ]; // SHA1ダイジェスト
TWLSettingsHeader header;
TWLSettingsData tsd;
}TSDStore;
@ -307,12 +281,6 @@ static inline TWLLangCode TSD_GetLanguage( void )
return (TWLLangCode)GetTSD()->language;
}
// 対応言語ビットマップの取得
static inline u16 TSD_GetLanguageBitmap( void )
{
return GetTSD()->valid_language_bitmap;
}
// RTCオフセット値の取得
static inline s64 TSD_GetRTCOffset( void )
{
@ -457,12 +425,6 @@ static inline void TSD_SetLanguage( TWLLangCode language )
GetTSD()->language = language;
}
// 対応言語ビットマップのセット
static inline void TSD_SetLanguageBitmap( u16 valid_language_bitmap )
{
GetTSD()->valid_language_bitmap = valid_language_bitmap;
}
// RTCオフセット値のセット
static inline void TSD_SetRTCOffset( s64 rtcOffset )
{

View File

@ -0,0 +1,94 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: TWLFileStore.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:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#ifndef TWL_STORE_FILE_H_
#define TWL_STORE_FILE_H_
#if defined(SDK_CW)
#include <twl.h>
#include <twl/os/common/format_rom.h>
#ifdef __cplusplus
extern "C" {
#endif
// define data ------------------------------------
#define TSF_VERSION_TERMINATOR 0xff // version終端
#define SAVE_COUNT_MAX 0x80 // saveCountの最大値
#define SAVE_COUNT_MASK 0x7f // saveCountの値の範囲をマスクする。(0x00-0x7f
#define DISABLE_SAVE_COUNT 0xff // saveCount無効
// TSFリード結果
typedef enum TSFReadResult {
TSF_READ_RESULT_SUCCEEDED = 0,
TSF_READ_RESULT_ERROR_FILE_EXIST = 1,
TSF_READ_RESULT_ERROR_FILE_LENGTH = 2,
TSF_READ_RESULT_ERROR_DATA = 3
}TSFReadResult;
// TSFアクセス用パラメータ
typedef struct TSFParam { // TSF ( TWL Store File )
u32 dataLength; // 保存するデータ長
u32 fileLength; // 保存するファイル長
const u8 *conpatibleVerList; // 過去ver.の互換ver.リスト。TSF_VERSION_TERMINATORで終端。
const void *pDefaultValue; // 保存するデータのデフォルト値
BOOL (*pCheckDigestFunc)( void *pTgt, u32 len, u8 *pDigest ); // ダイジェストチェック関数へのポインタ
BOOL (*pCheckValueFunc)( void *pTgt ); // 値チェック関数へのポインタ
}TSFParam;
// TSFヘッダ
typedef struct TSFHeader{
union digest {
u8 sha1[ SVC_SHA1_DIGEST_SIZE ]; // SHA-1ダイジェスト
u8 rsa[ RSA_KEY_LENGTH ]; // RSA署名
u8 dst[ RSA_KEY_LENGTH ]; // 転送用の最大サイズ要素
}digest;
u8 version; // データver.
u8 saveCount; // セーブカウント(ミラーリングしないファイルは使用しない)
u8 rsv[2]; // 予約
u32 bodyLength; // データ長
}TSFHeader; // 134bytes
// ※「TSFHeader+データ本体」の形でファイルに保存されます。
#ifdef SDK_ARM9
//=========================================================
// NANDファイルへのリードライト関数
//=========================================================
// TSFフォーマットのファイルのリード
extern TSFReadResult TSF_ReadFile ( char *pPath, void *pDstBody, const TSFParam *pParam, u8 *pDstSaveCount );
// TSFフォーマットのファイルのライトsaveCountにDISABLE_SAVE_COUNTを与えた場合は、saveCountを"0"固定にします。)
extern BOOL TSF_WriteFile( char *pPath, TSFHeader *pHeader, const void *pSrcBody, u8 saveCount );
// TSFフォーマットのファイルのリカバリ
extern BOOL TSF_RecoveryFile( TSFReadResult err, char *pPath, u32 fileLength );
#endif // SDK_ARM9
#ifdef __cplusplus
}
#endif
#endif // SDK_CW
#endif // TWL_STORE_FILE_H_

View File

@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlcyzdiJ14or13KZTuxvMyZCCVuVLZndVNtd1zhhqX0BQQgEb0
LM75BQbkwlhwQgdecdSc6xZwaxSWCoRpKB2CzT6UgpPIC0XTiZwFsriu/o1T3E8d
g4r+8QDNqcD6PxcxhBamOKtcO4GgZzUkU2bttyVzg9YI9KZLPJlKyhsitQIDAQAB
AoGBAIIVGRODl1tEUEwVi/UPX+NqtrqLtbfgboS/HYyYM81rz2RHhXJ7UOAHBJB+
yirilFDsEhDgivkzDBnAXq9LaeaiXHZQwuUTszXyRSOdnaYzWoJAdPd3GH96a/xs
0VLWUTrzs1CH/5k8sxT4erk5l07ouBx5r/CPyJO/X5pIy8XhAkEA96DaxiFfdvEj
xXo1wkBmZbOsg+/wFMZhn+Bhm5Mxhblcrba60DmMyWhdJy6jb/gysAWY8OHLR21t
wMxAFccbvQJBAO00/fW8fA92BCb4Jh1s9uiXQAPpd+LdnxhXrm9+5y//wLLAUtii
awVmIycAuYlJSVzGSeQjAIP6MIefMp9lVlkCQHtDsAN2c13y1Vqk5gPHKPGxScv3
cSv2QHxkJlJaKAmn5rF2R3IFY8aSU+SAO80t4JVsg+BMlXL9zudtBO2SSoUCQANe
pFjwU4bYs1hmYAw89wj41RT5JRXY9iCfZj/5OomJBZDEgKjJLeIGwGsWbIxRuTQT
MQuHn8NAM55JmauAAgkCQQC4bqOlgAPVGaoAK98Kf40EKufyY2XaMSiGmqpG3bnw
o13x8SWrOh6Stu5jgFnyGcItJone3lLWo2xN1b6SzN84
-----END RSA PRIVATE KEY-----

View File

@ -0,0 +1,6 @@
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlcyzdiJ14or13KZTuxvMyZCCV
uVLZndVNtd1zhhqX0BQQgEb0LM75BQbkwlhwQgdecdSc6xZwaxSWCoRpKB2CzT6U
gpPIC0XTiZwFsriu/o1T3E8dg4r+8QDNqcD6PxcxhBamOKtcO4GgZzUkU2bttyVz
g9YI9KZLPJlKyhsitQIDAQAB
-----END PUBLIC KEY-----

105
keys/HWInfo/makeHWInfo.pl Executable file
View File

@ -0,0 +1,105 @@
#!/bin/perl
use strict;
if( @ARGV != 8 ) {
die "usage: makeHWInfo.pl -r <RegionName> -s <SerialNo> -k <RSA PrivKey> -o <outName>\n";
}
#引数チェック
my $cmd = &analyze_argv;
if( !exists($cmd->{"-r"}) or
!exists($cmd->{"-s"}) or
!exists($cmd->{"-k"}) or
!exists($cmd->{"-o"}) ) {
die "parameter error.\n";
}
#リージョン
my @regionNameList = qw/ JAPAN AMERICA EUROPE AUSTRALIA CHINA KOREA /;
my $i = 0;
my $region = 0xff;
foreach ( @regionNameList ) {
if( $cmd->{"-r"} eq $_ ) {
$region = $i;
last;
}
$i++;
}
if( $region == 0xff ) {
die "region error.\n", $cmd->{"-r"};
}
#シリアルNo.
my $serialNo = $cmd->{"-s"};
if( !( 11 == length($serialNo) or ( 12 == length($serialNo) ) ) ) {
die "serialNo length error. needs length \"11\" or \"12\"\n";
}
#Bodyファイル
open(OUT, ">body.bin");
binmode(OUT);
print OUT pack( "C", $region );
print OUT pack( "A16", $serialNo );
close(OUT);
#Headerファイル
my $version = 1;
my $length = 17;
open(OUT, ">header.bin");
binmode(OUT);
print OUT pack( "C", $version );
print OUT pack( "CCC", 0, 0, 0 );
print OUT pack( "L", $length );
close(OUT);
#コンソール出力
print "[Header]\n";
printf " version : %d\n", $version;
printf " length : %d\n", $length;
print "[Body]\n";
printf " region : %d (%s)\n", $region, $regionNameList[$region];
printf " serialNo : %s (%d)\n", $serialNo, length($serialNo);
#RSA署名
my $key = $cmd->{"-k"};
my $outName = $cmd->{"-o"};
system "openssl dgst -sha1 -binary -out tgt.dgst body.bin";
system "openssl rsautl -sign -in tgt.dgst -inkey $key -out tgt.sgn";
system "cat tgt.sgn header.bin body.bin >$outName";
system "rm header.bin body.bin tgt.dgst tgt.sgn";
exit;
sub analyze_argv
{
my $opt;
my %cmd = ();
foreach my $token ( @ARGV )
{
if( substr($token, 0, 1) eq "-" )
{
$opt = $token;
}
elsif( $opt )
{
$cmd{$opt} = $token;
$opt = "";
}
else
{
push @{$cmd{""}}, $token;
}
}
return \%cmd;
}

Binary file not shown.

View File

@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDA4IhhwscM7zzlTuQ2zrRvd96wRMRg1ijPofTDzl/VH8KWb1Ri
YHY0GL7/qtgJ6mOV99vFj1m4rBOE4xxDtvdN0ZGvmfTvw5iwzDnIZ/ODOTB4mBVy
SsBhrSv2+L1teHqE83s9FSbD2wGlLb4qaOavbxGl13avP851lQiyN/uFyQIDAQAB
AoGAShr6y3TmvZV9tCznihdJRDquGNOTEBG4hG4ZeNHmCCC3xszngxTE1adcWybs
8oJX2NruWa2GL2oN5dTMm0fFJDjzgoAHqzG71+3c+BB8ctmfRxH9AQE+wsQNm1iD
y6izKkL+PaZc1YdRvTsbKIAaitrovTyst4OPAZjGbd4ryzECQQD77SKN59LLGVvE
oxl8oXqk2ZHhLDZtf/ZdpQOynBXI51P7jqR1oZqMfShwDQOlufPUiPKYw2I8ZN09
W1aPRCoPAkEAw/71sD5JplGa9boA47Xg05iSW5zKLTSqj2lZxj2avbLM3VKfpwSx
3ZeYYtZoFNgdbyVuGKgdjUoQ9q+G9qiKpwJAXg5G3Fw04wbwsBWEqndPZsSkJkFv
gKpJvOSi4MhNidh0DnNPC2vuW41Oz6bMOc+XLT6D9Gzd/FZcE1BKnOqCGQJARwAM
hqz5xytWxF9+RP81E9H4awGQZ/HlO5CBegQFE2U7O43b0ggsWsa46E0dZTeo6gOY
L4xvMCi9nm+Vp7MEjwJAHuVYh2huUo0Udon1xxevW0Jl49oRZNHaCt/YfEQ2os7b
CO5rc1wOZN9tT9/PSO8k/4NzgvZ+9cBvpadyKIUi3A==
-----END RSA PRIVATE KEY-----

Binary file not shown.

View File

@ -0,0 +1,6 @@
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA4IhhwscM7zzlTuQ2zrRvd96w
RMRg1ijPofTDzl/VH8KWb1RiYHY0GL7/qtgJ6mOV99vFj1m4rBOE4xxDtvdN0ZGv
mfTvw5iwzDnIZ/ODOTB4mBVySsBhrSv2+L1teHqE83s9FSbD2wGlLb4qaOavbxGl
13avP851lQiyN/uFyQIDAQAB
-----END PUBLIC KEY-----