mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
ランチャーバージョン関係の更新
・可変長データを埋め込めるよう、なんとか対応 ・バージョン以外のデータもいろいろ追加 ・インポートし、ランチャーでの取得まで確認(署名検証処理は未実装) git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1692 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
d869e8cb7d
commit
79ac070182
@ -26,24 +26,30 @@
|
|||||||
#define VER_TITLEID 0x0003000F484E5641 //HNVA
|
#define VER_TITLEID 0x0003000F484E5641 //HNVA
|
||||||
|
|
||||||
#define VERSION_DATA_SIGN_SIZE 128
|
#define VERSION_DATA_SIGN_SIZE 128
|
||||||
#define VERSION_DATA_BODY_SIZE 32
|
#define VERSION_DATA_HEADER_SIZE 96
|
||||||
#define VERSION_DATA_PADDING_SIZE (VERSION_DATA_BODY_SIZE - 4 - 4)
|
#define VERSION_DATA_PADDING1_SIZE 12
|
||||||
|
#define VERSION_DATA_PADDING2_SIZE 44
|
||||||
|
|
||||||
typedef struct VersionData
|
typedef struct VersionDataHeader
|
||||||
{
|
{
|
||||||
u8 rsa_sign[VERSION_DATA_SIGN_SIZE];
|
u8 rsa_sign[VERSION_DATA_SIGN_SIZE];
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
u8 body[VERSION_DATA_BODY_SIZE];
|
u8 header[VERSION_DATA_HEADER_SIZE];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
u32 timestamp;
|
u32 timestamp;
|
||||||
u32 version;
|
u32 version;
|
||||||
u8 res[VERSION_DATA_PADDING_SIZE];
|
u32 userAreaSize;
|
||||||
|
u32 data1Offset;
|
||||||
|
u32 data1Size;
|
||||||
|
u8 padding1[VERSION_DATA_PADDING1_SIZE];
|
||||||
|
u8 data1Digest;
|
||||||
|
u8 padding2[VERSION_DATA_PADDING2_SIZE];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
VersionData;
|
VersionDataHeader;
|
||||||
|
|
||||||
// function's prototype-------------------------------------------------------
|
// function's prototype-------------------------------------------------------
|
||||||
|
|
||||||
@ -60,7 +66,7 @@ static u32 s_version = 0;
|
|||||||
BOOL LoadSysmVersion( void )
|
BOOL LoadSysmVersion( void )
|
||||||
{
|
{
|
||||||
char path[256];
|
char path[256];
|
||||||
VersionData vd;
|
VersionDataHeader vdh;
|
||||||
FSFile file[1];
|
FSFile file[1];
|
||||||
BOOL bSuccess;
|
BOOL bSuccess;
|
||||||
s32 len;
|
s32 len;
|
||||||
@ -78,8 +84,8 @@ OS_TPrintf("LoadSysmVersion failed: cant open file\n");
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = FS_ReadFile(file, &vd, sizeof(vd));
|
len = FS_ReadFile(file, &vdh, sizeof(vdh));
|
||||||
if( len != sizeof(vd) )
|
if( len != sizeof(vdh) )
|
||||||
{
|
{
|
||||||
OS_TPrintf("LoadSysmVersion failed: read file error!\n");
|
OS_TPrintf("LoadSysmVersion failed: read file error!\n");
|
||||||
(void)FS_CloseFile(file);
|
(void)FS_CloseFile(file);
|
||||||
@ -91,8 +97,8 @@ OS_TPrintf("LoadSysmVersion failed: read file error!\n");
|
|||||||
// ŒŸ<C592>Ø
|
// ŒŸ<C592>Ø
|
||||||
// [TODO:]<5D><>–¼<E28093>ˆ—<CB86>
|
// [TODO:]<5D><>–¼<E28093>ˆ—<CB86>
|
||||||
|
|
||||||
s_version = vd.version;
|
s_version = vdh.version;
|
||||||
if( vd.timestamp > 0 ) OS_TPrintf( "VersionData timestamp : %08x\n", vd.timestamp );
|
if( vdh.timestamp > 0 ) OS_TPrintf( "VersionData timestamp : %08x\n", vdh.timestamp );
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -102,3 +108,13 @@ u32 GetSysmVersion( void )
|
|||||||
return s_version;
|
return s_version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u16 GetSysmMajorVersion( void )
|
||||||
|
{
|
||||||
|
return (u16)( ( 0xffff0000 & s_version ) >> 16 );
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 GetSysmMinorVersion( void )
|
||||||
|
{
|
||||||
|
return (u16)( 0xffff & s_version );
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,6 +30,8 @@ extern "C" {
|
|||||||
// function----------------------------------------------------------
|
// function----------------------------------------------------------
|
||||||
BOOL LoadSysmVersion( void );
|
BOOL LoadSysmVersion( void );
|
||||||
u32 GetSysmVersion( void );
|
u32 GetSysmVersion( void );
|
||||||
|
u16 GetSysmMajorVersion( void );
|
||||||
|
u16 GetSysmMinorVersion( void );
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,6 +25,7 @@
|
|||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "loadWlanFirm.h"
|
#include "loadWlanFirm.h"
|
||||||
#include "loadSharedFont.h"
|
#include "loadSharedFont.h"
|
||||||
|
#include "loadSysmVersion.h"
|
||||||
|
|
||||||
// extern data-----------------------------------------------------------------
|
// extern data-----------------------------------------------------------------
|
||||||
|
|
||||||
@ -333,6 +334,11 @@ void TwlMain( void )
|
|||||||
OS_TPrintf( "GetSharedFont : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
OS_TPrintf( "GetSharedFont : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if( LoadSysmVersion() )
|
||||||
|
{
|
||||||
|
OS_TPrintf("Launcher Version = %d.%d\n",GetSysmMajorVersion(), GetSysmMinorVersion() );
|
||||||
|
}
|
||||||
|
|
||||||
// 開始ステートの判定--------------
|
// 開始ステートの判定--------------
|
||||||
|
|
||||||
// start時間計測7
|
// start時間計測7
|
||||||
|
|||||||
@ -26,7 +26,9 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
|||||||
|
|
||||||
VER_TIMESTAMP = 08062300
|
VER_TIMESTAMP = 08062300
|
||||||
|
|
||||||
VERSION_NUM = 1
|
MAJOR_VERSION = 0
|
||||||
|
MINOR_VERSION = 1
|
||||||
|
USER_AREA_SIZE = 16
|
||||||
|
|
||||||
VERSION_FILE = SysmenuVersion.dat
|
VERSION_FILE = SysmenuVersion.dat
|
||||||
|
|
||||||
@ -53,7 +55,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
|||||||
do-build : $(VERSION_TAD)
|
do-build : $(VERSION_TAD)
|
||||||
|
|
||||||
$(VERSION_DAT):
|
$(VERSION_DAT):
|
||||||
$(GEN_VERSION_FILE) $(VER_TIMESTAMP) $(VERSION_NUM)
|
$(GEN_VERSION_FILE) $(VER_TIMESTAMP) $(MAJOR_VERSION) $(MINOR_VERSION) $(USER_AREA_SIZE)
|
||||||
|
|
||||||
$(VERSION_TAD) : $(VERSION_FILE)
|
$(VERSION_TAD) : $(VERSION_FILE)
|
||||||
$(MAKETAD) $(call empath,$<) $(VERSION_MAKETAD_OPTION) -o $@
|
$(MAKETAD) $(call empath,$<) $(VERSION_MAKETAD_OPTION) -o $@
|
||||||
|
|||||||
Binary file not shown.
@ -8,10 +8,18 @@
|
|||||||
# [[ FILE FORMAT ]]
|
# [[ FILE FORMAT ]]
|
||||||
# security code (128 bytes) : RSA signature of Version Data
|
# security code (128 bytes) : RSA signature of Version Data
|
||||||
#
|
#
|
||||||
# Version Data ( 32 bytes)
|
# Header ( 96 bytes)
|
||||||
# TimeStamp ( 4 bytes) : date %y%m%d%H
|
# TimeStamp ( 4 bytes) : date %y%m%d%H
|
||||||
# Version ( 4 bytes) : 0 ~
|
# Version ( 4 bytes) : 0.0 ~ 65535.65535
|
||||||
# padding ( 24 bytes) :
|
# UserAreaSize ( 4 bytes) : Size of UserArea
|
||||||
|
# Data1Offset ( 4 bytes) : File offset of Data1
|
||||||
|
# Data1Size ( 4 bytes) : Size of Data1
|
||||||
|
# padding ( 12 bytes) :
|
||||||
|
# Data1Hash ( 20 bytes) : SHA1 digest of Data1
|
||||||
|
# padding ( 44 bytes) :
|
||||||
|
#
|
||||||
|
# Data1 (flexible length) :
|
||||||
|
# padding ( 32 bytes) :
|
||||||
#
|
#
|
||||||
# note: each section image is aligned to 32 bytes.
|
# note: each section image is aligned to 32 bytes.
|
||||||
#
|
#
|
||||||
@ -20,48 +28,95 @@
|
|||||||
use POSIX 'strftime';
|
use POSIX 'strftime';
|
||||||
use File::Basename;
|
use File::Basename;
|
||||||
|
|
||||||
if ($#ARGV < 1) {
|
if ($#ARGV < 3) {
|
||||||
printf STDOUT ("Usage: %s [genVersion] timestamp version\n", $0);
|
printf STDOUT ("Usage: %s [genVersion] timestamp majorVersion minorVersion userAreaSize\n", $0);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
my $outFile = "SysmenuVersion.dat";
|
my $outFile = "SysmenuVersion.dat";
|
||||||
my $versionFile = "version.bin";
|
my $data1File = "data1.bin";
|
||||||
|
my $headerFile = "header.bin";
|
||||||
|
my $digestFile = "digest.bin";
|
||||||
|
my $tmpFile = "tmp.bin";
|
||||||
my $signFile = "sign.bin";
|
my $signFile = "sign.bin";
|
||||||
|
|
||||||
# 後始末
|
# 後始末
|
||||||
sub deleteTemp {
|
sub deleteTemp {
|
||||||
system ("rm -f $versionFile");
|
system ("rm -f $tmpFile");
|
||||||
|
system ("rm -f $digestFile");
|
||||||
|
system ("rm -f $data1File");
|
||||||
|
system ("rm -f $headerFile");
|
||||||
system ("rm -f $signFile");
|
system ("rm -f $signFile");
|
||||||
}
|
}
|
||||||
|
|
||||||
my $signSize = 0x80;
|
my $signSize = 0x80;
|
||||||
my $versionSize = 0x20;
|
my $headerSize = 0x80;
|
||||||
my @files;
|
my $data1Len = 0x20;
|
||||||
|
|
||||||
# バージョン情報の出力
|
# Data1情報の出力
|
||||||
{
|
{
|
||||||
# timestampLen = 0x08;
|
open DATA1, ">$data1File" or die "File Open Error.\n";
|
||||||
# elementNumLen = 0x02;
|
binmode DATA1;
|
||||||
my $padLen = 0x18;
|
|
||||||
|
|
||||||
open VERSION, ">$versionFile" or die "File Open Error.\n";
|
# ダミーデータの出力
|
||||||
binmode VERSION;
|
syswrite( DATA1, pack( "x$data1Len") );
|
||||||
|
|
||||||
|
close DATA1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ヘッダ情報の出力
|
||||||
|
{
|
||||||
|
# timestampLen = 0x08;
|
||||||
|
# elementNumLen = 0x02;
|
||||||
|
my $pad1Len = 0x0c;
|
||||||
|
my $pad2Len = 0x2c;
|
||||||
|
my $data1Off = $signSize + $headerSize;
|
||||||
|
my $sha1Len = 0x14;
|
||||||
|
|
||||||
|
open HEADER, ">$headerFile" or die "File Open Error.\n";
|
||||||
|
binmode HEADER;
|
||||||
|
|
||||||
# タイムスタンプの出力
|
|
||||||
# my $timestamp = strftime "%y%m%d%H", localtime;
|
# my $timestamp = strftime "%y%m%d%H", localtime;
|
||||||
my $timestamp = $ARGV[ 0 ];
|
my $timestamp = $ARGV[ 0 ];
|
||||||
my $ver = $ARGV[ 1 ];
|
my $ver = ( ( $ARGV[ 1 ] & 0xffff ) << 16 ) | ($ARGV[ 2 ] & 0xffff);
|
||||||
|
my $userAreaSize = $ARGV[ 3 ];
|
||||||
|
|
||||||
|
# タイムスタンプの出力
|
||||||
printf "timestamp = %s\n", $timestamp;
|
printf "timestamp = %s\n", $timestamp;
|
||||||
syswrite( VERSION, pack( "N", unpack( "L", pack( "H8", $timestamp ) ) ) );
|
syswrite( HEADER, pack( "N", unpack( "L", pack( "H8", $timestamp ) ) ) );
|
||||||
|
|
||||||
# バージョンの出力
|
# バージョンの出力
|
||||||
syswrite( VERSION, pack( "L", $ver ) );
|
printf "version = %d.%d\n", ($ver >> 16), ($ver & 0xffff);
|
||||||
|
syswrite( HEADER, pack( "L", $ver ) );
|
||||||
|
|
||||||
# パディングの出力
|
# ユーザ領域サイズの出力
|
||||||
syswrite( VERSION, pack( "x$padLen") );
|
printf "userAreaSize = $userAreaSize\n";
|
||||||
|
syswrite( HEADER, pack( "L", $userAreaSize ) );
|
||||||
|
# Data1オフセットの出力
|
||||||
|
printf "data1Offset = $data1Off\n";
|
||||||
|
syswrite( HEADER, pack( "L", $data1Off ) );
|
||||||
|
# Data1サイズの出力
|
||||||
|
printf "data1Size = $data1Len\n";
|
||||||
|
syswrite( HEADER, pack( "L", $data1Len ) );
|
||||||
|
|
||||||
close VERSION;
|
# パディング1の出力
|
||||||
|
syswrite( HEADER, pack( "x$pad1Len") );
|
||||||
|
|
||||||
|
# Data1ハッシュの出力
|
||||||
|
{
|
||||||
|
my $digest;
|
||||||
|
system ("openssl dgst -sha1 -binary -out $digestFile $data1File");
|
||||||
|
open DIGEST, $digestFile or die "File Open Error.\n";
|
||||||
|
binmode DIGEST;
|
||||||
|
sysread( DIGEST, $digest, $sha1Len );
|
||||||
|
close DIGEST;
|
||||||
|
syswrite( HEADER, $digest, $sha1Len );
|
||||||
|
}
|
||||||
|
|
||||||
|
# パディング2の出力
|
||||||
|
syswrite( HEADER, pack( "x$pad2Len") );
|
||||||
|
|
||||||
|
close HEADER;
|
||||||
}
|
}
|
||||||
|
|
||||||
# 環境変数サーチ
|
# 環境変数サーチ
|
||||||
@ -75,9 +130,10 @@ if (!$KEYROOT) {
|
|||||||
die "No TWL_IPL_RED_PRIVATE_ROOT is found.\n";
|
die "No TWL_IPL_RED_PRIVATE_ROOT is found.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
# バージョン情報に署名付加
|
# 署名付加
|
||||||
{
|
{
|
||||||
system ( "openssl rsautl -sign -in $versionFile -inkey $KEYROOT/keys/rsa/private_sharedFont.der -keyform DER -out $signFile" );
|
system ( "openssl rsautl -sign -in $headerFile -inkey $KEYROOT/keys/rsa/private_sharedFont.der -keyform DER -out $signFile" );
|
||||||
system ( "cat $signFile $versionFile >$outFile" );
|
system ( "cat $signFile $headerFile >$tmpFile" );
|
||||||
|
system ( "cat $tmpFile $data1File > $outFile" );
|
||||||
deleteTemp();
|
deleteTemp();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user