diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile index 29811cef..8bc9789f 100644 --- a/build/systemMenu_RED/Launcher/ARM9/Makefile +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -56,7 +56,9 @@ SRCS = main.c launcher.c sound.c bannerCounter.c loadWlanFirm.c \ $(BG_DIR)/BGData_Launcher.c LINCLUDES = $(MISC_DIR)/include \ - $(SRCDIR)/$(LOGO_DIR) + $(SRCDIR)/$(LOGO_DIR) \ + $(TWLSDK_ROOT)/build/libraries/wm/common.TWL/inc \ + $(TWLSDK_ROOT)/build/libraries/wm/ARM9.TWL/nwm/inc LLIBRARIES += libes$(TWL_LIBSUFFIX).a \ libboc$(TWL_LIBSUFFIX).a \ diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c index 8f28aadc..0b0919b8 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadWlanFirm.c @@ -21,6 +21,10 @@ #include #include + +#include "nwm_common_private.h" +#include "nwm_arm9_private.h" + #include "loadWlanFirm.h" /* @@ -29,19 +33,23 @@ /* LCFGの無線ファームバージョンをタイトルIDとしてそのまま使う場合 */ #define USE_LCFG_STRING 0 + /* 無線FWダウンロード処理にかかる時間を計測する。 */ #define MEASURE_WIRELESS_INITTIME 1 + /* 無線FW認証処理にかかる時間を計測する。 */ #define MEASURE_VERIFY_SIGN_TIME 1 +/* ハッシュ比較の情報を出力する。 */ +#define REPORT_HASH_COMPARISON 1 + /* Index of public key for WLAN firm */ #define WLANFIRM_PUBKEY_INDEX 1 #define SIGN_LENGTH 128 -#define FWBUFFER_SIZE 0x40000 #define SIGNHEAP_SIZE 0x01000 -#define FWHEADER_SIZE 0xE0 +#define FWHEADER_SIZE 0x100 /* internal variables @@ -64,12 +72,10 @@ static s32 ReadFirmwareHeader(char *path, u8 *buffer, s32 bufSize); static s32 ReadFirmwareBinary(char *path, u32 offset, u8 *buffer, s32 bufSize); static BOOL VerifyWlanfirmSignature(u8* buffer, u32 length); static BOOL CheckHash(const u8* hash, const u8* buffer, u32 length); +#if (REPORT_HASH_COMPARISON == 1) +static void PrintDigest(u8 *digest); +#endif -extern NWMRetCode NWMi_InstallFirmware(NWMCallbackFunc callback, void* addr, u32 size, BOOL isColdstart); - -extern u32 NWMi_GetFirmImageOffset(void* addr, u32 hwVersion); -extern u32 NWMi_GetFirmImageLength(void* addr, u32 hwVersion); -extern u8* NWMi_GetFirmImageHashAddress(void* addr, u32 hwVersion); void InstallFirmCallback(void* arg) { @@ -78,12 +84,12 @@ void InstallFirmCallback(void* arg) if (cb->retcode == NWM_RETCODE_SUCCESS) { #if (MEASURE_WIRELESS_INITTIME == 1) - OS_TPrintf("Wlan firm:LoadTime=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - startTick)); + OS_TPrintf("[Wlan Firm] LoadTime=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - startTick)); #endif - OS_TPrintf("Wlan firm:Wlan firmware has been installed successfully!\n"); + OS_TPrintf("[Wlan Firm] Wlan firmware has been installed successfully!\n"); result = WLANFIRM_RESULT_SUCCESS; } else { // in case of failure - OS_TPrintf("Wlan firm:FW download Timeout Error!\n"); + OS_TPrintf("[Wlan Firm] FW download Timeout Error!\n"); result = WLANFIRM_RESULT_FAILURE; } @@ -105,11 +111,10 @@ void InstallFirmCallback(void* arg) BOOL GetFirmwareFilepath(char *path) { - u8 title[4] = { 'W','F','W','0' }; + u8 title[4] = { 'W','L','F','W' }; #if( USE_LCFG_STRING == 0 ) - char *title0 = "WFW0"; - char *title1 = "WFW1"; + char *title0 = "WLFW"; #endif u32 titleID_hi; u32 titleID_lo; @@ -120,11 +125,6 @@ BOOL GetFirmwareFilepath(char *path) { int i; if( title[0] == 0 ) { - for( i = 0 ; i < 4 ; i++ ) { - title[i] = (u8)*title1++; - } - } - else { for( i = 0 ; i < 4 ; i++ ) { title[i] = (u8)*title0++; } @@ -133,7 +133,7 @@ BOOL GetFirmwareFilepath(char *path) #endif - titleID_hi = (( 3 /* Nintendo */ << 16) | 4 /* */ | 2 /* */ | 1 /* */); + titleID_hi = (( 3 /* Nintendo */ << 16) | 8 /* CHANNEL_DATA_ONLY */ | 4 /* CHANNEL_CARD */ | 2 /* isLaunch */ | 1 /* isSystem */); titleID_lo = ((u32)( title[0] ) & 0xff) << 24; titleID_lo |= ((u32)( title[1] )& 0xff) << 16; @@ -142,13 +142,13 @@ BOOL GetFirmwareFilepath(char *path) titleID = ((u64)(titleID_hi) << 32) | (u64)titleID_lo; - // OS_TPrintf( "titleID = 0x%08x%08x\n", titleID_hi, titleID_lo); + // OS_TPrintf( "[Wlan Firm] titleID = 0x%08x%08x\n", titleID_hi, titleID_lo); if( NAM_OK == NAM_GetTitleBootContentPathFast(path, titleID) ) { - OS_TPrintf( "File = %s\n", path); + OS_TPrintf( "[Wlan Firm] File = %s\n", path); } else { - OS_TPrintf( "Error: NAM_GetTitleBootContentPathFast titleID = 0x%08x0x%08x\n",titleID_hi, titleID_lo); + OS_TPrintf( "[Wlan Firm] Error: NAM_GetTitleBootContentPathFast titleID = 0x%08x0x%08x\n",titleID_hi, titleID_lo); return FALSE; } @@ -220,7 +220,6 @@ BOOL VerifyWlanfirmSignature(u8* buffer, u32 length) u8 signDigest[SVC_SHA1_DIGEST_SIZE]; SVCSHA1Context sctx; SVCSignHeapContext rctx; - int i; u8* signHeap; #if (MEASURE_VERIFY_SIGN_TIME == 1) OSTick vstart = OS_GetTick(); @@ -237,12 +236,10 @@ BOOL VerifyWlanfirmSignature(u8* buffer, u32 length) SVC_SHA1Update( &sctx, (const void*)txt,txtlen); SVC_SHA1GetHash( &sctx, txtDigest ); - OS_TPrintf("Wlan Firm digest: "); - for (i = 0; i < SVC_SHA1_DIGEST_SIZE; i++ ) - { - OS_TPrintf("%02X ", txtDigest[i]); - } - OS_TPrintf("\n"); +#if (REPORT_HASH_COMPARISON == 1) + OS_TPrintf("[Wlan Firm] Wlan Firm digest: "); + PrintDigest((u8*)txtDigest); +#endif /* decrypt according to RSA security */ signHeap = SYSM_Alloc( SIGNHEAP_SIZE ); @@ -252,7 +249,7 @@ BOOL VerifyWlanfirmSignature(u8* buffer, u32 length) if (FALSE == SVC_DecryptSign( &rctx, signDigest, (const void*)pSign, (const void*)pPubkey )) { - OS_TPrintf("Wlan Firmware authentication has failed.\n"); + OS_TPrintf("[Wlan Firm] Wlan Firmware authentication has failed.\n"); /* continue verifying process even though decryption fails in the case of bonding option = 0x01 (support ARM9/ARM7) */ if (!( HWi_WSYS08_OP_OP0_MASK == SCFG_ReadBondingOption() )) @@ -260,18 +257,16 @@ BOOL VerifyWlanfirmSignature(u8* buffer, u32 length) SYSM_Free(signHeap); return FALSE; } - OS_TPrintf("But installation continues.\n"); + OS_TPrintf("[Wlan Firm] But installation continues.\n"); } SYSM_Free(signHeap); - OS_TPrintf("Decrypted digest: "); - for (i = 0; i < SVC_SHA1_DIGEST_SIZE; i++ ) - { - OS_TPrintf("%02X ", signDigest[i]); - } - OS_TPrintf("\n"); - +#if (REPORT_HASH_COMPARISON == 1) + OS_TPrintf("[Wlan Firm] Decrypted digest: "); + PrintDigest((u8*)signDigest); +#endif + /* skip comparing SHA1 digests in the case of bonding option = 0x01 (support ARM9/ARM7) this restriction is for debugging TWL wireless firmware. @@ -286,7 +281,7 @@ BOOL VerifyWlanfirmSignature(u8* buffer, u32 length) } #if (MEASURE_VERIFY_SIGN_TIME == 1) - OS_TPrintf("Wlan firm:Verify signature Time=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - vstart)); + OS_TPrintf("[Wlan Firm] Verify signature Time=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - vstart)); #endif return TRUE; @@ -300,41 +295,50 @@ BOOL CheckHash(const u8* hash, const u8* buffer, u32 length) #if (MEASURE_VERIFY_SIGN_TIME == 1) OSTick vstart = OS_GetTick(); #endif - int i; - - OS_TPrintf("Digest to compare: "); - for (i = 0; i < SVC_SHA1_DIGEST_SIZE; i++ ) - { - OS_TPrintf("%02X ", hash[i]); - } - OS_TPrintf("\n"); + +#if (REPORT_HASH_COMPARISON == 1) + OS_TPrintf("[Wlan Firm] Digest to compare: "); + PrintDigest((u8*)hash); +#endif /* calculate SHA-1 digest */ SVC_SHA1Init( &sctx ); SVC_SHA1Update( &sctx, (const void*)buffer, length); SVC_SHA1GetHash( &sctx, txtDigest ); - OS_TPrintf("Calculated digest: "); - for (i = 0; i < SVC_SHA1_DIGEST_SIZE; i++ ) - { - OS_TPrintf("%02X ", txtDigest[i]); - } - OS_TPrintf("\n"); +#if (REPORT_HASH_COMPARISON == 1) + OS_TPrintf("[Wlan Firm] Calculated digest: "); + PrintDigest((u8*)txtDigest); +#endif /* verify digest */ if (FALSE == SVC_CompareSHA1( (const void*)hash, (const void*)txtDigest )) { #if (MEASURE_VERIFY_SIGN_TIME == 1) - OS_TPrintf("Wlan firm:Verify digest Time=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - vstart)); + OS_TPrintf("[Wlan Firm] Verify digest Time=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - vstart)); #endif return FALSE; } #if (MEASURE_VERIFY_SIGN_TIME == 1) - OS_TPrintf("Wlan firm:Verify digest Time=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - vstart)); + OS_TPrintf("[Wlan Firm] Verify digest Time=%dmsec\n", OS_TicksToMilliSeconds(OS_GetTick() - vstart)); #endif return TRUE; } +#if (REPORT_HASH_COMPARISON == 1) +void PrintDigest(u8 *digest) +{ + int i; + + for (i = 0; i < SVC_SHA1_DIGEST_SIZE; i++ ) + { + OS_TPrintf("%02X ", digest[i]); + } + OS_TPrintf("\n"); +} +#endif + + BOOL InstallWlanFirmware(void) { NWMRetCode err; @@ -363,70 +367,74 @@ BOOL InstallWlanFirmware(void) } else { s32 flen = 0; char path[256]; - u32 hwVersion; u32 offset, length; u8 hdrBuffer[FWHEADER_SIZE]; u8 *pHash = NULL; + u32 fwType; // ColdStart if (FALSE == GetFirmwareFilepath(path)) { goto instfirm_error; } - // TODO: get WLAN chip version - hwVersion = NWM_HW_VERSION_1_1; // tentative + // Get WLAN Firmware type + fwType = ((NWMFirmDataSegment *)NWM_PARAM_FWDATA_ADDRESS)->fwType; + OS_TPrintf("[Wlan Firm] FWtype is %d\n", fwType); + // Read header of WLAN firm flen = ReadFirmwareHeader(path, hdrBuffer, FWHEADER_SIZE); if ( 0 >= flen ) { - OS_TPrintf("Error: Couldn't read wlan firmware header.\n"); + OS_TPrintf("[Wlan Firm] Error: Couldn't read wlan firmware header.\n"); goto instfirm_error; } - /* - check signature data - */ + // Check signature data if (FALSE == VerifyWlanfirmSignature(hdrBuffer, (u32)flen)) { - OS_TPrintf("Error: This Wlan Firmware is quite illegal!\n"); - OS_TPrintf(" It has never been installed.\n"); + OS_TPrintf("[Wlan Firm] Error: This Wlan Firmware is quite illegal!\n"); + OS_TPrintf("[Wlan Firm] It has never been installed.\n"); goto instfirm_error; } - offset = NWMi_GetFirmImageOffset(hdrBuffer, hwVersion); - length = NWMi_GetFirmImageLength(hdrBuffer, hwVersion); + // Find corresponding FW image + offset = NWMi_GetFirmImageOffset(hdrBuffer, fwType); + length = NWMi_GetFirmImageLength(hdrBuffer, fwType); if (offset == 0 || length == 0) { - OS_TPrintf("Error: Couldn't get Firmware image.\n"); + OS_TPrintf("[Wlan Firm] Error: Couldn't get Firmware image.\n"); goto instfirm_error; } /* Allocate FW buffer from heap. */ pFwBuffer = SYSM_Alloc( length ); if (!pFwBuffer) { - OS_TWarning("Error: Couldn't allocate memory for WlanFirmware.\n"); + OS_TWarning("[Wlan Firm] Error: Couldn't allocate memory for WlanFirmware.\n"); goto instfirm_error; } - + + // Read FW image flen = ReadFirmwareBinary(path, offset, pFwBuffer, (s32)length); if ( 0 >= flen ) { - OS_TPrintf("Error: Couldn't read wlan firmware.\n"); + OS_TPrintf("[Wlan Firm] Error: Couldn't read wlan firmware.\n"); goto instfirm_error; } - pHash = NWMi_GetFirmImageHashAddress(hdrBuffer, hwVersion); + // Compare hashes + pHash = NWMi_GetFirmImageHashAddress(hdrBuffer, fwType); if (pHash == NULL) { - OS_TPrintf("Error: Couldn't get hash of wlan firmware image.\n"); + OS_TPrintf("[Wlan Firm] Error: Couldn't get hash of wlan firmware image.\n"); goto instfirm_error; } - + + OS_TPrintf("[Wlan Firm] Check hash of firmware image.\n"); if (FALSE == CheckHash((const u8*)pHash, (const u8*)pFwBuffer, length)) { - OS_TPrintf("Error: Hash data is illegal.\n"); + OS_TPrintf("[Wlan Firm] Error: Hash data is illegal.\n"); goto instfirm_error; } @@ -435,6 +443,8 @@ BOOL InstallWlanFirmware(void) OS_TWarning("Error: Couldn't allocate memory for NWM.\n"); goto instfirm_error; } + + // Start FW installation NWM_Init(pNwmBuf, NWM_SYSTEM_BUF_SIZE, 3); /* 3 -> DMA no. */ #if (MEASURE_WIRELESS_INITTIME == 1) diff --git a/build/systemMenu_RED/wlanfirm/Makefile b/build/systemMenu_RED/wlanfirm/Makefile index 0e46f879..1838c9c5 100644 --- a/build/systemMenu_RED/wlanfirm/Makefile +++ b/build/systemMenu_RED/wlanfirm/Makefile @@ -16,13 +16,41 @@ # $Author: #---------------------------------------------------------------------------- -SUBMAKES = Makefile0 Makefile1 +TARGET_FIRM = SYSTEMMENU + +override TARGET_PLATFORM := TWL +override TARGET_CODEGEN := ARM +override TWL_ARCHGEN := LIMITED include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs +MY_FIRM_ROOT = $(TWLWIRELESS_ROOT)/binfile + +MY_FIRM_ROOT_CYG = $(call eupath,$(MY_FIRM_ROOT)) + + +MY_TITLE = WLFW +MY_FIRM = $(MY_FIRM_ROOT_CYG)/nwm_firm.bin + +#---------------------------------------------------------------------------- +MY_SRL = $(MY_TITLE).srl +MY_TAD = $(MY_TITLE).tad +ATTACH_HEADER_COMMAND = $(SYSMENU_TOOLSDIR)/bin/attach_dummyromheader.exe + +INSTALL_TARGETS = $(MY_TAD) +INSTALL_DIR = $(ROOT)/build/tools/TwlNMenu/data + +LDIRT_CLEAN = $(MY_SRL) $(MY_TAD) #---------------------------------------------------------------------------- include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules +do-build : $(MY_TAD) + +$(MY_SRL): $(MY_FIRM) + $(ATTACH_HEADER_COMMAND) -s -l -i $(call empath,$<) -c $(MY_TITLE) -o $@ + +$(MY_TAD): $(MY_SRL) + $(MAKETAD) -s $< $(MAKETAD_FLAGS) -o $@ #===== End of Makefile ===== diff --git a/build/systemMenu_RED/wlanfirm/Makefile0 b/build/systemMenu_RED/wlanfirm/Makefile0 deleted file mode 100644 index d8ef9c28..00000000 --- a/build/systemMenu_RED/wlanfirm/Makefile0 +++ /dev/null @@ -1,56 +0,0 @@ -#! make -f -#---------------------------------------------------------------------------- -# Project: TwlIPL -# File: Makefile - -# -# Copyright 2007 Nintendo. All rights reserved. -# -# These coded instructions, statements, and computer programs contain -# proprietary information of Nintendo of America Inc. and/or Nintendo -# Company Ltd., and are protected by Federal copyright law. They may -# not be disclosed to third parties or copied or duplicated in any form, -# in whole or in part, without the prior written consent of Nintendo. -# -# $Date:: -# $Rev: -# $Author: -#---------------------------------------------------------------------------- - -TARGET_FIRM = SYSTEMMENU - -override TARGET_PLATFORM := TWL -override TARGET_CODEGEN := ARM -override TWL_ARCHGEN := LIMITED - -include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs -MY_FIRM_ROOT = $(TWLWIRELESS_ROOT)/binfile - -MY_FIRM_ROOT_CYG = $(call eupath,$(MY_FIRM_ROOT)) - - -MY_TITLE = WFW0 -MY_FIRM = $(MY_FIRM_ROOT_CYG)/nwm_firm.bin - -#---------------------------------------------------------------------------- -MY_SRL = $(MY_TITLE).srl -MY_TAD = $(MY_TITLE).tad -ATTACH_HEADER_COMMAND = $(SYSMENU_TOOLSDIR)/bin/attach_dummyromheader.exe - -INSTALL_TARGETS = $(MY_TAD) -INSTALL_DIR = $(ROOT)/build/tools/TwlNMenu/data - -LDIRT_CLEAN = $(MY_SRL) $(MY_TAD) - -#---------------------------------------------------------------------------- - -include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules - -do-build : $(MY_TAD) - -$(MY_SRL): $(MY_FIRM) - $(ATTACH_HEADER_COMMAND) -s -l -i $(call empath,$<) -c $(MY_TITLE) -o $@ - -$(MY_TAD): $(MY_SRL) - $(MAKETAD) -s $< $(MAKETAD_FLAGS) -o $@ - -#===== End of Makefile ===== diff --git a/build/systemMenu_RED/wlanfirm/Makefile1 b/build/systemMenu_RED/wlanfirm/Makefile1 deleted file mode 100644 index e8ce121c..00000000 --- a/build/systemMenu_RED/wlanfirm/Makefile1 +++ /dev/null @@ -1,52 +0,0 @@ -#! make -f -#---------------------------------------------------------------------------- -# Project: TwlIPL -# File: Makefile - -# -# Copyright 2007 Nintendo. All rights reserved. -# -# These coded instructions, statements, and computer programs contain -# proprietary information of Nintendo of America Inc. and/or Nintendo -# Company Ltd., and are protected by Federal copyright law. They may -# not be disclosed to third parties or copied or duplicated in any form, -# in whole or in part, without the prior written consent of Nintendo. -# -# $Date:: -# $Rev: -# $Author: -#---------------------------------------------------------------------------- - -TARGET_FIRM = SYSTEMMENU - -override TARGET_PLATFORM := TWL -override TARGET_CODEGEN := ARM -override TWL_ARCHGEN := LIMITED - -include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs -MY_FIRM_ROOT = $(TWLWIRELESS_ROOT)/binfile -MY_FIRM_ROOT_CYG = $(call eupath,$(MY_FIRM_ROOT)) -MY_TITLE = WFW1 -MY_FIRM = $(MY_FIRM_ROOT_CYG)/nwm_firm.bin -#---------------------------------------------------------------------------- -MY_SRL = $(MY_TITLE).srl -MY_TAD = $(MY_TITLE).tad -ATTACH_HEADER_COMMAND = $(SYSMENU_TOOLSDIR)/bin/attach_dummyromheader.exe - -INSTALL_TARGETS = $(MY_TAD) -INSTALL_DIR = $(ROOT)/build/tools/TwlNMenu/data - -LDIRT_CLEAN = $(MY_SRL) $(MY_TAD) - -#---------------------------------------------------------------------------- - -include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules - -do-build : $(MY_TAD) - -$(MY_SRL): $(MY_FIRM) - $(ATTACH_HEADER_COMMAND) -s -l -i $(call empath,$<) -c $(MY_TITLE) -o $@ - -$(MY_TAD): $(MY_SRL) - $(MAKETAD) -s $< $(MAKETAD_FLAGS) -o $@ - -#===== End of Makefile =====