From 80ea5b96a37d34096d876d4b7bc45d4059df8d9d Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Mon, 7 Apr 2008 01:43:36 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=A9=E3=83=B3=E3=83=81=E3=83=A3=E3=83=BC?= =?UTF-8?q?=EF=BC=9A=E8=B5=B7=E5=8B=95=E3=81=99=E3=82=8BROM=E3=81=AEAES?= =?UTF-8?q?=E6=9A=97=E5=8F=B7=E5=8C=96=E9=A0=98=E5=9F=9F=E5=BE=A9=E5=8F=B7?= =?UTF-8?q?=E3=81=AE=E5=87=A6=E7=90=86=E8=BF=BD=E5=8A=A0=E9=80=94=E4=B8=AD?= =?UTF-8?q?=E7=B5=8C=E9=81=8E=EF=BC=88=E5=A4=9A=E5=88=86=E3=81=BE=E3=81=A0?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=81=97=E3=81=AA=E3=81=84=E3=81=AF=E3=81=9A?= =?UTF-8?q?=EF=BC=89?= 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@1069 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/components/hyena.TWL/Makefile | 3 +- build/components/hyena.TWL/hyena.lsf | 1 + build/components/hyena.TWL/src/main.c | 1 - .../sysmenu/common/src/decodeAES.c | 121 ++++++++++++++++-- .../sysmenu/common/src/pxi.c | 1 + include/sysmenu/sysmenu_lib/common/pxi.h | 1 + .../sysmenu/sysmenu_lib/common/sysmenu_api.h | 6 +- .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 3 + 8 files changed, 121 insertions(+), 16 deletions(-) diff --git a/build/components/hyena.TWL/Makefile b/build/components/hyena.TWL/Makefile index 5450ef39..93a17739 100644 --- a/build/components/hyena.TWL/Makefile +++ b/build/components/hyena.TWL/Makefile @@ -77,7 +77,8 @@ INSTALL_DIR = $(TWL_INSTALL_COMPONENTSDIR)/$(TARGET_NAME)/$(TWL_BUILDTYPE) LINCLUDES = $(ROOT)/build/libraries/spi/ARM7/include \ $(ROOT)/build/libraries/spi/ARM7/pm/include \ $(SYSMENU_ROOT)/build/libraries_sysmenu/sysmenu/common/include -LLIBRARIES += libwl_sp.TWL.LTD.a +LLIBRARIES += libwl_sp.TWL.LTD.a \ + libaes_sp.firm.LTD.a LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES) do-build: $(TARGETS) diff --git a/build/components/hyena.TWL/hyena.lsf b/build/components/hyena.TWL/hyena.lsf index fd64211e..e6272713 100644 --- a/build/components/hyena.TWL/hyena.lsf +++ b/build/components/hyena.TWL/hyena.lsf @@ -62,6 +62,7 @@ Autoload WRAM libreloc_info_sp$(LIBSUFFIX).a \ libsysmenu_sp$(LIBSUFFIX).a \ libsysmmcu_sp$(LIBSUFFIX).a \ + libaes_sp.firm.LTD.a Library libsdio_sp$(LIBSUFFIX).a diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index 868ed008..3f9207cd 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -240,7 +240,6 @@ TwlSpMain(void) { OS_ResetSystem(); } - SYSM_WaitDecodeAESRegion(); BOOT_WaitStart(); } } diff --git a/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c b/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c index 9e7b28f0..c91c0db0 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c +++ b/build/libraries_sysmenu/sysmenu/common/src/decodeAES.c @@ -17,17 +17,19 @@ #include #include +#include // define data----------------------------------------------------------------- // extern data----------------------------------------------------------------- // function's prototype------------------------------------------------------- // global variable------------------------------------------------------------- // static variable------------------------------------------------------------- +static BOOL s_finished = FALSE; // const data------------------------------------------------------------------ #ifdef SDK_ARM9 -void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs ) +void SYSM_StartDecryptAESRegion( ROM_Header_Short *hs ) { void *region_addr[2]; u32 region_size[2]; @@ -40,6 +42,7 @@ void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs ) // AES有効? if( !hs->enable_aes ) { + OS_TPrintf( "SYSM_StartDecryptAESRegion:AES disabled.\n" ); return; } @@ -65,7 +68,7 @@ void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs ) } } - // デコード情報算出&格納処理 + // デクリプト情報算出&格納処理 region_offset[0] = hs->aes_target_rom_offset; region_offset[1] = hs->aes_target2_rom_offset; region_size[0] = hs->aes_target_size; @@ -74,7 +77,7 @@ void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs ) SYSMi_GetWork()->addr_AESregion[1] = NULL; for( m=0; m<2; m++ ) { - // デコードする暗号化領域の判定とオフセット計算(ARM9flx, ARM9ltd, ARM7flx, ARM7ltdのどれか) + // デクリプトする暗号化領域の判定とオフセット計算(ARM9flx, ARM9ltd, ARM7flx, ARM7ltdのどれか) region_addr[m] = NULL; if( region_size[m] == 0 ) { @@ -105,25 +108,121 @@ void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs ) if(region_addr[0] == NULL && region_addr[1] == NULL) { // ターゲット1も2も存在しないor設定オフセットがおかしい + OS_TPrintf( "SYSM_StartDecryptAESRegion:No targets.\n" ); return; } // Workに開発/製品情報を格納 SYSMi_GetWork()->isDeveloperAESMode = ( hs->developer_encrypt ? TRUE : FALSE ); - // [TODO:]ARM7に開始通知 - // [TODO:]ARM7からの完了通知を受け取って完了 + // Workに「鍵」or「シードとゲームコード」をセット + if( hs->developer_encrypt ) + { + MI_CpuCopy8( hs->title_name, SYSMi_GetWork()->keyAES, AES_KEY_SIZE ); + }else + { + MI_CpuCopy8( hs->main_ltd_static_digest, SYSMi_GetWork()->seedAES, AES_KEY_SIZE ); + MI_CpuCopy8( hs->game_code, SYSMi_GetWork()->idAES, GAME_CODE_MAX ); + } + + // ARM7に開始通知 + s_finished = FALSE; + while( PXI_SendWordByFifo(PXI_FIFO_TAG_DECRYPTAES, 0, FALSE) != PXI_FIFO_SUCCESS ) + { + OS_TPrintf( "SYSM_StartDecryptAESRegion:ARM9 PXI send error.\n" ); + } + + // ARM7からの完了通知を受け取って完了 + while( !s_finished ) + { + OS_WaitAnyIrq(); + } + + OS_TPrintf( "SYSM_StartDecryptAESRegion:AES decryption succeed.\n" ); } #else //SDK_ARM7 -void SYSM_WaitDecodeAESRegion( void ) +#include +#include +#include + +static BOOL aesFlag; +static AESCounter aesCounter; + +#define DMA_SEND 2 +#define DMA_RECV 3 +static void ReplaceWithAes( void* ptr, u32 size ) { - // [TODO:]ARM9からの通知を受け取ったら開始 - // [TODO:]開発なら鍵セット、製品ならシードとIDセット - // [TODO:]鍵ロードして暗号化領域の復号開始 - // [TODO:]一応、暗号化領域のキャッシュをフラッシュ - // [TODO:]ARM9に完了通知 + AES_Lock(); + AES_Reset(); + AES_Reset(); + AES_WaitKey(); + AES_LoadKey( AES_KEY_SLOT_A ); + AES_WaitKey(); + AES_DmaSend( DMA_SEND, ptr, size, NULL, NULL ); + AES_DmaRecv( DMA_RECV, ptr, size, NULL, NULL ); + AES_SetCounter( &aesCounter ); + AES_Run( AES_MODE_CTR, 0, size / AES_BLOCK_SIZE, NULL, NULL ); + AES_AddToCounter( &aesCounter, size / AES_BLOCK_SIZE ); + MI_WaitNDma( DMA_RECV ); + AES_Unlock(); } #endif //ifdef SDK_ARM9 + +static void SYSMi_CallbackDecryptAESRegion(PXIFifoTag tag, u32 data, BOOL err) +{ +#pragma unused(tag) +#pragma unused(data) +#pragma unused(err) + +#ifdef SDK_ARM9 + s_finished = TRUE; +#else //SDK_ARM7 + int l; + + // 製品ならIDセット + if ( !SYSMi_GetWork()->isDeveloperAESMode ) + { + AESi_InitKeysForApp( SYSMi_GetWork()->idAES ); + } + + // 開発なら鍵セット、製品ならシードセット + AES_Lock(); + AES_WaitKey(); + if ( SYSMi_GetWork()->isDeveloperAESMode ) + { + AES_SetKeyA( (AESKey*)SYSMi_GetWork()->keyAES ); + } + else + { + AES_SetKeySeedA( (AESKeySeed*)SYSMi_GetWork()->seedAES ); + } + AES_Unlock(); + + for( l=0; l<2; l++ ) + { + if( SYSMi_GetWork()->addr_AESregion[l]==NULL ) + { + OS_TPrintf( "SYSM_StartDecryptAESRegion:Region %d skip.\n", l ); + continue; + } + // 鍵ロードして暗号化領域の復号開始 + ReplaceWithAes( SYSMi_GetWork()->addr_AESregion[l], SYSMi_GetWork()->size_AESregion[l] ); + // DMA転送なのでキャッシュケアは不要のはず……AES_DmaSendとRecvの仕様を要確認 + } + + // ARM9に完了通知 + while( PXI_SendWordByFifo(PXI_FIFO_TAG_DECRYPTAES, 0, FALSE) != PXI_FIFO_SUCCESS ) + { + OS_TPrintf( "SYSM_StartDecryptAESRegion:ARM7 PXI send error.\n" ); + } + +#endif //ifdef SDK_ARM9 +} + +void SYSM_InitDecryptAESPXICallback( void ) +{ + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_DECRYPTAES, SYSMi_CallbackDecryptAESRegion); +} \ No newline at end of file diff --git a/build/libraries_sysmenu/sysmenu/common/src/pxi.c b/build/libraries_sysmenu/sysmenu/common/src/pxi.c index 437d1734..5a89e38a 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/pxi.c +++ b/build/libraries_sysmenu/sysmenu/common/src/pxi.c @@ -87,6 +87,7 @@ void SYSM_InitPXI( u32 mcu_prio ) } #endif // SDK_ARM9 PXI_SetFifoRecvCallback( SYSMENU_PXI_FIFO_TAG, SYSMi_PXIFifoRecvCallback ); + SYSM_InitDecryptAESPXICallback(); } // PXIコマンド送信 diff --git a/include/sysmenu/sysmenu_lib/common/pxi.h b/include/sysmenu/sysmenu_lib/common/pxi.h index c7606145..cef4d8c5 100644 --- a/include/sysmenu/sysmenu_lib/common/pxi.h +++ b/include/sysmenu/sysmenu_lib/common/pxi.h @@ -30,6 +30,7 @@ extern "C" { #define SYSMENU_PXI_FIFO_TAG (PXI_MAX_FIFO_TAG - 1) #define PXI_FIFO_TAG_MCUTEST (PXI_MAX_FIFO_TAG - 2) #define PXI_FIFO_TAG_HOTSW (PXI_MAX_FIFO_TAG - 3) +#define PXI_FIFO_TAG_DECRYPTAES (PXI_MAX_FIFO_TAG - 4) typedef enum SYSMPXICommand { SYSM_PXI_COMM_BL_BRIGHT = 0, diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h index 5f8df2d8..77af7dd7 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h @@ -100,7 +100,7 @@ extern BOOL SYSM_IsAuthenticateTitleFinished( void ); // SYSM_StartAuthent extern AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitleList ); // pBootTitleで指定したタイトルをブート // 成功時は、never return. -extern void SYSM_StartDecodeAESRegion( ROM_Header_Short *hs ); // 起動するROMのAES暗号化領域のデコード開始 +extern void SYSM_StartDecryptAESRegion( ROM_Header_Short *hs ); // 起動するROMのAES暗号化領域のデクリプト開始 // デバイス制御 extern void SYSM_CaribrateTP( void ); // タッチパネルキャリブレーション @@ -136,8 +136,8 @@ extern BOOL SYSM_IsRunOnDebugger( void ); // IS extern BOOL SYSM_IsLauncherHidden( void ); // ランチャーの画面を表示しないバージョンか? -// AES領域デコード -extern void SYSM_WaitDecodeAESRegion( void ); // ARM9からROMのAES暗号化領域のデコード開始要求を受け、デコード開始 +// AES領域デクリプト +extern void SYSM_InitDecryptAESPXICallback( void ); // AES領域デクリプト用のPXIコールバック設定 #ifdef __cplusplus } diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 415b22b6..cc908dcb 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -123,6 +123,9 @@ typedef struct SYSM_work { BOOL isDeveloperAESMode; // 開発用セキュリティか?(製品版でFALSE) void *addr_AESregion[2]; // AES暗号化領域の格納アドレス u32 size_AESregion[2]; // AES暗号化領域のサイズ + u8 keyAES[AES_KEY_SIZE]; // 開発版AES暗号化領域の復号に使用するKEY(に使うタイトルネーム) + u8 idAES[GAME_CODE_MAX]; // 製品版AES暗号化領域の復号に使用するID(に使うゲームコード) + u8 seedAES[AES_KEY_SIZE]; // 製品版AES暗号化領域の復号に使用するSEED // NTR-IPL2のレガシー 最終的には消すと思う BOOL enableCardNormalOnly;