・THW_ReadSecureInfo内の署名チェックを開発用本体時に行わないように変更。(CPUボンディングオプションチェック)

・HWInfoWriterでのSecureHW情報ライト時に、MACアドレスをもとにした仮シリアルNo.をセットするよう変更。
・ドキュメント更新。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@397 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-12-25 08:16:43 +00:00
parent 2e49f54eb1
commit 1fc7b62c89
6 changed files with 72 additions and 26 deletions

View File

@ -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;
}
}
}

View File

@ -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標準言語以外の時、NSD側のlanguageは強制ENGLISHNCDEx側にちゃんとした値が入る
// TSD側がNTR標準言語以外の中国・韓国語の時、NSD側のlanguageは強制ENGLISHNCDEx側にちゃんとした値が入る
NSD_SetLanguage ( NTR_LANG_ENGLISH );
NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() );
}else {

View File

@ -150,5 +150,5 @@ RomSpec
File NTR_IPL_font_m.NFTR
HostRoot ../../../../keys/HWInfo
Root /key
File privKeyHWInfo.der
# File privKeyHWInfo.der
}

View File

@ -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 ) ) {

Binary file not shown.