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 9a08b5b2..5fd5d19f 100644 Binary files a/build/systemMenu_RED/sysmenuVersion/SysmenuVersion.dat and b/build/systemMenu_RED/sysmenuVersion/SysmenuVersion.dat differ 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(); }