mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・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:
parent
2e49f54eb1
commit
1fc7b62c89
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -150,5 +150,5 @@ RomSpec
|
||||
File NTR_IPL_font_m.NFTR
|
||||
HostRoot ../../../../keys/HWInfo
|
||||
Root /key
|
||||
File privKeyHWInfo.der
|
||||
# File privKeyHWInfo.der
|
||||
}
|
||||
|
||||
@ -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.
BIN
doc/鍵管理.xls
BIN
doc/鍵管理.xls
Binary file not shown.
Loading…
Reference in New Issue
Block a user