mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
VCK および VCW タイトルのバックアップデータ検証における書き込みとベリファイを、ランダムデータを書き込んでフルコンペアする仕様に変更
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@3042 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
03248448fc
commit
0596babdbd
@ -85,13 +85,18 @@ void InitializeBackup( void)
|
||||
{
|
||||
u16 lock_id;
|
||||
|
||||
// HOTSWライブラリのケア(終了処理待ちなど)は必要ない
|
||||
#if 0
|
||||
// デバッグ用に表示するだけ
|
||||
if( HOTSW_isEnableHotSW())
|
||||
{
|
||||
HOTSW_InvalidHotSW();
|
||||
OS_TPrintf( "HOTSW is enable, so HOTSW_InvalidHotSW is done.\n");
|
||||
// HOTSW_InvalidHotSW();
|
||||
OS_TPrintf( "HOTSW is enable!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
OS_TPrintf( "ok, HOTSW is not enable.\n");
|
||||
}
|
||||
OS_TPrintf( "ok, HOTSW is not enable.\n");
|
||||
|
||||
if( !HOTSW_isFinalized())
|
||||
{
|
||||
OS_TPrintf( "HOTSW is not Finalized!\n");
|
||||
@ -108,6 +113,7 @@ void InitializeBackup( void)
|
||||
{
|
||||
OS_TPrintf( "ok, HOTSW is is card load completed.\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
if( !CARD_IsAvailable())
|
||||
{
|
||||
@ -152,7 +158,7 @@ BOOL readEEPROM( u32 src, void *dst, u32 len)
|
||||
}
|
||||
CARD_UnlockBackup( lock_id);
|
||||
|
||||
DC_FlushRange( dst, len);
|
||||
// DC_FlushRange( dst, len);
|
||||
|
||||
return result;
|
||||
}
|
||||
@ -162,7 +168,7 @@ BOOL writeEEPROM( u32 dst, const void *src, u32 len)
|
||||
BOOL result;
|
||||
u16 lock_id;
|
||||
|
||||
DC_FlushRange( src, len);
|
||||
// DC_FlushRange( src, len);
|
||||
|
||||
lock_id = (u16)OS_GetLockID();
|
||||
CARD_LockBackup( lock_id);
|
||||
@ -177,12 +183,51 @@ BOOL writeEEPROM( u32 dst, const void *src, u32 len)
|
||||
return result;
|
||||
}
|
||||
|
||||
#if 1
|
||||
BOOL writeAndVerifyEEPROM( u32 address, const void *buffer, void *reload_buffer, u32 len)
|
||||
{
|
||||
BOOL w_result, r_result;
|
||||
int m_result;
|
||||
u16 lock_id;
|
||||
u32 pos;
|
||||
|
||||
// バッファ同士がオーバーラップしていたらエラー
|
||||
pos = (u32)reload_buffer;
|
||||
if( ((u32)buffer <= pos) && (((u32)buffer + len - 1) >= pos))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
pos = (u32)reload_buffer + len - 1;
|
||||
if( ((u32)buffer <= pos) && (((u32)buffer + len - 1) >= pos))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
lock_id = (u16)OS_GetLockID();
|
||||
CARD_LockBackup( lock_id);
|
||||
/* CARD_WriteAndVerifyEeprom() は、 src上のデータをA9-CPUで一時バッファ(CARDi_backup_cache_page_buf)に
|
||||
コピーした上で処理しているので、srcのメモリ空間はA7から見えなくても良い */
|
||||
w_result = CARD_WriteEeprom( address, buffer, len);
|
||||
if( !w_result)
|
||||
{
|
||||
OS_TPrintf( "CARD_WriteEeprom failed! err:%d\n", (int)CARD_GetResultCode());
|
||||
}
|
||||
r_result = CARD_ReadEeprom( address, reload_buffer, len);
|
||||
if( !r_result)
|
||||
{
|
||||
OS_TPrintf( "CARD_ReadEeprom failed! err:%d\n", (int)CARD_GetResultCode());
|
||||
}
|
||||
m_result = MI_CpuComp8( buffer, reload_buffer, len);
|
||||
CARD_UnlockBackup( lock_id);
|
||||
return (w_result && r_result && (m_result == 0));
|
||||
}
|
||||
#else
|
||||
BOOL writeAndVerifyEEPROM( u32 dst, const void *src, u32 len)
|
||||
{
|
||||
BOOL result;
|
||||
u16 lock_id;
|
||||
|
||||
DC_FlushRange( src, len);
|
||||
// DC_FlushRange( src, len);
|
||||
|
||||
lock_id = (u16)OS_GetLockID();
|
||||
CARD_LockBackup( lock_id);
|
||||
@ -196,3 +241,4 @@ BOOL writeAndVerifyEEPROM( u32 dst, const void *src, u32 len)
|
||||
CARD_UnlockBackup( lock_id);
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -25,7 +25,8 @@ void InitializeBackup( void);
|
||||
void FinalizeBackup( void);
|
||||
BOOL readEEPROM( u32 src, void *dst, u32 len);
|
||||
BOOL writeEEPROM( u32 dst, const void *src, u32 len);
|
||||
BOOL writeAndVerifyEEPROM( u32 dst, const void *src, u32 len);
|
||||
BOOL writeAndVerifyEEPROM( u32 address, const void *buffer, void *reload_buffer, u32 len);
|
||||
//BOOL writeAndVerifyEEPROM( u32 dst, const void *src, u32 len);
|
||||
|
||||
/*
|
||||
// cardnor_NspiIfApi.cpp
|
||||
|
||||
@ -30,6 +30,8 @@
|
||||
//NN_COMPILER_ASSERT(VCK_BACKUP_READ_SIZE >= sizeof(VCK_SlotHeader) + sizeof(VCK_ProfileSlotBody));
|
||||
//NN_COMPILER_ASSERT(VCK_BACKUP_READ_SIZE % 32 == 0);
|
||||
|
||||
// ヘッダのチェックサムをチェックサムに変換する
|
||||
static u16 VCK_HeaderChecksumToChecksum( VCK_SlotHeader* header);
|
||||
// checksum を算出する
|
||||
static u16 getChecksum( void* data);
|
||||
// データが工場出荷状態か破壊されていれば TRUE を返す
|
||||
@ -53,8 +55,8 @@ TitleID_num;
|
||||
BOOL checkVCK( TitleProperty* tp)
|
||||
{
|
||||
u32 i;
|
||||
u16 tick;
|
||||
u32 *data;
|
||||
u32 *verify_data;
|
||||
VCK_SlotHeader *header;
|
||||
VCK_ProfileSlotBody *body;
|
||||
u8 *body_u8;
|
||||
@ -69,7 +71,9 @@ BOOL checkVCK( TitleProperty* tp)
|
||||
|
||||
// EEPROM から読み出し
|
||||
data = (u32*)(MI_AllocWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9));
|
||||
verify_data = (u32*)((u32)data + VCK_BACKUP_READ_SIZE);
|
||||
OS_TPrintf("Buffer:0x%x\n", data);
|
||||
OS_TPrintf("verifyBuffer:0x%x\n", verify_data);
|
||||
|
||||
InitializeBackup();
|
||||
readEEPROM( 0, (u32*)data, VCK_BACKUP_READ_SIZE);//sizeof(VCK_SlotHeader) + sizeof(VCK_ProfileSlotBody)が32Bytesの倍数でないため
|
||||
@ -97,12 +101,9 @@ BOOL checkVCK( TitleProperty* tp)
|
||||
}
|
||||
|
||||
// checksumがBになるようにランダムな1箇所へ書き込み
|
||||
tick = OS_GetTickLo();
|
||||
#if 1
|
||||
{
|
||||
MATH_CalcSHA1( calculatedSha1, (const void*)data, sizeof(VCK_ProfileSlotBody));
|
||||
}
|
||||
#endif
|
||||
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
|
||||
MATH_InitRand16( &rc16, rseed);
|
||||
for( i=0; i<sizeof(VCK_ProfileSlotBody); i++)
|
||||
@ -112,7 +113,7 @@ BOOL checkVCK( TitleProperty* tp)
|
||||
B_checksum = getChecksum( body);
|
||||
// 書き込んだ後の checksum が、S_checksum でも マジコンヘッダのchecksum にもならないようにする
|
||||
while( (B_checksum == S_checksum) ||
|
||||
( B_checksum == (0xFFFF - (header->m_uniqueIdentifier) - (header->m_slotCheckSum))))
|
||||
( B_checksum == VCK_HeaderChecksumToChecksum( header)))
|
||||
{
|
||||
B_checksum -= body_u8[sizeof(VCK_ProfileSlotBody) - 1];
|
||||
body_u8[sizeof(VCK_ProfileSlotBody) - 1]++;
|
||||
@ -120,22 +121,28 @@ BOOL checkVCK( TitleProperty* tp)
|
||||
}
|
||||
|
||||
// Backup デバイスへ反映
|
||||
if( writeAndVerifyEEPROM( 0, data, VCK_BACKUP_READ_SIZE))
|
||||
if( writeAndVerifyEEPROM( 0, data, verify_data, VCK_BACKUP_READ_SIZE))
|
||||
{
|
||||
OS_TPrintf("launch ok.\n");
|
||||
OS_TPrintf("ckecksum:0x%x, B_checksum:0x%x\n", getChecksum(body), B_checksum);
|
||||
OS_TPrintf("S_checksum:0x%x, A_ckecksum:0x%x, B_checksum:0x%x\n", S_checksum, VCK_HeaderChecksumToChecksum(header), B_checksum);
|
||||
FinalizeBackup();
|
||||
MI_FreeWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
OS_TPrintf("launch NG.\n");
|
||||
OS_TPrintf("S_checksum:0x%x, ckecksum:0x%x, B_checksum:0x%x\n", S_checksum, getChecksum(body), B_checksum);
|
||||
OS_TPrintf("S_checksum:0x%x, A_ckecksum:0x%x, B_checksum:0x%x\n", S_checksum, VCK_HeaderChecksumToChecksum(header), B_checksum);
|
||||
FinalizeBackup();
|
||||
MI_FreeWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// ヘッダのチェックサムをチェックサムに変換する
|
||||
static u16 VCK_HeaderChecksumToChecksum( VCK_SlotHeader* header)
|
||||
{
|
||||
return (u16)(0xFFFF - (header->m_uniqueIdentifier) - (header->m_slotCheckSum));
|
||||
}
|
||||
|
||||
// checksum を算出する
|
||||
static u16 getChecksum( void* data)
|
||||
{
|
||||
|
||||
@ -50,17 +50,20 @@ BOOL checkVCW( TitleProperty* tp, u32 ggid)
|
||||
#pragma unused( tp)
|
||||
u32 i;
|
||||
u32 *data;
|
||||
u32 *verify_data;
|
||||
u8 *buf;
|
||||
u16 B_checksum[2];
|
||||
VCW vcw[2];
|
||||
|
||||
OS_TPrintf("check VCW backup start.\n");
|
||||
OS_TPrintf("check VCW backup start. ggid = 0x%x\n", ggid);
|
||||
OS_TPrintf( "header size:0x%x, body size:0x%x\n", sizeof(VCW_SavegameHeader), sizeof(VCW_BodyForCheck));
|
||||
|
||||
// EEPROM から読み出し
|
||||
// base = MI_AllocWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9);
|
||||
data = (u32*)(MI_AllocWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9));
|
||||
verify_data = (u32*)((u32)data + VCW_BACKUP_READ_SIZE);
|
||||
OS_TPrintf("Buffer:0x%x\n", data);
|
||||
OS_TPrintf("verifyBuffer:0x%x\n", verify_data);
|
||||
|
||||
InitializeBackup();
|
||||
readEEPROM( 0, (u32*)data, VCW_BACKUP_READ_SIZE);
|
||||
@ -93,7 +96,7 @@ BOOL checkVCW( TitleProperty* tp, u32 ggid)
|
||||
if( VCW_IsModified( &vcw[0]) || VCW_IsModified( &vcw[1]))
|
||||
{
|
||||
OS_TPrintf( "backup write testing..\n");
|
||||
if( !writeAndVerifyEEPROM( 0, data, VCW_BACKUP_READ_SIZE))
|
||||
if( !writeAndVerifyEEPROM( 0, data, verify_data, VCW_BACKUP_READ_SIZE))
|
||||
{
|
||||
OS_TPrintf("launch NG!\n");
|
||||
VCW_Finalize( &vcw[0]);
|
||||
@ -183,7 +186,6 @@ static u16 VCW_Modify( VCW* vcw)
|
||||
{
|
||||
u16 S_checksum_tmp;
|
||||
u32 i;
|
||||
u16 tick;
|
||||
u8* body_u8 = (u8*)(vcw->body);
|
||||
u32 calculatedSha1[ MATH_SHA1_DIGEST_SIZE /sizeof(u32)];
|
||||
MATHRandContext16 rc16;
|
||||
@ -192,12 +194,9 @@ static u16 VCW_Modify( VCW* vcw)
|
||||
S_checksum_tmp = VCW_GetChecksum( vcw);
|
||||
|
||||
// checksumがBになるようにランダムな1箇所へ書き込み
|
||||
tick = OS_GetTickLo();
|
||||
#if 1
|
||||
{
|
||||
MATH_CalcSHA1( calculatedSha1, (const void*)vcw->body, sizeof(VCW_BodyForCheck));
|
||||
}
|
||||
#endif
|
||||
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
|
||||
MATH_InitRand16( &rc16, rseed);
|
||||
for( i=0; i<sizeof(VCW_BodyForCheck); i++)
|
||||
@ -214,7 +213,7 @@ static u16 VCW_Modify( VCW* vcw)
|
||||
body_u8[sizeof(VCW_BodyForCheck) - 1]++;
|
||||
vcw->B_checksum += body_u8[sizeof(VCW_BodyForCheck) - 1];
|
||||
}
|
||||
OS_TPrintf( "S_checksum:0x%x, A_checksum:0x%x, B_checksum;0x%x\n",
|
||||
OS_TPrintf( "S_checksum:0x%x, A_checksum:0x%x, B_checksum:0x%x\n",
|
||||
S_checksum_tmp,
|
||||
VCW_HeaderChecksumToChecksum( vcw),
|
||||
vcw->B_checksum);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user