mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・生産工程で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:
parent
84cd86d19d
commit
75a9423d25
@ -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))
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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 );
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -291,7 +291,7 @@ int ACSign_Decrypto(
|
||||
if ( !key_ptr ) return 0;
|
||||
|
||||
//
|
||||
ACMemory_Clear( );
|
||||
// ACMemory_Clear( );
|
||||
|
||||
//
|
||||
exp_ptr = &nDummyExp;
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
348
build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c
Normal file
348
build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c
Normal 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 );
|
||||
}
|
||||
|
||||
@ -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 ];
|
||||
// 対応言語ビットマップも本体設定データからなくなる予定
|
||||
}
|
||||
|
||||
|
||||
252
build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c
Normal file
252
build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c
Normal 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;
|
||||
}
|
||||
|
||||
60
build/systemMenu_RED/HWInfoWriter/ARM9/Makefile
Normal file
60
build/systemMenu_RED/HWInfoWriter/ARM9/Makefile
Normal 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 =====
|
||||
154
build/systemMenu_RED/HWInfoWriter/ARM9/main.rsf
Normal file
154
build/systemMenu_RED/HWInfoWriter/ARM9/main.rsf
Normal 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
|
||||
}
|
||||
368
build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c
Normal file
368
build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c
Normal 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 );
|
||||
}
|
||||
}
|
||||
37
build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.h
Normal file
37
build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.h
Normal 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__
|
||||
85
build/systemMenu_RED/HWInfoWriter/ARM9/src/main.c
Normal file
85
build/systemMenu_RED/HWInfoWriter/ARM9/src/main.c
Normal 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ブランク割込チェックのセット
|
||||
}
|
||||
|
||||
30
build/systemMenu_RED/HWInfoWriter/Makefile
Normal file
30
build/systemMenu_RED/HWInfoWriter/Makefile
Normal 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 =====
|
||||
49
build/systemMenu_RED/HWInfoWriter/banner/Makefile
Normal file
49
build/systemMenu_RED/HWInfoWriter/banner/Makefile
Normal 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)
|
||||
|
||||
#
|
||||
BIN
build/systemMenu_RED/HWInfoWriter/banner/banner_v3.bsf
Normal file
BIN
build/systemMenu_RED/HWInfoWriter/banner/banner_v3.bsf
Normal file
Binary file not shown.
BIN
build/systemMenu_RED/HWInfoWriter/banner/icon/gameIcon.bmp
Normal file
BIN
build/systemMenu_RED/HWInfoWriter/banner/icon/gameIcon.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 630 B |
@ -18,6 +18,7 @@
|
||||
|
||||
SUBDIRS = \
|
||||
../../../libraries_sysmenu/sysmenu \
|
||||
../../../libraries_sysmenu/settings \
|
||||
../../../libraries_sysmenu/boot \
|
||||
../../../libraries_sysmenu/hotsw \
|
||||
../../../libraries_sysmenu/reset_param \
|
||||
|
||||
Binary file not shown.
@ -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補正 ○
|
||||
・日付・時刻設定 ○
|
||||
|
||||
Binary file not shown.
@ -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
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
198
include/sysmenu/settings/common/TWLHWInfo.h
Normal file
198
include/sysmenu/settings/common/TWLHWInfo.h
Normal 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_
|
||||
@ -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 )
|
||||
{
|
||||
|
||||
94
include/sysmenu/settings/common/TWLStoreFile.h
Normal file
94
include/sysmenu/settings/common/TWLStoreFile.h
Normal 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_
|
||||
15
keys/HWInfo/dummy/privHWInfo_dummy.pem
Normal file
15
keys/HWInfo/dummy/privHWInfo_dummy.pem
Normal 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-----
|
||||
6
keys/HWInfo/dummy/pubHWInfo_dummy.pem
Normal file
6
keys/HWInfo/dummy/pubHWInfo_dummy.pem
Normal file
@ -0,0 +1,6 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlcyzdiJ14or13KZTuxvMyZCCV
|
||||
uVLZndVNtd1zhhqX0BQQgEb0LM75BQbkwlhwQgdecdSc6xZwaxSWCoRpKB2CzT6U
|
||||
gpPIC0XTiZwFsriu/o1T3E8dg4r+8QDNqcD6PxcxhBamOKtcO4GgZzUkU2bttyVz
|
||||
g9YI9KZLPJlKyhsitQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
105
keys/HWInfo/makeHWInfo.pl
Executable file
105
keys/HWInfo/makeHWInfo.pl
Executable 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;
|
||||
}
|
||||
|
||||
BIN
keys/HWInfo/privKeyHWInfo.der
Normal file
BIN
keys/HWInfo/privKeyHWInfo.der
Normal file
Binary file not shown.
15
keys/HWInfo/privKeyHWInfo.pem
Normal file
15
keys/HWInfo/privKeyHWInfo.pem
Normal 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-----
|
||||
BIN
keys/HWInfo/pubKeyHWInfo.der
Normal file
BIN
keys/HWInfo/pubKeyHWInfo.der
Normal file
Binary file not shown.
6
keys/HWInfo/pubKeyHWInfo.pem
Normal file
6
keys/HWInfo/pubKeyHWInfo.pem
Normal file
@ -0,0 +1,6 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA4IhhwscM7zzlTuQ2zrRvd96w
|
||||
RMRg1ijPofTDzl/VH8KWb1RiYHY0GL7/qtgJ6mOV99vFj1m4rBOE4xxDtvdN0ZGv
|
||||
mfTvw5iwzDnIZ/ODOTB4mBVySsBhrSv2+L1teHqE83s9FSbD2wGlLb4qaOavbxGl
|
||||
13avP851lQiyN/uFyQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
Loading…
Reference in New Issue
Block a user