From fe519435fabaad92e1439244596f0410980f9fd4 Mon Sep 17 00:00:00 2001 From: kamikawa Date: Mon, 26 May 2008 04:17:40 +0000 Subject: [PATCH] =?UTF-8?q?=E3=82=B7=E3=83=AA=E3=82=A2=E3=83=AB=E7=95=AA?= =?UTF-8?q?=E5=8F=B7=E3=81=AE=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=82=92=E3=83=A2=E3=82=B8=E3=83=A5=E3=83=A9?= =?UTF-8?q?=E3=82=B910=E3=81=A7=E8=A8=88=E7=AE=97=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=E3=80=82=20?= =?UTF-8?q?=E3=83=AA=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=81=AE=E9=9A=9B=E3=81=AB=E5=8F=AF=E8=83=BD=E3=81=A7=E3=81=82?= =?UTF-8?q?=E3=82=8C=E3=81=B0EMS=EF=BC=88=E5=8F=97=E8=A8=97=E7=94=9F?= =?UTF-8?q?=E7=94=A3=EF=BC=89=E3=82=82=E5=BC=95=E3=81=8D=E7=B6=99=E3=81=90?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=E3=80=82=20small?= =?UTF-8?q?=20fix.?= 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@1518 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../HWInfoWriter/ARM9/src/hwi.c | 94 +++++++++++++------ .../SystemUpdater/ARM9.TWL/src/main.c | 2 +- 2 files changed, 64 insertions(+), 32 deletions(-) diff --git a/build/systemMenu_tools/HWInfoWriter/ARM9/src/hwi.c b/build/systemMenu_tools/HWInfoWriter/ARM9/src/hwi.c index 4343dc8f..35be896b 100644 --- a/build/systemMenu_tools/HWInfoWriter/ARM9/src/hwi.c +++ b/build/systemMenu_tools/HWInfoWriter/ARM9/src/hwi.c @@ -42,6 +42,7 @@ static void VerifyHWInfo( void ); static BOOL VerifyData( const u8 *pTgt, const u8 *pOrg, u32 len ); static BOOL ReadHWInfoFile( void ); static BOOL ReadTWLSettings( void ); +static u8 HWIi_CalcCheckCode(u8 src[8]); // global variable ------------------------------------- @@ -415,10 +416,10 @@ BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWi u8 buffer[ 12 ] = "SERIAL"; // 適当な文字列をMACアドレスと結合してSHA1を取り、仮SerialNoとする。 u8 serialNoOld[ SVC_SHA1_DIGEST_SIZE ]; u8 serialNoNew[ SVC_SHA1_DIGEST_SIZE ]; + u8 sha1_buffer[ SVC_SHA1_DIGEST_SIZE ]; int i; int len; int offset; - int old_offset; if ( region == OS_TWL_REGION_AMERICA ) { @@ -440,15 +441,6 @@ BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWi // シリアルNoの先頭が'T'でなければ不正なので仮のシリアルNo.を作成する if ( serialNoOld[0] != 'T') { - // 数字8桁 - OS_GetMacAddress( buffer + 6 ); - SVC_CalcSHA1( serialNoNew, buffer, sizeof(buffer) ); - MI_CpuClear8( &serialNoNew[len], (u32)(LCFG_TWL_HWINFO_SERIALNO_LEN_MAX - len)); - - for( i = offset; i < len-1; i++ ) { - serialNoNew[ i ] = (u8)( ( serialNoNew[ i ] % 10 ) + 0x30 ); - } - // 1バイト目はTWLの'T' serialNoNew[0] = 'T'; // 2バイト目はリージョン別ASCII @@ -459,39 +451,53 @@ BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWi serialNoNew[2] = 'N'; } - // チェックコードは暫定値0 - serialNoNew[len-1] = 0x30; + // 数字8桁 + OS_GetMacAddress( buffer + 6 ); + SVC_CalcSHA1( sha1_buffer, buffer, sizeof(buffer) ); + for( i = offset; i < len-1; i++ ) { + serialNoNew[ i ] = (u8)( ( sha1_buffer[ i ] % 10 ) + 0x30 ); + } + + // チェックコード取得 + serialNoNew[len-1] = HWIi_CalcCheckCode(&serialNoNew[offset]); // 仮シリアルNo.であることの印として14バイト目を'K'とする serialNoNew[13] = 'K'; - } // シリアルNoの先頭が'T'である場合ユニーク数字8桁はそのままで他を変更する else { - if ( old_region == OS_TWL_REGION_AMERICA ) - { - old_offset = LCFG_TWL_HWINFO_SERIALNO_UNIQUE_OFFSET_AMERICA; - } - else - { - old_offset = LCFG_TWL_HWINFO_SERIALNO_UNIQUE_OFFSET_OTHERS; - } - - // ユニーク数字をコピー - MI_CpuCopy( &serialNoOld[old_offset], &serialNoNew[offset], LCFG_TWL_HWINFO_SERIALNO_UNIQUE_LENGTH ); - // 1バイト目はTWLの'T' serialNoNew[0] = 'T'; // 2バイト目はリージョン別ASCII serialNoNew[1] = (u8)regionAsciiForSerialNo[region]; - // 米国リージョン以外は3バイト目にEMS(仮シリアルNo.なので任天堂の'N') - if ( LCFG_THW_GetRegion() != OS_TWL_REGION_AMERICA ) + // 米国リージョン以外は3バイト目にEMS + if ( region != OS_TWL_REGION_AMERICA ) { - serialNoNew[2] = 'N'; + // EMS情報が存在するなら引き継ぐ + if ( old_region != OS_TWL_REGION_AMERICA ) + { + serialNoNew[2] = serialNoOld[2]; + } + // EMS情報が存在しないため仮に任天堂の'N'とする + else + { + serialNoNew[2] = 'N'; + } } - // チェックコードは暫定値0x30 - serialNoNew[len-1] = 0x30; + + // ユニーク数字をコピー + if ( old_region == OS_TWL_REGION_AMERICA ) + { + MI_CpuCopy( &serialNoOld[LCFG_TWL_HWINFO_SERIALNO_UNIQUE_OFFSET_AMERICA], &serialNoNew[offset], LCFG_TWL_HWINFO_SERIALNO_UNIQUE_LENGTH ); + } + else + { + MI_CpuCopy( &serialNoOld[LCFG_TWL_HWINFO_SERIALNO_UNIQUE_OFFSET_OTHERS], &serialNoNew[offset], LCFG_TWL_HWINFO_SERIALNO_UNIQUE_LENGTH ); + } + + // チェックコード取得 + serialNoNew[len-1] = HWIi_CalcCheckCode(&serialNoNew[offset]); // 14バイト目は旧から新へコピー serialNoNew[13] = serialNoOld[13]; @@ -522,7 +528,6 @@ BOOL HWI_WriteHWSecureInfoFile( u8 region, const u8 *pSerialNo, BOOL isDisableWi return isWrite; } - /*---------------------------------------------------------------------------* Name: HWI_WriteHWIDSignFile @@ -615,3 +620,30 @@ BOOL HWI_DeleteHWIDSignFile( void ) return FALSE; } } + +/*---------------------------------------------------------------------------* + Name: HWIi_CalcCheckCode + + Description: シリアル番号の数字8桁のチェックコードを計算します + + Arguments: Ascii 数字文字列 + + Returns: Ascii 数字 + *---------------------------------------------------------------------------*/ +static u8 HWIi_CalcCheckCode(u8 src[8]) +{ + // モジュラス10 ウェイト3・1(M10W31) + int temp = (src[7] - '0')*3 + + (src[6] - '0')*1 + + (src[5] - '0')*3 + + (src[4] - '0')*1 + + (src[3] - '0')*3 + + (src[2] - '0')*1 + + (src[1] - '0')*3 + + (src[0] - '0')*1; + temp %= 10; + temp = 10-temp; + + return (u8)('0' + temp); +} + diff --git a/build/systemMenu_tools/SystemUpdater/ARM9.TWL/src/main.c b/build/systemMenu_tools/SystemUpdater/ARM9.TWL/src/main.c index 150b1e68..2c55f37a 100644 --- a/build/systemMenu_tools/SystemUpdater/ARM9.TWL/src/main.c +++ b/build/systemMenu_tools/SystemUpdater/ARM9.TWL/src/main.c @@ -239,7 +239,7 @@ TwlMain() { kamiFontPrintf( 0, printLine++, FONT_COLOR_RED, "NAND Format Failure!"); } - kamiFontPrintfMain( 3, 11, 8, " "); + kamiFontPrintfMain( 7, 11, 8, " "); // 全ハードウェア情報の更新 for (i=0;i