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を使用)
|
//#define USE_SHA1_SIGNATURE // 署名内のハッシュにSHA1を使用(未定義ならHMAC-SHA1を使用)
|
||||||
|
|
||||||
// function's prototype-------------------------------------------------
|
// 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_CheckDigest( void *pTgt, u32 length, u8 *pDigest );
|
||||||
static BOOL THWi_CheckNormalInfoValue( const TWLHWNormalInfo *pSrcInfo );
|
static BOOL THWi_CheckNormalInfoValue( const TWLHWNormalInfo *pSrcInfo );
|
||||||
static BOOL THWi_CheckSignature( void *pTgt, u32 length, u8 *pSignature );
|
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_PrintDigest( u8 *pDigest );
|
||||||
static void DEBUG_Dump( u8 *pSrc, u32 len );
|
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-----------------------------------------------------
|
// static variables-----------------------------------------------------
|
||||||
TWLHWNormalInfo s_hwInfoN ATTRIBUTE_ALIGN(32);
|
TWLHWNormalInfo s_hwInfoN ATTRIBUTE_ALIGN(32);
|
||||||
TWLHWSecureInfo s_hwInfoS ATTRIBUTE_ALIGN(32);
|
TWLHWSecureInfo s_hwInfoS ATTRIBUTE_ALIGN(32);
|
||||||
@ -237,30 +243,17 @@ BOOL THW_WriteSecureInfoDirect( const TWLHWSecureInfo *pSrcInfo, const u8 *pPriv
|
|||||||
{
|
{
|
||||||
// ヘッダの作成
|
// ヘッダの作成
|
||||||
TSFHeader header;
|
TSFHeader header;
|
||||||
u8 digest[ SVC_SHA1_DIGEST_SIZE ];
|
|
||||||
u64 id = SCFG_ReadFuseData();
|
|
||||||
OSTick start = OS_GetTick();
|
OSTick start = OS_GetTick();
|
||||||
|
|
||||||
MI_CpuClear8( &header, sizeof(TSFHeader) );
|
MI_CpuClear8( &header, sizeof(TSFHeader) );
|
||||||
header.version = TWL_HWINFO_SECURE_VERSION;
|
header.version = TWL_HWINFO_SECURE_VERSION;
|
||||||
header.bodyLength = sizeof( TWLHWSecureInfo );
|
header.bodyLength = sizeof( TWLHWSecureInfo );
|
||||||
|
|
||||||
#ifdef HW_SIGNATURE_ENABLE_
|
if( !THWi_CalcSignature( (void *)header.digest.rsa,
|
||||||
// 秘密鍵が指定されている場合のみ、署名作成
|
(const void *)pSrcInfo,
|
||||||
if( pPrivKeyDER ) {
|
sizeof(TWLHWSecureInfo),
|
||||||
#ifdef USE_SHA1_SIGNATURE
|
pPrivKeyDER ) ) {
|
||||||
SVC_CalcSHA1( digest, pSrcInfo, sizeof(TWLHWSecureInfo) );
|
return FALSE;
|
||||||
#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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif // HW_SIGNATURE_ENABLE_
|
|
||||||
|
|
||||||
// ライト
|
// ライト
|
||||||
if( !TSF_WriteFile( (char *)TWL_HWINFO_SECURE_PATH,
|
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 )
|
BOOL THW_RecoverySecureInfo( TSFReadResult err )
|
||||||
{
|
{
|
||||||
@ -295,23 +318,32 @@ static BOOL THWi_CheckSignature( void *pTgt, u32 length, u8 *pSignature )
|
|||||||
SVCSignHeapContext acmemoryPool;
|
SVCSignHeapContext acmemoryPool;
|
||||||
u8 digest_sign[ SVC_SHA1_DIGEST_SIZE ];
|
u8 digest_sign[ SVC_SHA1_DIGEST_SIZE ];
|
||||||
u8 digest_calc[ SVC_SHA1_DIGEST_SIZE ];
|
u8 digest_calc[ SVC_SHA1_DIGEST_SIZE ];
|
||||||
|
u8 key[ SVC_SHA1_DIGEST_SIZE ];
|
||||||
u64 id = SCFG_ReadFuseData();
|
u64 id = SCFG_ReadFuseData();
|
||||||
OSTick start = OS_GetTick();
|
OSTick start = OS_GetTick();
|
||||||
|
|
||||||
#ifdef USE_SHA1_SIGNATURE
|
#ifdef USE_SHA1_SIGNATURE
|
||||||
SVC_CalcSHA1( digest_calc, pTgt, length );
|
SVC_CalcSHA1( digest_calc, pTgt, length );
|
||||||
#else
|
#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
|
#endif
|
||||||
SVC_InitSignHeap( &acmemoryPool, heap, 4096 );
|
SVC_InitSignHeap( &acmemoryPool, heap, 4096 );
|
||||||
SVC_DecryptSign( &acmemoryPool, digest_sign, pSignature, s_publicKey );
|
SVC_DecryptSign( &acmemoryPool, digest_sign, pSignature, s_publicKey );
|
||||||
|
|
||||||
OS_TPrintf( "RSA sign decrypt time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
OS_TPrintf( "RSA sign decrypt time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||||||
|
|
||||||
// ダイジェストチェック有効かどうかで返り値を変える。
|
// 署名チェック
|
||||||
{
|
{
|
||||||
BOOL retval = SVC_CompareSHA1( digest_sign, digest_calc );
|
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_IsAutoBoot() |
|
||||||
NSD_IsBacklightOff() |
|
NSD_IsBacklightOff() |
|
||||||
NSD_IsInitialSequence() |
|
NSD_IsInitialSequence() |
|
||||||
NSD_GetRTCLastSetYear() |
|
|
||||||
NSD_GetRTCClockAdjust()
|
NSD_GetRTCClockAdjust()
|
||||||
) != 0 ) {
|
) != 0 ) {
|
||||||
isFailed = TRUE;
|
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;
|
isFailed = TRUE;
|
||||||
}
|
}
|
||||||
// SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの
|
// SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの
|
||||||
@ -229,7 +230,6 @@ void SYSMi_ConvertTWL2NTRSettings( void )
|
|||||||
NSD_SetFlagAutoBoot( FALSE );
|
NSD_SetFlagAutoBoot( FALSE );
|
||||||
NSD_SetFlagBacklightOff( FALSE );
|
NSD_SetFlagBacklightOff( FALSE );
|
||||||
NSD_SetFlagInitialSequence( FALSE );
|
NSD_SetFlagInitialSequence( FALSE );
|
||||||
NSD_SetRTCLastSetYear( 0 );
|
|
||||||
NSD_SetRTCClockAdjust( 0 );
|
NSD_SetRTCClockAdjust( 0 );
|
||||||
|
|
||||||
// "1"であるべきもの
|
// "1"であるべきもの
|
||||||
@ -241,6 +241,7 @@ void SYSMi_ConvertTWL2NTRSettings( void )
|
|||||||
NSD_SetFlagNickname( TRUE );
|
NSD_SetFlagNickname( TRUE );
|
||||||
|
|
||||||
// 値が一致する必要があるもの
|
// 値が一致する必要があるもの
|
||||||
|
NSD_SetRTCLastSetYear( TSD_GetRTCLastSetYear() );
|
||||||
NSD_SetRTCOffset( TSD_GetRTCOffset() );
|
NSD_SetRTCOffset( TSD_GetRTCOffset() );
|
||||||
|
|
||||||
// SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの
|
// SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの
|
||||||
@ -249,7 +250,7 @@ void SYSMi_ConvertTWL2NTRSettings( void )
|
|||||||
NSD_SetLanguage ( (NTRLangCode)TSD_GetLanguage() );
|
NSD_SetLanguage ( (NTRLangCode)TSD_GetLanguage() );
|
||||||
NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() );
|
NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() );
|
||||||
}else if( TSD_GetLanguage() <= TWL_LANG_KOREAN ) {
|
}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_SetLanguage ( NTR_LANG_ENGLISH );
|
||||||
NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() );
|
NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() );
|
||||||
}else {
|
}else {
|
||||||
|
|||||||
@ -150,5 +150,5 @@ RomSpec
|
|||||||
File NTR_IPL_font_m.NFTR
|
File NTR_IPL_font_m.NFTR
|
||||||
HostRoot ../../../../keys/HWInfo
|
HostRoot ../../../../keys/HWInfo
|
||||||
Root /key
|
Root /key
|
||||||
File privKeyHWInfo.der
|
# File privKeyHWInfo.der
|
||||||
}
|
}
|
||||||
|
|||||||
@ -361,6 +361,19 @@ static BOOL WriteHWSecureInfoFile( u8 region )
|
|||||||
// 対応言語ビットマップのセット
|
// 対応言語ビットマップのセット
|
||||||
THW_SetValidLanguageBitmap( s_langBitmapList[ 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 &&
|
if( isWrite &&
|
||||||
!THW_WriteSecureInfo( s_pPrivKeyBuffer ) ) {
|
!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