mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新者)akabane_jumpei カードデータのARM9常駐モジュール先頭2KBの暗号化領域を復号化
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@313 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
75a9423d25
commit
e6d27a1aaf
@ -29,6 +29,9 @@
|
|||||||
|
|
||||||
#define DEBUG_CARD_TYPE 1 // DS Card Type1 = 0 DS Card Type2 = 1
|
#define DEBUG_CARD_TYPE 1 // DS Card Type1 = 0 DS Card Type2 = 1
|
||||||
|
|
||||||
|
#define UNDEF_CODE 0xe7ffdeff // 未定義コード
|
||||||
|
#define ENCRYPT_DEF_SIZE 0x800 // 2KB ※ ARM9常駐モジュール先頭2KB
|
||||||
|
|
||||||
// Function prototype -------------------------------------------------------
|
// Function prototype -------------------------------------------------------
|
||||||
static BOOL IsCardExist(void);
|
static BOOL IsCardExist(void);
|
||||||
|
|
||||||
@ -49,17 +52,18 @@ static void SetMCSCR(void);
|
|||||||
static void GenVA_VB_VD(void);
|
static void GenVA_VB_VD(void);
|
||||||
static void LoadTable(void);
|
static void LoadTable(void);
|
||||||
static void ReadIDNormal(void);
|
static void ReadIDNormal(void);
|
||||||
|
static void DecryptObjectFile(void);
|
||||||
|
|
||||||
static void MIm_CardDmaCopy32(u32 dmaNo, const void *src, void *dest);
|
static void MIm_CardDmaCopy32(u32 dmaNo, const void *src, void *dest);
|
||||||
|
|
||||||
static void ShowRegisterData(void);
|
static void ShowRegisterData(void);
|
||||||
static void ShowRomHeaderData(void);
|
static void ShowRomHeaderData(void);
|
||||||
|
|
||||||
// Static Values ------------------------------------------------------------
|
// Static Values ------------------------------------------------------------
|
||||||
static u64 s_MCStack[STACK_SIZE / sizeof(u64)];
|
static char *encrypt_object_key ATTRIBUTE_ALIGN(4) = "encryObj";
|
||||||
static u64 s_MLStack[STACK_SIZE / sizeof(u64)];
|
|
||||||
|
|
||||||
|
static u64 s_MCStack[STACK_SIZE / sizeof(u64)];
|
||||||
static OSThread s_MCThread;
|
static OSThread s_MCThread;
|
||||||
static OSThread s_MLThread;
|
|
||||||
|
|
||||||
static u32 s_SecureSegBufSize, s_BootSegBufSize;
|
static u32 s_SecureSegBufSize, s_BootSegBufSize;
|
||||||
|
|
||||||
@ -128,18 +132,6 @@ void HOTSW_Init(void)
|
|||||||
// Secure Segment バッファの設定
|
// Secure Segment バッファの設定
|
||||||
HOTSW_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
|
HOTSW_SetSecureSegmentBuffer((void *)SYSM_CARD_NTR_SECURE_BUF, SECURE_AREA_SIZE );
|
||||||
|
|
||||||
// モジュールロード用スレッドの生成
|
|
||||||
/* OS_CreateThread(&s_MLThread,
|
|
||||||
StaticModuleLoadThread,
|
|
||||||
NULL,
|
|
||||||
s_MLStack + STACK_SIZE / sizeof(u64),
|
|
||||||
STACK_SIZE,
|
|
||||||
ML_THREAD_PRIO
|
|
||||||
);
|
|
||||||
|
|
||||||
// モジュールロード用スレッド起動
|
|
||||||
OS_WakeupThreadDirect(&s_MLThread);*/
|
|
||||||
|
|
||||||
// カードブート用構造体の初期化
|
// カードブート用構造体の初期化
|
||||||
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
|
MI_CpuClear32(&s_cbData, sizeof(CardBootData));
|
||||||
|
|
||||||
@ -158,6 +150,7 @@ BOOL HOTSW_Boot(void)
|
|||||||
{
|
{
|
||||||
s32 tempLockID;
|
s32 tempLockID;
|
||||||
BOOL retval = TRUE;
|
BOOL retval = TRUE;
|
||||||
|
|
||||||
OSTick start = OS_GetTick();
|
OSTick start = OS_GetTick();
|
||||||
|
|
||||||
OS_TPrintf("---------------- Card Boot Start ---------------\n");
|
OS_TPrintf("---------------- Card Boot Start ---------------\n");
|
||||||
@ -254,12 +247,17 @@ BOOL HOTSW_Boot(void)
|
|||||||
|
|
||||||
// Arm9の常駐モジュールを指定先に転送
|
// Arm9の常駐モジュールを指定先に転送
|
||||||
LoadStaticModule_Secure();
|
LoadStaticModule_Secure();
|
||||||
|
|
||||||
// ゲームモードに移行
|
// ゲームモードに移行
|
||||||
s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
|
s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
|
||||||
|
|
||||||
// ---------------------- Game Mode ----------------------
|
// ---------------------- Game Mode ----------------------
|
||||||
// ID読み込み
|
// ID読み込み
|
||||||
s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
|
s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
|
||||||
|
|
||||||
|
// ARM9常駐モジュールの先頭2KBの暗号化領域を複合化
|
||||||
|
DecryptObjectFile();
|
||||||
|
|
||||||
// 常駐モジュール残りを指定先に転送
|
// 常駐モジュール残りを指定先に転送
|
||||||
HOTSW_LoadStaticModule();
|
HOTSW_LoadStaticModule();
|
||||||
|
|
||||||
@ -442,15 +440,13 @@ static void LoadTable(void)
|
|||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
||||||
CNT1_FLD(1,0,0,0, 0,5, 0,0, 0, 0,0,0, 0));
|
CNT1_FLD(1,0,0,0, 0,5, 0,0, 0, 0,0,0, 0));
|
||||||
|
|
||||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||||
temp = reg_HOTSW_MCD1;
|
temp = reg_HOTSW_MCD1;
|
||||||
}
|
}
|
||||||
|
|
||||||
OS_TPrintf("Load Table...\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------
|
/* -----------------------------------------------------------------
|
||||||
@ -469,15 +465,83 @@ static void ReadIDNormal(void)
|
|||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 2320(必要ないけど) に)
|
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 2320(必要ないけど) に)
|
||||||
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
reg_HOTSW_MCCNT1 = (u32)((reg_HOTSW_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) |
|
||||||
CNT1_FLD(1,0,0,0, 0,7, 0,0, 0, 0,0,0, 2320));
|
CNT1_FLD(1,0,0,0, 0,7, 0,0, 0, 0,0,0, 2320));
|
||||||
|
|
||||||
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||||
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||||
s_cbData.id_nml = reg_HOTSW_MCD1;
|
s_cbData.id_nml = reg_HOTSW_MCD1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------
|
||||||
|
* DecryptObjectFile関数
|
||||||
|
*
|
||||||
|
* セキュア領域先頭2KBの暗号化領域を復号化
|
||||||
|
*
|
||||||
|
* 注:セキュアモード中、またはセキュアモード前にこの関数を呼ぶと、
|
||||||
|
* 正常にコマンドの暗号化が行えなくなります。
|
||||||
|
* ----------------------------------------------------------------- */
|
||||||
|
static u32 encDestBuf[ENCRYPT_DEF_SIZE/sizeof(u32)];
|
||||||
|
|
||||||
|
static void DecryptObjectFile(void)
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
s32 restSize;
|
||||||
|
s32 size = (s32)s_cbData.pBootSegBuf->rh.s.main_size;
|
||||||
|
u32 *pEncBuf = encDestBuf;
|
||||||
|
u32 *pEncDes = s_cbData.pSecureSegBuf;
|
||||||
|
BLOWFISH_CTX *tableBufp = &s_cbData.keyTable;
|
||||||
|
BOOL exist = TRUE;
|
||||||
|
|
||||||
|
if (size > ENCRYPT_DEF_SIZE) {
|
||||||
|
size = ENCRYPT_DEF_SIZE;
|
||||||
|
}
|
||||||
|
restSize = size;
|
||||||
|
|
||||||
|
// 読み込んだセキュア領域をバッファから一時バッファにコピー
|
||||||
|
MI_CpuCopy32(s_cbData.pSecureSegBuf, pEncBuf, (u32)size);
|
||||||
|
|
||||||
|
// セキュア領域先頭8バイトをBlowfishで複合化
|
||||||
|
DecryptByBlowfish(&s_cbData.keyTable, &(pEncBuf)[1], &(pEncBuf)[0]);
|
||||||
|
|
||||||
|
// Key Tableを変換
|
||||||
|
s_cbData.keyBuf[1] = (s_cbData.keyBuf[1] << 1);
|
||||||
|
s_cbData.keyBuf[2] = (s_cbData.keyBuf[2] >> 1);
|
||||||
|
InitBlowfishKeyAndTableDS(&s_cbData.keyTable, s_cbData.keyBuf, 8);
|
||||||
|
|
||||||
|
// もう一度セキュア領域先頭8バイトをBlowfishで複合化
|
||||||
|
DecryptByBlowfish(&s_cbData.keyTable, &(pEncBuf)[1], &(pEncBuf)[0]);
|
||||||
|
for ( i=0; i<8; i++ ){
|
||||||
|
// 先頭8バイトが複合化の結果 "encryObj" となっていたら複合化成功
|
||||||
|
if ( encrypt_object_key[i] != ((char*)pEncBuf)[i] ){
|
||||||
|
exist = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 暗号化オブジェクト有効時
|
||||||
|
if ( exist ){
|
||||||
|
u32 *bufp = pEncBuf;
|
||||||
|
|
||||||
|
OS_PutString("★ DecryptObjectFile : Success!\n");
|
||||||
|
|
||||||
|
bufp[0] = UNDEF_CODE;
|
||||||
|
bufp[1] = UNDEF_CODE;
|
||||||
|
while ((restSize -= 8) > 0) {
|
||||||
|
bufp += 2; // 復号処理
|
||||||
|
DecryptByBlowfish(tableBufp, &(bufp)[1], &(bufp)[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
OS_PutString("▼ DecryptObjectFile : Error...\n");
|
||||||
|
// CpuClearFast32(UNDEF_CODE, pEncBuf, size); // 未定義コードでクリア
|
||||||
|
}
|
||||||
|
MI_CpuCopy32(pEncBuf, pEncDes, (u32)size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------
|
/* -----------------------------------------------------------------
|
||||||
* IsCardExist関数
|
* IsCardExist関数
|
||||||
*
|
*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user