diff --git a/build/buildtools/commondefs.firm b/build/buildtools/commondefs.firm index fc80ac83..2b4850ea 100644 --- a/build/buildtools/commondefs.firm +++ b/build/buildtools/commondefs.firm @@ -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)) diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index bc7ed9d0..fb65629d 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -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(); diff --git a/build/libraries_sysmenu/acsign/ARM9/Makefile b/build/libraries_sysmenu/acsign/ARM9/Makefile index f9213837..81a76cb6 100644 --- a/build/libraries_sysmenu/acsign/ARM9/Makefile +++ b/build/libraries_sysmenu/acsign/ARM9/Makefile @@ -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 diff --git a/build/libraries_sysmenu/acsign/ARM9/include/acmemory.h b/build/libraries_sysmenu/acsign/ARM9/include/acmemory.h index 8247764c..1a3e206e 100644 --- a/build/libraries_sysmenu/acsign/ARM9/include/acmemory.h +++ b/build/libraries_sysmenu/acsign/ARM9/include/acmemory.h @@ -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 ); diff --git a/build/libraries_sysmenu/acsign/ARM9/src/acmemory.c b/build/libraries_sysmenu/acsign/ARM9/src/acmemory.c index a6785f03..d97bac91 100644 --- a/build/libraries_sysmenu/acsign/ARM9/src/acmemory.c +++ b/build/libraries_sysmenu/acsign/ARM9/src/acmemory.c @@ -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; +} diff --git a/build/libraries_sysmenu/acsign/ARM9/src/acsign.c b/build/libraries_sysmenu/acsign/ARM9/src/acsign.c index f5dc67d8..89a528cd 100644 --- a/build/libraries_sysmenu/acsign/ARM9/src/acsign.c +++ b/build/libraries_sysmenu/acsign/ARM9/src/acsign.c @@ -291,7 +291,7 @@ int ACSign_Decrypto( if ( !key_ptr ) return 0; // - ACMemory_Clear( ); +// ACMemory_Clear( ); // exp_ptr = &nDummyExp; diff --git a/build/libraries_sysmenu/settings/ARM9/Makefile b/build/libraries_sysmenu/settings/ARM9/Makefile index b1db6019..7ececd08 100644 --- a/build/libraries_sysmenu/settings/ARM9/Makefile +++ b/build/libraries_sysmenu/settings/ARM9/Makefile @@ -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 diff --git a/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c b/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c new file mode 100644 index 00000000..b6c064b0 --- /dev/null +++ b/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c @@ -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 +#include + +// 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 ); +} + diff --git a/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c b/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c index 48dc421a..d9d48d9a 100644 --- a/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c +++ b/build/libraries_sysmenu/settings/ARM9/src/TWLSettings.c @@ -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 ]; - // 対応言語ビットマップも本体設定データからなくなる予定 } diff --git a/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c b/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c new file mode 100644 index 00000000..32f863a8 --- /dev/null +++ b/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c @@ -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 +#include + +// 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; +} + diff --git a/build/systemMenu_RED/HWInfoWriter/ARM9/Makefile b/build/systemMenu_RED/HWInfoWriter/ARM9/Makefile new file mode 100644 index 00000000..4c1f3da5 --- /dev/null +++ b/build/systemMenu_RED/HWInfoWriter/ARM9/Makefile @@ -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 ===== diff --git a/build/systemMenu_RED/HWInfoWriter/ARM9/main.rsf b/build/systemMenu_RED/HWInfoWriter/ARM9/main.rsf new file mode 100644 index 00000000..89412902 --- /dev/null +++ b/build/systemMenu_RED/HWInfoWriter/ARM9/main.rsf @@ -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 +} diff --git a/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c b/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c new file mode 100644 index 00000000..67e20a4f --- /dev/null +++ b/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c @@ -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 +#include +#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 ); + } +} diff --git a/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.h b/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.h new file mode 100644 index 00000000..3f5c2ed8 --- /dev/null +++ b/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.h @@ -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 + +// define data---------------------------------------------------------- + +void HWInfoWriterInit( void ); +void HWInfoWriterMain( void ); + +#ifdef __cplusplus +} +#endif + +#endif // __DS_CHAT_H__ diff --git a/build/systemMenu_RED/HWInfoWriter/ARM9/src/main.c b/build/systemMenu_RED/HWInfoWriter/ARM9/src/main.c new file mode 100644 index 00000000..ed400106 --- /dev/null +++ b/build/systemMenu_RED/HWInfoWriter/ARM9/src/main.c @@ -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 +#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ブランク割込チェックのセット +} + diff --git a/build/systemMenu_RED/HWInfoWriter/Makefile b/build/systemMenu_RED/HWInfoWriter/Makefile new file mode 100644 index 00000000..66754bca --- /dev/null +++ b/build/systemMenu_RED/HWInfoWriter/Makefile @@ -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 ===== diff --git a/build/systemMenu_RED/HWInfoWriter/banner/Makefile b/build/systemMenu_RED/HWInfoWriter/banner/Makefile new file mode 100644 index 00000000..50edbbb8 --- /dev/null +++ b/build/systemMenu_RED/HWInfoWriter/banner/Makefile @@ -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) + +# diff --git a/build/systemMenu_RED/HWInfoWriter/banner/banner_v3.bsf b/build/systemMenu_RED/HWInfoWriter/banner/banner_v3.bsf new file mode 100644 index 00000000..f097cd88 Binary files /dev/null and b/build/systemMenu_RED/HWInfoWriter/banner/banner_v3.bsf differ diff --git a/build/systemMenu_RED/HWInfoWriter/banner/icon/gameIcon.bmp b/build/systemMenu_RED/HWInfoWriter/banner/icon/gameIcon.bmp new file mode 100644 index 00000000..5fe5ee2c Binary files /dev/null and b/build/systemMenu_RED/HWInfoWriter/banner/icon/gameIcon.bmp differ diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile index ea335a13..21fa3d2a 100644 --- a/build/systemMenu_RED/Launcher/ARM9/Makefile +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -18,6 +18,7 @@ SUBDIRS = \ ../../../libraries_sysmenu/sysmenu \ + ../../../libraries_sysmenu/settings \ ../../../libraries_sysmenu/boot \ ../../../libraries_sysmenu/hotsw \ ../../../libraries_sysmenu/reset_param \ diff --git a/doc/NAND繝輔Λ繝繧キ繝・繝槭ャ繝&繝輔か繝ォ繝繝繝ェ繝シ.vsd b/doc/NAND繝輔Λ繝繧キ繝・繝槭ャ繝&繝輔か繝ォ繝繝繝ェ繝シ.vsd index 52b442ea..ba8b0af7 100644 Binary files a/doc/NAND繝輔Λ繝繧キ繝・繝槭ャ繝&繝輔か繝ォ繝繝繝ェ繝シ.vsd and b/doc/NAND繝輔Λ繝繧キ繝・繝槭ャ繝&繝輔か繝ォ繝繝繝ェ繝シ.vsd differ diff --git a/doc/SystemMenu_RED繝ェ繝ェ繝シ繧ケ.txt b/doc/SystemMenu_RED繝ェ繝ェ繝シ繧ケ.txt index 26c8cad2..78c36663 100644 --- a/doc/SystemMenu_RED繝ェ繝ェ繝シ繧ケ.txt +++ b/doc/SystemMenu_RED繝ェ繝ェ繝シ繧ケ.txt @@ -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補正 ○ ・日付・時刻設定 ○ diff --git a/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd b/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd index 5cf4e88f..ece8d5d8 100644 Binary files a/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd and b/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd differ diff --git a/include/sysmenu/acsign/ARM9/acsign.h b/include/sysmenu/acsign/ARM9/acsign.h index eff3b534..17969eb2 100644 --- a/include/sysmenu/acsign/ARM9/acsign.h +++ b/include/sysmenu/acsign/ARM9/acsign.h @@ -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 diff --git a/include/sysmenu/settings.h b/include/sysmenu/settings.h index 58b91abe..71f43860 100644 --- a/include/sysmenu/settings.h +++ b/include/sysmenu/settings.h @@ -18,6 +18,8 @@ #ifndef SYSM_MACHINE_SETTINGS_H_ #define SYSM_MACHINE_SETTINGS_H_ +#include +#include #include #include diff --git a/include/sysmenu/settings/common/TWLHWInfo.h b/include/sysmenu/settings/common/TWLHWInfo.h new file mode 100644 index 00000000..d14b0cc0 --- /dev/null +++ b/include/sysmenu/settings/common/TWLHWInfo.h @@ -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 +#include + +#ifdef HW_SECURE_INFO_WRITE_ENABLE_ +#include +#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_ diff --git a/include/sysmenu/settings/common/TWLSettings.h b/include/sysmenu/settings/common/TWLSettings.h index ac77cf1d..e4757650 100644 --- a/include/sysmenu/settings/common/TWLSettings.h +++ b/include/sysmenu/settings/common/TWLSettings.h @@ -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; // 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 ) { diff --git a/include/sysmenu/settings/common/TWLStoreFile.h b/include/sysmenu/settings/common/TWLStoreFile.h new file mode 100644 index 00000000..41b53738 --- /dev/null +++ b/include/sysmenu/settings/common/TWLStoreFile.h @@ -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 +#include + +#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_ diff --git a/keys/HWInfo/dummy/privHWInfo_dummy.pem b/keys/HWInfo/dummy/privHWInfo_dummy.pem new file mode 100644 index 00000000..a55c5740 --- /dev/null +++ b/keys/HWInfo/dummy/privHWInfo_dummy.pem @@ -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----- diff --git a/keys/HWInfo/dummy/pubHWInfo_dummy.pem b/keys/HWInfo/dummy/pubHWInfo_dummy.pem new file mode 100644 index 00000000..e5a13ec2 --- /dev/null +++ b/keys/HWInfo/dummy/pubHWInfo_dummy.pem @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlcyzdiJ14or13KZTuxvMyZCCV +uVLZndVNtd1zhhqX0BQQgEb0LM75BQbkwlhwQgdecdSc6xZwaxSWCoRpKB2CzT6U +gpPIC0XTiZwFsriu/o1T3E8dg4r+8QDNqcD6PxcxhBamOKtcO4GgZzUkU2bttyVz +g9YI9KZLPJlKyhsitQIDAQAB +-----END PUBLIC KEY----- diff --git a/keys/HWInfo/makeHWInfo.pl b/keys/HWInfo/makeHWInfo.pl new file mode 100755 index 00000000..9b7337b6 --- /dev/null +++ b/keys/HWInfo/makeHWInfo.pl @@ -0,0 +1,105 @@ +#!/bin/perl + +use strict; + + +if( @ARGV != 8 ) { + die "usage: makeHWInfo.pl -r -s -k -o \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; +} + diff --git a/keys/HWInfo/privKeyHWInfo.der b/keys/HWInfo/privKeyHWInfo.der new file mode 100644 index 00000000..73a7da7c Binary files /dev/null and b/keys/HWInfo/privKeyHWInfo.der differ diff --git a/keys/HWInfo/privKeyHWInfo.pem b/keys/HWInfo/privKeyHWInfo.pem new file mode 100644 index 00000000..593c8130 --- /dev/null +++ b/keys/HWInfo/privKeyHWInfo.pem @@ -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----- diff --git a/keys/HWInfo/pubKeyHWInfo.der b/keys/HWInfo/pubKeyHWInfo.der new file mode 100644 index 00000000..1d452832 Binary files /dev/null and b/keys/HWInfo/pubKeyHWInfo.der differ diff --git a/keys/HWInfo/pubKeyHWInfo.pem b/keys/HWInfo/pubKeyHWInfo.pem new file mode 100644 index 00000000..4582a9f0 --- /dev/null +++ b/keys/HWInfo/pubKeyHWInfo.pem @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA4IhhwscM7zzlTuQ2zrRvd96w +RMRg1ijPofTDzl/VH8KWb1RiYHY0GL7/qtgJ6mOV99vFj1m4rBOE4xxDtvdN0ZGv +mfTvw5iwzDnIZ/ODOTB4mBVySsBhrSv2+L1teHqE83s9FSbD2wGlLb4qaOavbxGl +13avP851lQiyN/uFyQIDAQAB +-----END PUBLIC KEY----- diff --git a/keys/dummy/rsa/private_gcd.der b/keys/firm/dummy/rsa/private_gcd.der similarity index 100% rename from keys/dummy/rsa/private_gcd.der rename to keys/firm/dummy/rsa/private_gcd.der diff --git a/keys/dummy/rsa/private_nand.der b/keys/firm/dummy/rsa/private_nand.der similarity index 100% rename from keys/dummy/rsa/private_nand.der rename to keys/firm/dummy/rsa/private_nand.der diff --git a/keys/dummy/rsa/private_nor.der b/keys/firm/dummy/rsa/private_nor.der similarity index 100% rename from keys/dummy/rsa/private_nor.der rename to keys/firm/dummy/rsa/private_nor.der diff --git a/keys/dummy/rsa/pubkey_gcd.der b/keys/firm/dummy/rsa/pubkey_gcd.der similarity index 100% rename from keys/dummy/rsa/pubkey_gcd.der rename to keys/firm/dummy/rsa/pubkey_gcd.der diff --git a/keys/dummy/rsa/pubkey_nand.der b/keys/firm/dummy/rsa/pubkey_nand.der similarity index 100% rename from keys/dummy/rsa/pubkey_nand.der rename to keys/firm/dummy/rsa/pubkey_nand.der diff --git a/keys/dummy/rsa/pubkey_nor.der b/keys/firm/dummy/rsa/pubkey_nor.der similarity index 100% rename from keys/dummy/rsa/pubkey_nor.der rename to keys/firm/dummy/rsa/pubkey_nor.der