VCK および VCW タイトルのバックアップデータ検証における書き込みとベリファイを、ランダムデータを書き込んでフルコンペアする仕様に変更

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@3042 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
n1481 2012-02-16 06:53:58 +00:00
parent 03248448fc
commit 0596babdbd
4 changed files with 76 additions and 23 deletions

View File

@ -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

View File

@ -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

View File

@ -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)
{

View File

@ -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);