From 79ac0701822fc199c16684b646a3e8ff047c84c4 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Wed, 25 Jun 2008 06:25:03 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=A9=E3=83=B3=E3=83=81=E3=83=A3=E3=83=BC?= =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3=E9=96=A2=E4=BF=82?= =?UTF-8?q?=E3=81=AE=E6=9B=B4=E6=96=B0=20=E3=80=80=E3=83=BB=E5=8F=AF?= =?UTF-8?q?=E5=A4=89=E9=95=B7=E3=83=87=E3=83=BC=E3=82=BF=E3=82=92=E5=9F=8B?= =?UTF-8?q?=E3=82=81=E8=BE=BC=E3=82=81=E3=82=8B=E3=82=88=E3=81=86=E3=80=81?= =?UTF-8?q?=E3=81=AA=E3=82=93=E3=81=A8=E3=81=8B=E5=AF=BE=E5=BF=9C=20?= =?UTF-8?q?=E3=80=80=E3=83=BB=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E4=BB=A5=E5=A4=96=E3=81=AE=E3=83=87=E3=83=BC=E3=82=BF=E3=82=82?= =?UTF-8?q?=E3=81=84=E3=82=8D=E3=81=84=E3=82=8D=E8=BF=BD=E5=8A=A0=20?= =?UTF-8?q?=E3=80=80=E3=83=BB=E3=82=A4=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=81=97=E3=80=81=E3=83=A9=E3=83=B3=E3=83=81=E3=83=A3=E3=83=BC?= =?UTF-8?q?=E3=81=A7=E3=81=AE=E5=8F=96=E5=BE=97=E3=81=BE=E3=81=A7=E7=A2=BA?= =?UTF-8?q?=E8=AA=8D=EF=BC=88=E7=BD=B2=E5=90=8D=E6=A4=9C=E8=A8=BC=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AF=E6=9C=AA=E5=AE=9F=E8=A3=85=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1692 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../Launcher/ARM9/src/loadSysmVersion.c | 38 +++++-- .../Launcher/ARM9/src/loadSysmVersion.h | 2 + build/systemMenu_RED/Launcher/ARM9/src/main.c | 6 + build/systemMenu_RED/sysmenuVersion/Makefile | 6 +- .../sysmenuVersion/SysmenuVersion.dat | Bin 160 -> 256 bytes tools/bin/genVersion.plx | 106 +++++++++++++----- 6 files changed, 120 insertions(+), 38 deletions(-) diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadSysmVersion.c b/build/systemMenu_RED/Launcher/ARM9/src/loadSysmVersion.c index eb92bc18..ab1782f6 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadSysmVersion.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadSysmVersion.c @@ -26,24 +26,30 @@ #define VER_TITLEID 0x0003000F484E5641 //HNVA #define VERSION_DATA_SIGN_SIZE 128 -#define VERSION_DATA_BODY_SIZE 32 -#define VERSION_DATA_PADDING_SIZE (VERSION_DATA_BODY_SIZE - 4 - 4) +#define VERSION_DATA_HEADER_SIZE 96 +#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]; union { - u8 body[VERSION_DATA_BODY_SIZE]; + u8 header[VERSION_DATA_HEADER_SIZE]; struct { u32 timestamp; 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------------------------------------------------------- @@ -60,7 +66,7 @@ static u32 s_version = 0; BOOL LoadSysmVersion( void ) { char path[256]; - VersionData vd; + VersionDataHeader vdh; FSFile file[1]; BOOL bSuccess; s32 len; @@ -78,8 +84,8 @@ OS_TPrintf("LoadSysmVersion failed: cant open file\n"); return FALSE; } - len = FS_ReadFile(file, &vd, sizeof(vd)); - if( len != sizeof(vd) ) + len = FS_ReadFile(file, &vdh, sizeof(vdh)); + if( len != sizeof(vdh) ) { OS_TPrintf("LoadSysmVersion failed: read file error!\n"); (void)FS_CloseFile(file); @@ -91,8 +97,8 @@ OS_TPrintf("LoadSysmVersion failed: read file error!\n"); // 検証 // [TODO:]署名処理 - s_version = vd.version; - if( vd.timestamp > 0 ) OS_TPrintf( "VersionData timestamp : %08x\n", vd.timestamp ); + s_version = vdh.version; + if( vdh.timestamp > 0 ) OS_TPrintf( "VersionData timestamp : %08x\n", vdh.timestamp ); return TRUE; } @@ -102,3 +108,13 @@ u32 GetSysmVersion( void ) return s_version; } +u16 GetSysmMajorVersion( void ) +{ + return (u16)( ( 0xffff0000 & s_version ) >> 16 ); +} + +u16 GetSysmMinorVersion( void ) +{ + return (u16)( 0xffff & s_version ); +} + diff --git a/build/systemMenu_RED/Launcher/ARM9/src/loadSysmVersion.h b/build/systemMenu_RED/Launcher/ARM9/src/loadSysmVersion.h index 557153f1..be6966a2 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/loadSysmVersion.h +++ b/build/systemMenu_RED/Launcher/ARM9/src/loadSysmVersion.h @@ -30,6 +30,8 @@ extern "C" { // function---------------------------------------------------------- BOOL LoadSysmVersion( void ); u32 GetSysmVersion( void ); +u16 GetSysmMajorVersion( void ); +u16 GetSysmMinorVersion( void ); #ifdef __cplusplus } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index 2543ebfc..3aa09138 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -25,6 +25,7 @@ #include "sound.h" #include "loadWlanFirm.h" #include "loadSharedFont.h" +#include "loadSysmVersion.h" // extern data----------------------------------------------------------------- @@ -333,6 +334,11 @@ void TwlMain( void ) OS_TPrintf( "GetSharedFont : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) ); #endif + if( LoadSysmVersion() ) + { + OS_TPrintf("Launcher Version = %d.%d\n",GetSysmMajorVersion(), GetSysmMinorVersion() ); + } + // 開始ステートの判定-------------- // start時間計測7 diff --git a/build/systemMenu_RED/sysmenuVersion/Makefile b/build/systemMenu_RED/sysmenuVersion/Makefile index 18ea54e3..7157cdab 100644 --- a/build/systemMenu_RED/sysmenuVersion/Makefile +++ b/build/systemMenu_RED/sysmenuVersion/Makefile @@ -26,7 +26,9 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs VER_TIMESTAMP = 08062300 -VERSION_NUM = 1 +MAJOR_VERSION = 0 +MINOR_VERSION = 1 +USER_AREA_SIZE = 16 VERSION_FILE = SysmenuVersion.dat @@ -53,7 +55,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules do-build : $(VERSION_TAD) $(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) $(MAKETAD) $(call empath,$<) $(VERSION_MAKETAD_OPTION) -o $@ diff --git a/build/systemMenu_RED/sysmenuVersion/SysmenuVersion.dat b/build/systemMenu_RED/sysmenuVersion/SysmenuVersion.dat index 9a08b5b2757df7aa59385aa14548a6f0929fdb62..5fd5d19f882a5fdab9462d777cb876ff03d28282 100644 GIT binary patch literal 256 zcmYehAilL{XTr~!K3^hiW6ds_3C#Z%?{@utv{Ht uNoDb0-8pZjUi}sReJNMJ)v8%cyBe!qCTmLgxgXeg_ArAo8wVo;ZU6ulNI}a0 diff --git a/tools/bin/genVersion.plx b/tools/bin/genVersion.plx index bdf84ebe..71a7fd13 100644 --- a/tools/bin/genVersion.plx +++ b/tools/bin/genVersion.plx @@ -8,10 +8,18 @@ # [[ FILE FORMAT ]] # security code (128 bytes) : RSA signature of Version Data # -# Version Data ( 32 bytes) +# Header ( 96 bytes) # TimeStamp ( 4 bytes) : date %y%m%d%H -# Version ( 4 bytes) : 0 ~ -# padding ( 24 bytes) : +# Version ( 4 bytes) : 0.0 ~ 65535.65535 +# 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. # @@ -20,48 +28,95 @@ use POSIX 'strftime'; use File::Basename; -if ($#ARGV < 1) { - printf STDOUT ("Usage: %s [genVersion] timestamp version\n", $0); +if ($#ARGV < 3) { + printf STDOUT ("Usage: %s [genVersion] timestamp majorVersion minorVersion userAreaSize\n", $0); exit(-1); } 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"; # 後始末 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"); } my $signSize = 0x80; -my $versionSize = 0x20; -my @files; +my $headerSize = 0x80; +my $data1Len = 0x20; -# バージョン情報の出力 +# Data1情報の出力 { - # timestampLen = 0x08; - # elementNumLen = 0x02; - my $padLen = 0x18; + open DATA1, ">$data1File" or die "File Open Error.\n"; + binmode DATA1; - 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 = $ARGV[ 0 ]; - my $ver = $ARGV[ 1 ]; + my $ver = ( ( $ARGV[ 1 ] & 0xffff ) << 16 ) | ($ARGV[ 2 ] & 0xffff); + my $userAreaSize = $ARGV[ 3 ]; + + # タイムスタンプの出力 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"; } -# バージョン情報に署名付加 +# 署名付加 { - system ( "openssl rsautl -sign -in $versionFile -inkey $KEYROOT/keys/rsa/private_sharedFont.der -keyform DER -out $signFile" ); - system ( "cat $signFile $versionFile >$outFile" ); + system ( "openssl rsautl -sign -in $headerFile -inkey $KEYROOT/keys/rsa/private_sharedFont.der -keyform DER -out $signFile" ); + system ( "cat $signFile $headerFile >$tmpFile" ); + system ( "cat $tmpFile $data1File > $outFile" ); deleteTemp(); }