・FW typeの読み出しを追加。

・titleID変更への対応。
・無線ファームのファイル名をWLFWに変更。
 それに伴い、WFW0、WFW1を作っていたMakefileを削除。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@914 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
sato_masaki 2008-03-20 07:24:41 +00:00
parent a99952e807
commit 706b2c4217
5 changed files with 116 additions and 184 deletions

View File

@ -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 \

View File

@ -21,6 +21,10 @@
#include <firm.h>
#include <sysmenu.h>
#include "nwm_common_private.h"
#include "nwm_arm9_private.h"
#include "loadWlanFirm.h"
/*
@ -29,19 +33,23 @@
/* LCFGの無線ファームバージョンをタイトルとしてそのまま使う場合 */
#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)

View File

@ -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 =====

View File

@ -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 =====

View File

@ -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 =====