CRC16, SHA1の値を求める部分を修正

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2885 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2009-07-24 12:51:55 +00:00
parent 4bafb330df
commit 8b4068a16c

View File

@ -34,6 +34,8 @@
#define CRCPOLY 0x1021 #define CRCPOLY 0x1021
#define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8)
// 表示する対象をユーザーアプリだけにする場合 // 表示する対象をユーザーアプリだけにする場合
//#define USER_APP_ONLY //#define USER_APP_ONLY
@ -280,7 +282,7 @@ static void DrawScene(DataStruct* list)
u8 init_code[5]; u8 init_code[5];
u8 color; u8 color;
u32 start; u32 start;
u32* digest; u8* digest;
DataStruct* p = list; DataStruct* p = list;
@ -293,10 +295,9 @@ static void DrawScene(DataStruct* list)
} }
// 上画面 一覧表示 // 上画面 一覧表示
PutMainScreen( 1, 0, 0xf2, "------ Title Hash Checker ------ "); PutMainScreen( 0, 0, 0xf2, "------ Title Hash Checker ------");
PutMainScreen( 1, 1, 0xfa, "<Page %d/%d>", (gCurrentPage+1), (gMaxPage+1)); PutMainScreen( 1, 1, 0xfa, "<Page %d/%d>", (gCurrentPage+1), (gMaxPage+1));
PutMainScreen( 1, 2, 0xf4, " Game"); PutMainScreen( 1, 3, 0xf4, "Game Code");
PutMainScreen( 1, 3, 0xf4, " Code");
PutMainScreen( 0, 4, 0xff, "--------------------------------"); PutMainScreen( 0, 4, 0xff, "--------------------------------");
// カーソル表示 // カーソル表示
@ -334,21 +335,20 @@ static void DrawScene(DataStruct* list)
// 下画面 詳細表示 // 下画面 詳細表示
ConvertInitialCode(init_code, NAM_GetTitleIdLo(list[gCurrentElem].id)); ConvertInitialCode(init_code, NAM_GetTitleIdLo(list[gCurrentElem].id));
PutSubScreen(3, 1, 0xf4, "Selected Title : [ %s ]", init_code); PutSubScreen(2, 1, 0xf4, "Selected Title : [ %s ]", init_code);
PutSubScreen(3, 4, 0xff, "- CRC16 Data -"); PutSubScreen(2, 4, 0xff, "- CRC16 Data -");
PutSubScreen(3, 6, 0xf4, "0x%04x", list[gCurrentElem].crc16); PutSubScreen(2, 6, 0xf4, "0x%04x", list[gCurrentElem].crc16);
digest = (u32 *)list[gCurrentElem].Sha1_digest; digest = (u8 *)list[gCurrentElem].Sha1_digest;
PutSubScreen(3, 10, 0xff, "- SHA1 Digest Data -"); PutSubScreen(2, 10, 0xff, "- SHA1 Digest Data -");
PutSubScreen(3, 12, 0xf4, "0x%08x", digest[0]); for( i=0; i<10; i++ ){
PutSubScreen(3, 14, 0xf4, "0x%08x", digest[1]); PutSubScreen(2 + (i*3), 12, 0xf4, "%02x ", digest[i]);
PutSubScreen(3, 16, 0xf4, "0x%08x", digest[2]); PutSubScreen(2 + (i*3), 14, 0xf4, "%02x ", digest[i+10]);
PutSubScreen(3, 18, 0xf4, "0x%08x", digest[3]); }
PutSubScreen(3, 20, 0xf4, "0x%08x", digest[4]);
} }
@ -397,13 +397,15 @@ BOOL ProcessTitleHashCheck( void )
// ファイルパスの取得 // ファイルパスの取得
if ( !GetAppPath(list, full_path) ) if ( !GetAppPath(list, full_path) )
{ {
OS_Panic("CulcuHash() failed."); gErrorFlg = TRUE;
// OS_Panic("CulcuHash() failed.");
} }
// Hash, CRC16の計算 // Hash, CRC16の計算
if ( !CulcuHash(list, full_path) ) if ( !CulcuHash(list, full_path) )
{ {
OS_Panic("CulcuHash() failed."); gErrorFlg = TRUE;
// OS_Panic("CulcuHash() failed.");
} }
} }
@ -528,7 +530,7 @@ static BOOL GetAppPath(DataStruct* list, char* path_buf)
Returns: Returns:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#define READ_SIZE 0x200 // とりあえずのリードサイズ #define READ_SIZE 0x1000 // MasterEditorでのCRC計算にあわせるためこの値を使う
BOOL CulcuHash(DataStruct* list, char* full_path) BOOL CulcuHash(DataStruct* list, char* full_path)
{ {
@ -540,8 +542,9 @@ BOOL CulcuHash(DataStruct* list, char* full_path)
u32 read_size = 0; u32 read_size = 0;
u32 data_size = 0; u32 data_size = 0;
u32 i; u32 i;
u16 crc = 0;
u8* pTempBuf; u8* pTempBuf;
SVCHMACSHA1Context hash; SVCSHA1Context hash;
FSResult result; FSResult result;
@ -550,7 +553,7 @@ BOOL CulcuHash(DataStruct* list, char* full_path)
inittable(crc_table); inittable(crc_table);
// ハッシュ初期化 // ハッシュ初期化
SVC_HMACSHA1Init( &hash, list->Sha1_digest, SVC_SHA1_DIGEST_SIZE ); SVC_SHA1Init( &hash );
// FS初期化 // FS初期化
FS_InitFile(&file); FS_InitFile(&file);
@ -565,12 +568,9 @@ BOOL CulcuHash(DataStruct* list, char* full_path)
// ファイル長取得 // ファイル長取得
file_size = FS_GetFileLength(&file); file_size = FS_GetFileLength(&file);
OS_TPrintf("File Size : %d bytes\n", file_size);
// ファイルが大きいものもあるから細切れで読む // ファイルが大きいものもあるから細切れで読む
for(i=1;;i++){ for(i=1;;i++){
MI_CpuClear(pTempBuf, sizeof(pTempBuf));
// バッファ確保 // バッファ確保
pTempBuf = spAllocFunc( READ_SIZE ); pTempBuf = spAllocFunc( READ_SIZE );
if (pTempBuf == NULL) if (pTempBuf == NULL)
@ -581,7 +581,7 @@ BOOL CulcuHash(DataStruct* list, char* full_path)
} }
// 読み込むサイズを決める // 読み込むサイズを決める
if( (READ_SIZE * i) >= file_size ) if( (READ_SIZE * i) > file_size )
{ {
data_size = file_size % READ_SIZE; data_size = file_size % READ_SIZE;
} }
@ -591,7 +591,8 @@ BOOL CulcuHash(DataStruct* list, char* full_path)
} }
// ファイルリード // ファイルリード
read_is_ok = FS_ReadFile( &file, pTempBuf, READ_SIZE ); read_is_ok = FS_ReadFile( &file, pTempBuf, READ_SIZE ); // 本来ならばここは data_size分読めばよいが、
// MasterEditorのCRC計算にあわせるため、READ_SIZE分読み込む
result = FS_GetResultCode(&file); result = FS_GetResultCode(&file);
if (!read_is_ok) if (!read_is_ok)
{ {
@ -602,13 +603,14 @@ BOOL CulcuHash(DataStruct* list, char* full_path)
} }
// 読んだサイズを更新 // 読んだサイズを更新
read_size += READ_SIZE; read_size += data_size;
// Hash値 UpDate
SVC_HMACSHA1Update( &hash, pTempBuf, data_size );
// CRC16計算 // CRC16計算
list->crc16 = newGetCRC(list->crc16, (u16 *)pTempBuf, data_size); crc = newGetCRC(crc, (u16 *)pTempBuf, READ_SIZE); // 本来ならばここは data_size分の計算をすればよいが、
// MasterEditorのCRC計算にあわせるため、READ_SIZE分計算する
// Hash値 UpDate
SVC_SHA1Update( &hash, pTempBuf, data_size );
// ファイルが全部読めたらwhileをぬける // ファイルが全部読めたらwhileをぬける
if( read_size >= file_size ) if( read_size >= file_size )
@ -618,7 +620,7 @@ BOOL CulcuHash(DataStruct* list, char* full_path)
else else
{ {
// ファイルシーク // ファイルシーク
seek_is_ok = FS_SeekFile( &file, READ_SIZE * i, FS_SEEK_SET ); seek_is_ok = FS_SeekFile( &file, (s32)(READ_SIZE * i), FS_SEEK_SET );
result = FS_GetResultCode(&file); result = FS_GetResultCode(&file);
if(!seek_is_ok) if(!seek_is_ok)
{ {
@ -631,10 +633,17 @@ BOOL CulcuHash(DataStruct* list, char* full_path)
spFreeFunc( pTempBuf ); spFreeFunc( pTempBuf );
} }
OS_TPrintf("CRC16 : 0x%08x\n", list->crc16); if(file_size != read_size)
{
OS_PutString(" Read Size Error!!!\n");
}
OS_PutString("\n\n");
// Hash値算出 // Hash値算出
SVC_HMACSHA1GetHash( &hash, list->Sha1_digest ); SVC_SHA1GetHash( &hash, list->Sha1_digest );
list->crc16 = crc;
// ファイルクローズ // ファイルクローズ
FS_CloseFile(&file); FS_CloseFile(&file);
@ -672,8 +681,8 @@ u16 newGetCRC
byte0 = *byte; byte++; byte0 = *byte; byte++;
byte1 = *byte; byte++; byte1 = *byte; byte++;
crc = (crc << 8) ^ crc_table[(crc >> 8) ^ byte1]; crc = (u16)((crc << 8) ^ crc_table[(crc >> 8) ^ byte1]);
crc = (crc << 8) ^ crc_table[(crc >> 8) ^ byte0]; crc = (u16)((crc << 8) ^ crc_table[(crc >> 8) ^ byte0]);
} }
return crc; return crc;
@ -695,10 +704,10 @@ static void inittable(unsigned short *table)
unsigned short i, j, r; unsigned short i, j, r;
for(i = 0; i < 0x100; i++) { for(i = 0; i < 0x100; i++) {
r = i << 8; r = (unsigned short)(i << 8);
for(j = 0; j < 8; j++) { for(j = 0; j < 8; j++) {
if(r & 0x8000U) if(r & 0x8000U)
r = (r << 1) ^ CRCPOLY; r = (unsigned short)((r << 1) ^ CRCPOLY);
else else
r <<= 1; r <<= 1;
} }