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;
|
u16 lock_id;
|
||||||
|
|
||||||
|
// HOTSWライブラリのケア(終了処理待ちなど)は必要ない
|
||||||
|
#if 0
|
||||||
|
// デバッグ用に表示するだけ
|
||||||
if( HOTSW_isEnableHotSW())
|
if( HOTSW_isEnableHotSW())
|
||||||
{
|
{
|
||||||
HOTSW_InvalidHotSW();
|
// HOTSW_InvalidHotSW();
|
||||||
OS_TPrintf( "HOTSW is enable, so HOTSW_InvalidHotSW is done.\n");
|
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())
|
if( !HOTSW_isFinalized())
|
||||||
{
|
{
|
||||||
OS_TPrintf( "HOTSW is not Finalized!\n");
|
OS_TPrintf( "HOTSW is not Finalized!\n");
|
||||||
@ -108,6 +113,7 @@ void InitializeBackup( void)
|
|||||||
{
|
{
|
||||||
OS_TPrintf( "ok, HOTSW is is card load completed.\n");
|
OS_TPrintf( "ok, HOTSW is is card load completed.\n");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if( !CARD_IsAvailable())
|
if( !CARD_IsAvailable())
|
||||||
{
|
{
|
||||||
@ -152,7 +158,7 @@ BOOL readEEPROM( u32 src, void *dst, u32 len)
|
|||||||
}
|
}
|
||||||
CARD_UnlockBackup( lock_id);
|
CARD_UnlockBackup( lock_id);
|
||||||
|
|
||||||
DC_FlushRange( dst, len);
|
// DC_FlushRange( dst, len);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -162,7 +168,7 @@ BOOL writeEEPROM( u32 dst, const void *src, u32 len)
|
|||||||
BOOL result;
|
BOOL result;
|
||||||
u16 lock_id;
|
u16 lock_id;
|
||||||
|
|
||||||
DC_FlushRange( src, len);
|
// DC_FlushRange( src, len);
|
||||||
|
|
||||||
lock_id = (u16)OS_GetLockID();
|
lock_id = (u16)OS_GetLockID();
|
||||||
CARD_LockBackup( lock_id);
|
CARD_LockBackup( lock_id);
|
||||||
@ -177,12 +183,51 @@ BOOL writeEEPROM( u32 dst, const void *src, u32 len)
|
|||||||
return result;
|
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 writeAndVerifyEEPROM( u32 dst, const void *src, u32 len)
|
||||||
{
|
{
|
||||||
BOOL result;
|
BOOL result;
|
||||||
u16 lock_id;
|
u16 lock_id;
|
||||||
|
|
||||||
DC_FlushRange( src, len);
|
// DC_FlushRange( src, len);
|
||||||
|
|
||||||
lock_id = (u16)OS_GetLockID();
|
lock_id = (u16)OS_GetLockID();
|
||||||
CARD_LockBackup( lock_id);
|
CARD_LockBackup( lock_id);
|
||||||
@ -196,3 +241,4 @@ BOOL writeAndVerifyEEPROM( u32 dst, const void *src, u32 len)
|
|||||||
CARD_UnlockBackup( lock_id);
|
CARD_UnlockBackup( lock_id);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@ -25,7 +25,8 @@ void InitializeBackup( void);
|
|||||||
void FinalizeBackup( void);
|
void FinalizeBackup( void);
|
||||||
BOOL readEEPROM( u32 src, void *dst, u32 len);
|
BOOL readEEPROM( u32 src, void *dst, u32 len);
|
||||||
BOOL writeEEPROM( u32 dst, const void *src, 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
|
// 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 >= sizeof(VCK_SlotHeader) + sizeof(VCK_ProfileSlotBody));
|
||||||
//NN_COMPILER_ASSERT(VCK_BACKUP_READ_SIZE % 32 == 0);
|
//NN_COMPILER_ASSERT(VCK_BACKUP_READ_SIZE % 32 == 0);
|
||||||
|
|
||||||
|
// ヘッダのチェックサムをチェックサムに変換する
|
||||||
|
static u16 VCK_HeaderChecksumToChecksum( VCK_SlotHeader* header);
|
||||||
// checksum を算出する
|
// checksum を算出する
|
||||||
static u16 getChecksum( void* data);
|
static u16 getChecksum( void* data);
|
||||||
// データが工場出荷状態か破壊されていれば TRUE を返す
|
// データが工場出荷状態か破壊されていれば TRUE を返す
|
||||||
@ -53,8 +55,8 @@ TitleID_num;
|
|||||||
BOOL checkVCK( TitleProperty* tp)
|
BOOL checkVCK( TitleProperty* tp)
|
||||||
{
|
{
|
||||||
u32 i;
|
u32 i;
|
||||||
u16 tick;
|
|
||||||
u32 *data;
|
u32 *data;
|
||||||
|
u32 *verify_data;
|
||||||
VCK_SlotHeader *header;
|
VCK_SlotHeader *header;
|
||||||
VCK_ProfileSlotBody *body;
|
VCK_ProfileSlotBody *body;
|
||||||
u8 *body_u8;
|
u8 *body_u8;
|
||||||
@ -69,7 +71,9 @@ BOOL checkVCK( TitleProperty* tp)
|
|||||||
|
|
||||||
// EEPROM から読み出し
|
// EEPROM から読み出し
|
||||||
data = (u32*)(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 + VCK_BACKUP_READ_SIZE);
|
||||||
OS_TPrintf("Buffer:0x%x\n", data);
|
OS_TPrintf("Buffer:0x%x\n", data);
|
||||||
|
OS_TPrintf("verifyBuffer:0x%x\n", verify_data);
|
||||||
|
|
||||||
InitializeBackup();
|
InitializeBackup();
|
||||||
readEEPROM( 0, (u32*)data, VCK_BACKUP_READ_SIZE);//sizeof(VCK_SlotHeader) + sizeof(VCK_ProfileSlotBody)が32Bytesの倍数でないため
|
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箇所へ書き込み
|
// checksumがBになるようにランダムな1箇所へ書き込み
|
||||||
tick = OS_GetTickLo();
|
|
||||||
#if 1
|
|
||||||
{
|
{
|
||||||
MATH_CalcSHA1( calculatedSha1, (const void*)data, sizeof(VCK_ProfileSlotBody));
|
MATH_CalcSHA1( calculatedSha1, (const void*)data, sizeof(VCK_ProfileSlotBody));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
|
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
|
||||||
MATH_InitRand16( &rc16, rseed);
|
MATH_InitRand16( &rc16, rseed);
|
||||||
for( i=0; i<sizeof(VCK_ProfileSlotBody); i++)
|
for( i=0; i<sizeof(VCK_ProfileSlotBody); i++)
|
||||||
@ -112,7 +113,7 @@ BOOL checkVCK( TitleProperty* tp)
|
|||||||
B_checksum = getChecksum( body);
|
B_checksum = getChecksum( body);
|
||||||
// 書き込んだ後の checksum が、S_checksum でも マジコンヘッダのchecksum にもならないようにする
|
// 書き込んだ後の checksum が、S_checksum でも マジコンヘッダのchecksum にもならないようにする
|
||||||
while( (B_checksum == S_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];
|
B_checksum -= body_u8[sizeof(VCK_ProfileSlotBody) - 1];
|
||||||
body_u8[sizeof(VCK_ProfileSlotBody) - 1]++;
|
body_u8[sizeof(VCK_ProfileSlotBody) - 1]++;
|
||||||
@ -120,22 +121,28 @@ BOOL checkVCK( TitleProperty* tp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Backup デバイスへ反映
|
// 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("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();
|
FinalizeBackup();
|
||||||
MI_FreeWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9);
|
MI_FreeWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
OS_TPrintf("launch NG.\n");
|
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();
|
FinalizeBackup();
|
||||||
MI_FreeWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9);
|
MI_FreeWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ヘッダのチェックサムをチェックサムに変換する
|
||||||
|
static u16 VCK_HeaderChecksumToChecksum( VCK_SlotHeader* header)
|
||||||
|
{
|
||||||
|
return (u16)(0xFFFF - (header->m_uniqueIdentifier) - (header->m_slotCheckSum));
|
||||||
|
}
|
||||||
|
|
||||||
// checksum を算出する
|
// checksum を算出する
|
||||||
static u16 getChecksum( void* data)
|
static u16 getChecksum( void* data)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -50,17 +50,20 @@ BOOL checkVCW( TitleProperty* tp, u32 ggid)
|
|||||||
#pragma unused( tp)
|
#pragma unused( tp)
|
||||||
u32 i;
|
u32 i;
|
||||||
u32 *data;
|
u32 *data;
|
||||||
|
u32 *verify_data;
|
||||||
u8 *buf;
|
u8 *buf;
|
||||||
u16 B_checksum[2];
|
u16 B_checksum[2];
|
||||||
VCW vcw[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));
|
OS_TPrintf( "header size:0x%x, body size:0x%x\n", sizeof(VCW_SavegameHeader), sizeof(VCW_BodyForCheck));
|
||||||
|
|
||||||
// EEPROM から読み出し
|
// EEPROM から読み出し
|
||||||
// base = MI_AllocWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9);
|
// 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));
|
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("Buffer:0x%x\n", data);
|
||||||
|
OS_TPrintf("verifyBuffer:0x%x\n", verify_data);
|
||||||
|
|
||||||
InitializeBackup();
|
InitializeBackup();
|
||||||
readEEPROM( 0, (u32*)data, VCW_BACKUP_READ_SIZE);
|
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]))
|
if( VCW_IsModified( &vcw[0]) || VCW_IsModified( &vcw[1]))
|
||||||
{
|
{
|
||||||
OS_TPrintf( "backup write testing..\n");
|
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");
|
OS_TPrintf("launch NG!\n");
|
||||||
VCW_Finalize( &vcw[0]);
|
VCW_Finalize( &vcw[0]);
|
||||||
@ -183,7 +186,6 @@ static u16 VCW_Modify( VCW* vcw)
|
|||||||
{
|
{
|
||||||
u16 S_checksum_tmp;
|
u16 S_checksum_tmp;
|
||||||
u32 i;
|
u32 i;
|
||||||
u16 tick;
|
|
||||||
u8* body_u8 = (u8*)(vcw->body);
|
u8* body_u8 = (u8*)(vcw->body);
|
||||||
u32 calculatedSha1[ MATH_SHA1_DIGEST_SIZE /sizeof(u32)];
|
u32 calculatedSha1[ MATH_SHA1_DIGEST_SIZE /sizeof(u32)];
|
||||||
MATHRandContext16 rc16;
|
MATHRandContext16 rc16;
|
||||||
@ -192,12 +194,9 @@ static u16 VCW_Modify( VCW* vcw)
|
|||||||
S_checksum_tmp = VCW_GetChecksum( vcw);
|
S_checksum_tmp = VCW_GetChecksum( vcw);
|
||||||
|
|
||||||
// checksumがBになるようにランダムな1箇所へ書き込み
|
// checksumがBになるようにランダムな1箇所へ書き込み
|
||||||
tick = OS_GetTickLo();
|
|
||||||
#if 1
|
|
||||||
{
|
{
|
||||||
MATH_CalcSHA1( calculatedSha1, (const void*)vcw->body, sizeof(VCW_BodyForCheck));
|
MATH_CalcSHA1( calculatedSha1, (const void*)vcw->body, sizeof(VCW_BodyForCheck));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
|
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
|
||||||
MATH_InitRand16( &rc16, rseed);
|
MATH_InitRand16( &rc16, rseed);
|
||||||
for( i=0; i<sizeof(VCW_BodyForCheck); i++)
|
for( i=0; i<sizeof(VCW_BodyForCheck); i++)
|
||||||
@ -214,7 +213,7 @@ static u16 VCW_Modify( VCW* vcw)
|
|||||||
body_u8[sizeof(VCW_BodyForCheck) - 1]++;
|
body_u8[sizeof(VCW_BodyForCheck) - 1]++;
|
||||||
vcw->B_checksum += 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,
|
S_checksum_tmp,
|
||||||
VCW_HeaderChecksumToChecksum( vcw),
|
VCW_HeaderChecksumToChecksum( vcw),
|
||||||
vcw->B_checksum);
|
vcw->B_checksum);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user