SDカードへSha1値の出力ができるように修正

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2906 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2009-08-31 09:35:59 +00:00
parent 5822bb5910
commit 617aaca7df

View File

@ -51,6 +51,15 @@
#define NAND_FIRM_START_OFFSET_IN_FILE 0x200
#define TITLE_ID_DATA_ONLY_MASK 0x00000008
#define TITLE_ID_GAMECODE_MASK 0xFFFFFF00
#define OUTPUT_SORT_TITLE_NUM 14
#define OUTPUT_NAND_FIRM_IDX 10
#define OUTPUT_SHARED_FONT_IDX 12
// デバッグ用
//#define HASH_CRC_CLCU_SKIP
/*---------------------------------------------------------------------------*
@ -91,6 +100,8 @@ typedef struct DataStruct
u8 Sha1_digest[SVC_SHA1_DIGEST_SIZE];
u16 crc16;
BOOL output;
} DataStruct;
static u8 sFontData_Sha1_digest[SVC_SHA1_DIGEST_SIZE];
@ -100,6 +111,22 @@ static DataStruct gDataList[TITLE_NUM_PAGE * 2];
static u16 crc_table[0x100];
static const u32 TitleIDTable[14] = {
0x484e4100, // 0.HNA* ランチャ
0x484e4200, // 1.HNB* 本体設定
0x484e4300, // 2.HNC* 無線ファーム
0x484e4400, // 3.HND* DLプレイ
0x484e4500, // 4.HNE* ピクトチャット
0x484e4800, // 5.HNH* ホワイトリスト
0x484e4900, // 6.HNI* カメラ
0x484e4a00, // 7.HNJ* Nintendoゾーン
0x484e4b00, // 8.HNK* サウンド
0x484e4c00, // 9.HNL* バージョンデータ
NAND_FIRM_INFO_OFS, //10.---- NANDファーム
0x344e4641, //11.4NFA Nand Filer
SHARED_FONT_INFO_OFS, //12.---- フォント
0x34544e41 //13.4TNA TwlNmenu
};
/*---------------------------------------------------------------------------*
Prototype
*---------------------------------------------------------------------------*/
@ -126,6 +153,9 @@ void* MyNAMUT_Alloc(u32 size);
void MyNAMUT_Free(void* buffer);
static BOOL ReadTWLSettings( void );
static BOOL OutputHashDataForSD( DataStruct* list );
static BOOL OutputData( FSFile* file, DataStruct* data, u32 index );
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*
@ -148,6 +178,8 @@ void TwlMain(void)
GX_DispOn();
GXS_DispOn();
RTC_Init();
spAllocFunc = AllocForNAM;
spFreeFunc = FreeForNAM;
@ -167,6 +199,8 @@ void TwlMain(void)
// hash Check
ProcessTitleHashCheck();
OutputHashDataForSD(gDataList);
while(TRUE)
{
// キー入力情報取得
@ -379,7 +413,8 @@ static void DrawScene(DataStruct* list)
PutSubScreen(2, 10, 0xff, "- SHA1 Digest Data -");
for( i=0; i<10; i++ ){
for( i=0; i<10; i++ )
{
PutSubScreen(2 + (i*3), 12, 0xf4, "%02x ", digest[i]);
PutSubScreen(2 + (i*3), 14, 0xf4, "%02x ", digest[i+10]);
}
@ -418,6 +453,7 @@ BOOL ProcessTitleHashCheck( void )
list = gDataList;
#ifndef HASH_CRC_CLCU_SKIP
// srlのHash値とcrc16を求める
for ( i=0; i < gNandAppNum; i++, list++ )
{
@ -442,6 +478,7 @@ BOOL ProcessTitleHashCheck( void )
PutSubScreen( 7, 10, 0xf6, "--- Now Loading ---");
PutSubScreen( 7, 14, 0xf6, " %2d / %2d compleate", i+1, gNandAppNum);
}
#endif
// SharedフォントとNandファームの値用の2つ
gNandAppNum += 2;
@ -573,6 +610,152 @@ static BOOL GetAppPath(DataStruct* list, char* path_buf)
}
/*---------------------------------------------------------------------------*
Name: OutputHashDataForSD
Description:
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static BOOL OutputHashDataForSD( DataStruct* list )
{
#pragma unused(list)
BOOL retval = TRUE;
FSFile file;
u32 i,j;
char path_buf[FS_ENTRY_LONGNAME_MAX+6];
RTCDate rtc;
DataStruct* p;
// ファイル初期化
FS_InitFile(&file);
// 年月日の取得
RTC_GetDate( &rtc );
// ディレクトリパスの作成
STD_TSNPrintf( path_buf, FS_ENTRY_LONGNAME_MAX,
"sdmc:/TitleHashChecker_20%02d%02d%02d.txt", rtc.year, rtc.month, rtc.day );
// ファイルの作成
retval = FS_CreateFile( path_buf, FS_PERMIT_R | FS_PERMIT_W );
if(!retval)
{
OS_PutString("Fail: CreateFile\n");
}
// ファイルオープン
retval = FS_OpenFileEx( &file, path_buf, FS_PERMIT_W);
if(!retval)
{
OS_PutString("Fail: OpenFile\n");
}
// ファイルへ書き込み
retval = FS_WriteFile( &file, "**************************\n" , 27);
retval = FS_WriteFile( &file, "* Title Hash Checker *\n" , 27);
retval = FS_WriteFile( &file, "**************************\n\n", 28);
// retval = FS_WriteFile( &file, "GameCode | Title Hash:SRL [SHA1 Digest Data]\n", 45);
// retval = FS_WriteFile( &file, "----------------------------------------------------\n", 53);
// 特定ファイルの書き出し
for(i=0; i<OUTPUT_SORT_TITLE_NUM; i++)
{
p = list;
// ファーム
if( TitleIDTable[i] == NAND_FIRM_INFO_OFS )
{
retval = OutputData( &file, (p + gNandAppNum - NAND_FIRM_INFO_OFS), i );
continue;
}
// シェアドフォント
else if( TitleIDTable[i] == SHARED_FONT_INFO_OFS )
{
retval = OutputData( &file, (p + gNandAppNum - SHARED_FONT_INFO_OFS), i );
continue;
}
for(j=0; j<gNandAppNum; j++, p++)
{
if( TitleIDTable[i] == ((u32)(p->id) & TITLE_ID_GAMECODE_MASK))
{
retval = OutputData( &file, p, i );
break;
}
}
}
p = list;
// 残りファイルの書き出し
for(i=0; i<gNandAppNum; i++, p++)
{
if(!p->output)
{
OutputData( &file, p, i );
}
}
// ファイルクローズ
FS_CloseFile( &file );
return retval;
}
static BOOL OutputData( FSFile* file, DataStruct* data, u32 index )
{
BOOL retval = TRUE;
u8 init_code[5];
char hash[SVC_SHA1_DIGEST_SIZE*2+1];
u8* p = data->Sha1_digest;
if( index == OUTPUT_NAND_FIRM_IDX )
{
retval = FS_WriteFile( file, "NandFirm\t", 9);
}
else if( index == OUTPUT_SHARED_FONT_IDX )
{
retval = FS_WriteFile( file, "SharedFont\t", 11);
}
else
{
ConvertInitialCode(init_code, NAM_GetTitleIdLo(data->id));
init_code[4] = '\t';
retval = FS_WriteFile( file, init_code, 5);
}
STD_TSPrintf( hash, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
p[0] ,p[1] ,p[2] ,p[3] ,p[4] ,p[5] ,p[6] ,p[7] ,p[8] ,p[9], p[10],p[11],p[12],p[13],p[14],p[15],p[16],p[17],p[18],p[19]);
OS_TPrintf("hash : %s", hash);
retval = FS_WriteFile( file, hash , SVC_SHA1_DIGEST_SIZE*2+1);
if(!retval)
{
OS_PutString("Fail: WriteFile\n");
}
data->output = TRUE;
return retval;
}
/*---------------------------------------------------------------------------*
Name: CulcuNandAppHash