From 4a287d0f0a85718421bca8954b45505ac2446912 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b08762b0-b915-fc4b-9d8c-17b2551a87ff> Date: Wed, 18 Jun 2008 11:51:14 +0000 Subject: [PATCH] =?UTF-8?q?=E8=A3=BD=E5=93=81=E7=89=88Key=20Table2?= =?UTF-8?q?=E3=81=AB=E6=9B=B8=E3=81=8D=E6=8F=9B=E3=81=88=E3=81=9F=E3=82=AB?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=82=A2=E3=83=97=E3=83=AA=E3=81=A7=E3=82=82?= =?UTF-8?q?=E5=8B=95=E4=BD=9C=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1655 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../hotsw/ARM7/include/blowfish.h | 2 + .../hotsw/ARM7/include/hotswTypes.h | 1 + .../hotsw/ARM7/src/blowfish.c | 79 ++++++++++++------- .../hotsw/ARM7/src/dsCardCommon.c | 22 +++--- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 2 +- 5 files changed, 68 insertions(+), 38 deletions(-) diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h b/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h index b8f0e8db..357da56e 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/blowfish.h @@ -41,6 +41,8 @@ void DecryptByBlowfish(const BLOWFISH_CTX *ctx, u32 *xl, u32 *xr); // Key Table の生成 void MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen); +// Key Table2 の生成 +void MakeBlowfishTableTWL(CardBootData *cbd, s32 keyLen, u16 bondingOp); #ifdef __cplusplus } /* extern "C" */ diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 38092ec1..e2e8483c 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -305,6 +305,7 @@ typedef struct CardBootData{ u32 *pSecure2SegBuf; BLOWFISH_CTX keyTable; + BLOWFISH_CTX keyTable2; } CardBootData; // スレッド・メッセージ関係をまとめた構造体 diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c b/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c index 7c1bd236..ea779101 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/blowfish.c @@ -31,43 +31,67 @@ void MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen) { const BLOWFISH_CTX *initTable = &HotSwBlowfishInitTableBufDS; - u32 blowfishedKey[2]; - - u8 *RomHeaderCtrlRsvB = cbd->pBootSegBuf->rh.s.ctrl_reserved_B; u32 *RomHeaderGameCode = (u32 *)cbd->pBootSegBuf->rh.s.game_code; u32 *keyBuf = cbd->keyBuf; BLOWFISH_CTX *ctx = &cbd->keyTable; - if(cbd->modeType == HOTSW_MODE1){ - MI_CpuCopyFast((void *)initTable, (void *)ctx, sizeof(BLOWFISH_CTX)); - } - else{ - keyBuf = cbd->keyBuf2; - -#define USE_LOCAL_KEYTABLE -#ifdef USE_LOCAL_KEYTABLE - MI_CpuCopyFast(&HotSwBlowfishInitTableTWL, (void *)ctx, sizeof(BLOWFISH_CTX)); - return; -#else - MI_CpuCopyFast((void *)((OSFromFirm7Buf *)HW_FIRM_FROM_FIRM_BUF)->twl_blowfish, (void *)ctx, sizeof(BLOWFISH_CTX)); -#endif - } - + MI_CpuCopyFast((void *)initTable, (void *)ctx, sizeof(BLOWFISH_CTX)); + keyBuf[0] = *RomHeaderGameCode; keyBuf[1] = *RomHeaderGameCode >> 1; keyBuf[2] = *RomHeaderGameCode << 1; InitBlowfishKeyAndTableDS(ctx, keyBuf, keyLen); - - blowfishedKey[0] = (u32)RomHeaderCtrlRsvB[0]; - blowfishedKey[1] = *(u32 *)&RomHeaderCtrlRsvB[4]; - - DecryptByBlowfish(ctx, &(blowfishedKey)[1], &(blowfishedKey)[0]); - InitBlowfishKeyAndTableDS(ctx, keyBuf, keyLen); } +/*---------------------------------------------------------------------------* + Name: MakeBlowfishTableTWL + + Description: KeyTable2の生成 + *---------------------------------------------------------------------------*/ +void MakeBlowfishTableTWL(CardBootData *cbd, s32 keyLen, u16 bondingOp) +{ + u32 *RomHeaderGameCode = (u32 *)cbd->pBootSegBuf->rh.s.game_code; + u32 *keyBuf = cbd->keyBuf2; + BLOWFISH_CTX *ctx = &cbd->keyTable2; + void *tempCTX; + + + // 製品機の場合 + if(bondingOp == SCFG_OP_PRODUCT){ + MI_CpuCopyFast((void *)((OSFromFirm7Buf *)HW_FIRM_FROM_FIRM_BUF)->twl_blowfish, (void *)ctx, sizeof(BLOWFISH_CTX)); + } + // 開発機の場合 + else{ + MI_CpuCopyFast(&HotSwBlowfishInitTableTWL, (void *)ctx, sizeof(BLOWFISH_CTX)); + + + // スタック領域がオーバーフローするから、ヒープ領域から領域を確保する。 + tempCTX = OS_AllocFromSubPrivWram( sizeof(BLOWFISH_CTX) ); + + if(tempCTX != NULL){ + ctx = tempCTX; + } + else{ + return; + } + } + + keyBuf[0] = *RomHeaderGameCode; + keyBuf[1] = *RomHeaderGameCode >> 1; + keyBuf[2] = *RomHeaderGameCode << 1; + + InitBlowfishKeyAndTableDS(ctx, keyBuf, keyLen); + + // Heapの開放 + if(bondingOp != SCFG_OP_PRODUCT){ + OS_FreeToSubPrivWram( tempCTX ); + } +} + + /*---------------------------------------------------------------------------* Name: InitBlowfishKeyAndTableDS @@ -75,9 +99,9 @@ void MakeBlowfishTableDS(CardBootData *cbd, s32 keyLen) *---------------------------------------------------------------------------*/ void InitBlowfishKeyAndTableDS(BLOWFISH_CTX *ctx, u32 *keyBufp, s32 keyLen) { - EncryptByBlowfish(ctx, &(keyBufp)[2], &(keyBufp)[1]); - EncryptByBlowfish(ctx, &(keyBufp)[1], &(keyBufp)[0]); - InitBlowfish(ctx, (u8 *)keyBufp, keyLen); + EncryptByBlowfish(ctx, &(keyBufp)[2], &(keyBufp)[1]); + EncryptByBlowfish(ctx, &(keyBufp)[1], &(keyBufp)[0]); + InitBlowfish(ctx, (u8 *)keyBufp, keyLen); } @@ -119,7 +143,6 @@ void InitBlowfish(BLOWFISH_CTX *ctx, const unsigned char *key, int keyLen) ctx->S[i][j + 1] = datar; } } - } diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c index ef3e8de7..e706548a 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/dsCardCommon.c @@ -432,8 +432,9 @@ HotSwState ReadRomEmulationInfo(SYSMRomEmuInfo *info) *---------------------------------------------------------------------------*/ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) { - GCDCmd64 cndLE; - u64 data; + GCDCmd64 cndLE; + u64 data; + BLOWFISH_CTX *ctx; // comannd0部分 switch(type){ @@ -460,8 +461,10 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) cndLE.dw |= data << HSWOP_S_VA_SHIFT; if(!HOTSWi_IsRomEmulation()){ + ctx = (cbd->modeType == HOTSW_MODE1) ? &cbd->keyTable : &cbd->keyTable2; + // コマンドの暗号化 - EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); + EncryptByBlowfish( ctx, (u32*)&cndLE.b[4], (u32*)cndLE.b ); } // MCCMD レジスタ設定 @@ -555,11 +558,12 @@ HotSwState ReadIDSecure(CardBootData *cbd) *---------------------------------------------------------------------------*/ HotSwState ReadSegSecure(CardBootData *cbd) { - u32 scrambleMask = HOTSWi_IsRomEmulation() ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); - u32 *buf = (cbd->modeType == HOTSW_MODE1) ? cbd->pSecureSegBuf : cbd->pSecure2SegBuf; - u32 loop, pc, size, interval, i, j=0, k; - u64 segNum = 4; - GCDCmd64 cndLE; + u32 scrambleMask = HOTSWi_IsRomEmulation() ? 0 : (u32)(SECURE_COMMAND_SCRAMBLE_MASK & ~CS_MASK); + u32 *buf = (cbd->modeType == HOTSW_MODE1) ? cbd->pSecureSegBuf : cbd->pSecure2SegBuf; + u32 loop, pc, size, interval, i, j=0, k; + u64 segNum = 4; + GCDCmd64 cndLE; + BLOWFISH_CTX *ctx = (cbd->modeType == HOTSW_MODE1) ? &cbd->keyTable : &cbd->keyTable2; if(cbd->cardType == DS_CARD_TYPE_1){ loop = 0x1UL; @@ -585,7 +589,7 @@ HotSwState ReadSegSecure(CardBootData *cbd) cndLE.dw |= segNum << HSWOP_S_VC_SHIFT; // コマンドの暗号化 - EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); + EncryptByBlowfish( ctx, (u32*)&cndLE.b[4], (u32*)cndLE.b ); // MCCMD レジスタ設定 HOTSWi_SetCommand(&cndLE); diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index ee153c2b..b797d7e1 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -469,7 +469,7 @@ static HotSwState LoadCardData(void) retval = (retval == HOTSW_SUCCESS) ? state : retval; // Key Table初期化 - MakeBlowfishTableDS(&s_cbData, 8); + MakeBlowfishTableTWL(&s_cbData, 8, s_bondingOp); // コマンド認証値・コマンドカウンタ初期値・PNジェネレータ初期値の生成 GenVA_VB_VD();