diff --git a/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c b/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c index 3695441d..af1ccc9f 100644 --- a/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c +++ b/build/libraries_sysmenu/settings/ARM9/src/TWLHWInfo.c @@ -23,6 +23,7 @@ //#define USE_SHA1_SIGNATURE // 署名内のハッシュにSHA1を使用(未定義ならHMAC-SHA1を使用) // function's prototype------------------------------------------------- +static BOOL THWi_CalcSignature( void *pDstSign, const void *pSrc, u32 len, const u8 *pPrivKeyDER ); static BOOL THWi_CheckDigest( void *pTgt, u32 length, u8 *pDigest ); static BOOL THWi_CheckNormalInfoValue( const TWLHWNormalInfo *pSrcInfo ); static BOOL THWi_CheckSignature( void *pTgt, u32 length, u8 *pSignature ); @@ -30,6 +31,11 @@ static BOOL THWi_CheckSecureInfoValue( const TWLHWSecureInfo *pSecure ); static void DEBUG_PrintDigest( u8 *pDigest ); static void DEBUG_Dump( u8 *pSrc, u32 len ); +static inline u16 SCFG_GetBondingOption(void) +{ + return (u16)(*(u8*)(HW_SYS_CONF_BUF+HWi_WSYS08_OFFSET) & HWi_WSYS08_OP_OPT_MASK); +} + // static variables----------------------------------------------------- TWLHWNormalInfo s_hwInfoN ATTRIBUTE_ALIGN(32); TWLHWSecureInfo s_hwInfoS ATTRIBUTE_ALIGN(32); @@ -237,30 +243,17 @@ BOOL THW_WriteSecureInfoDirect( const TWLHWSecureInfo *pSrcInfo, const u8 *pPriv { // ヘッダの作成 TSFHeader header; - u8 digest[ SVC_SHA1_DIGEST_SIZE ]; - u64 id = SCFG_ReadFuseData(); OSTick start = OS_GetTick(); - MI_CpuClear8( &header, sizeof(TSFHeader) ); header.version = TWL_HWINFO_SECURE_VERSION; header.bodyLength = sizeof( TWLHWSecureInfo ); -#ifdef HW_SIGNATURE_ENABLE_ - // 秘密鍵が指定されている場合のみ、署名作成 - if( pPrivKeyDER ) { -#ifdef USE_SHA1_SIGNATURE - SVC_CalcSHA1( digest, pSrcInfo, sizeof(TWLHWSecureInfo) ); -#else - SVC_CalcHMACSHA1( digest, pSrcInfo, sizeof(TWLHWSecureInfo), &id, sizeof(u64) ); -#endif - if( !ACSign_Encrypto( header.digest.rsa, - pPrivKeyDER, - digest, - SVC_SHA1_DIGEST_SIZE ) ) { - return FALSE; - } + if( !THWi_CalcSignature( (void *)header.digest.rsa, + (const void *)pSrcInfo, + sizeof(TWLHWSecureInfo), + pPrivKeyDER ) ) { + return FALSE; } -#endif // HW_SIGNATURE_ENABLE_ // ライト if( !TSF_WriteFile( (char *)TWL_HWINFO_SECURE_PATH, @@ -281,6 +274,36 @@ BOOL THW_WriteSecureInfoDirect( const TWLHWSecureInfo *pSrcInfo, const u8 *pPriv } +// 署名の算出 +static BOOL THWi_CalcSignature( void *pDstSign, const void *pSrc, u32 len, const u8 *pPrivKeyDER ) +{ +#ifdef HW_SIGNATURE_ENABLE_ + u8 digest[ SVC_SHA1_DIGEST_SIZE ]; + u8 key[ SVC_SHA1_DIGEST_SIZE ]; + u64 id = SCFG_ReadFuseData(); + + // 秘密鍵が指定されていない場合は署名なし。 + if( !pPrivKeyDER ) { + return TRUE; + } + + // 秘密鍵が指定された場合は、ボンディングオプションに関係なく署名付加を行う。 +#ifdef USE_SHA1_SIGNATURE + SVC_CalcSHA1( digest, pSrc, len ); +#else + SVC_CalcSHA1( key, &id, sizeof(u64) ); // idのSHA1ハッシュ値をキーとして使用 + SVC_CalcHMACSHA1( digest, pSrc, len, key, SVC_SHA1_DIGEST_SIZE ); +#endif + return ACSign_Encrypto( pDstSign, + pPrivKeyDER, + digest, + SVC_SHA1_DIGEST_SIZE ); +#else // HW_SIGNATURE_ENABLE_ + return TRUE; +#endif // HW_SIGNATURE_ENABLE_ +} + + // ファイルのリカバリ BOOL THW_RecoverySecureInfo( TSFReadResult err ) { @@ -295,23 +318,32 @@ static BOOL THWi_CheckSignature( void *pTgt, u32 length, u8 *pSignature ) SVCSignHeapContext acmemoryPool; u8 digest_sign[ SVC_SHA1_DIGEST_SIZE ]; u8 digest_calc[ SVC_SHA1_DIGEST_SIZE ]; + u8 key[ SVC_SHA1_DIGEST_SIZE ]; u64 id = SCFG_ReadFuseData(); OSTick start = OS_GetTick(); #ifdef USE_SHA1_SIGNATURE SVC_CalcSHA1( digest_calc, pTgt, length ); #else - SVC_CalcHMACSHA1( digest_calc, pTgt, length, (u8 *)&id, sizeof(u64) ); + SVC_CalcSHA1( key, &id, sizeof(u64) ); // idのSHA1ハッシュ値をキーとして使用 + SVC_CalcHMACSHA1( digest_calc, pTgt, length, key, SVC_SHA1_DIGEST_SIZE ); #endif SVC_InitSignHeap( &acmemoryPool, heap, 4096 ); SVC_DecryptSign( &acmemoryPool, digest_sign, pSignature, s_publicKey ); OS_TPrintf( "RSA sign decrypt time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); - // ダイジェストチェック有効かどうかで返り値を変える。 + // 署名チェック { BOOL retval = SVC_CompareSHA1( digest_sign, digest_calc ); - return ( s_isSignCheck ) ? retval : TRUE; + + // ボンディングオプションが「製品版」の時のみ署名チェック結果を返す。 + if( SCFG_GetBondingOption() == 0 ) { + return ( s_isSignCheck ) ? retval : TRUE; + }else { + OS_TPrintf( "Development Machine : signature check trough.\n" ); + return TRUE; + } } } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c b/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c index 60318a01..a6f55c46 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c @@ -131,7 +131,6 @@ BOOL SYSMi_VerifyNTRSettings( void ) NSD_IsAutoBoot() | NSD_IsBacklightOff() | NSD_IsInitialSequence() | - NSD_GetRTCLastSetYear() | NSD_GetRTCClockAdjust() ) != 0 ) { isFailed = TRUE; @@ -149,7 +148,9 @@ BOOL SYSMi_VerifyNTRSettings( void ) } // 値が一致する必要があるもの - if( NSD_GetRTCOffset() != TSD_GetRTCOffset() ) { + if( ( NSD_GetRTCLastSetYear() != TSD_GetRTCLastSetYear() ) || + ( NSD_GetRTCOffset() != TSD_GetRTCOffset() ) + ) { isFailed = TRUE; } // SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの @@ -229,7 +230,6 @@ void SYSMi_ConvertTWL2NTRSettings( void ) NSD_SetFlagAutoBoot( FALSE ); NSD_SetFlagBacklightOff( FALSE ); NSD_SetFlagInitialSequence( FALSE ); - NSD_SetRTCLastSetYear( 0 ); NSD_SetRTCClockAdjust( 0 ); // "1"であるべきもの @@ -241,6 +241,7 @@ void SYSMi_ConvertTWL2NTRSettings( void ) NSD_SetFlagNickname( TRUE ); // 値が一致する必要があるもの + NSD_SetRTCLastSetYear( TSD_GetRTCLastSetYear() ); NSD_SetRTCOffset( TSD_GetRTCOffset() ); // SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの @@ -249,7 +250,7 @@ void SYSMi_ConvertTWL2NTRSettings( void ) NSD_SetLanguage ( (NTRLangCode)TSD_GetLanguage() ); NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() ); }else if( TSD_GetLanguage() <= TWL_LANG_KOREAN ) { - // TSD側がNTR標準6言語以外の時、NSD側のlanguageは強制ENGLISH(NCDEx側にちゃんとした値が入る) + // TSD側がNTR標準6言語以外の中国・韓国語の時、NSD側のlanguageは強制ENGLISH(NCDEx側にちゃんとした値が入る) NSD_SetLanguage ( NTR_LANG_ENGLISH ); NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() ); }else { diff --git a/build/systemMenu_RED/HWInfoWriter/ARM9/main.rsf b/build/systemMenu_RED/HWInfoWriter/ARM9/main.rsf index 89412902..f9f20aeb 100644 --- a/build/systemMenu_RED/HWInfoWriter/ARM9/main.rsf +++ b/build/systemMenu_RED/HWInfoWriter/ARM9/main.rsf @@ -150,5 +150,5 @@ RomSpec File NTR_IPL_font_m.NFTR HostRoot ../../../../keys/HWInfo Root /key - File privKeyHWInfo.der +# File privKeyHWInfo.der } diff --git a/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c b/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c index 4917757c..4cec3f83 100644 --- a/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c +++ b/build/systemMenu_RED/HWInfoWriter/ARM9/src/HWInfoWriter.c @@ -361,6 +361,19 @@ static BOOL WriteHWSecureInfoFile( u8 region ) // 対応言語ビットマップのセット THW_SetValidLanguageBitmap( s_langBitmapList[ region ] ); + // [TODO:]量産工程でないとシリアルNo.は用意できないので、ここではMACアドレスをもとに適当な値をセットする。 + // シリアルNo.のセット + { + u8 buffer[ 12 ] = "SERIAL"; // 適当な文字列をMACアドレスと結合してSHA1を取り、仮SerialNoとする。 + u8 serialNo[ SVC_SHA1_DIGEST_SIZE ]; + int len = ( THW_GetRegion() == TWL_REGION_AMERICA ) ? + TWL_HWINFO_SERIALNO_LEN_AMERICA : TWL_HWINFO_SERIALNO_LEN_OTHERS; + OS_GetMacAddress( buffer + 6 ); + SVC_CalcSHA1( serialNo, buffer, sizeof(buffer) ); + MI_CpuClear8( &serialNo[ len ], sizeof(serialNo) - len ); + THW_SetSerialNo( serialNo ); + } + // ライト if( isWrite && !THW_WriteSecureInfo( s_pPrivKeyBuffer ) ) { diff --git a/doc/NAND繝輔Λ繝繧キ繝・繝槭ャ繝&繝輔か繝ォ繝繝繝ェ繝シ.vsd b/doc/NAND繝輔Λ繝繧キ繝・繝槭ャ繝&繝輔か繝ォ繝繝繝ェ繝シ.vsd index 6fd0a016..3cc96cf9 100644 Binary files a/doc/NAND繝輔Λ繝繧キ繝・繝槭ャ繝&繝輔か繝ォ繝繝繝ェ繝シ.vsd and b/doc/NAND繝輔Λ繝繧キ繝・繝槭ャ繝&繝輔か繝ォ繝繝繝ェ繝シ.vsd differ diff --git a/doc/骰オ邂。逅.xls b/doc/骰オ邂。逅.xls index b92468d0..2ae05b70 100644 Binary files a/doc/骰オ邂。逅.xls and b/doc/骰オ邂。逅.xls differ