diff --git a/build/systemMenu_RED/sysmenuVersion/Makefile b/build/systemMenu_RED/sysmenuVersion/Makefile index abaaeed2..1e2c1848 100644 --- a/build/systemMenu_RED/sysmenuVersion/Makefile +++ b/build/systemMenu_RED/sysmenuVersion/Makefile @@ -17,23 +17,36 @@ #---------------------------------------------------------------------------- # バージョンファイルとTADを生成する -# WL_IPL_RED_PRIVATE_ROOTが設定されていない場合は +# TWL_IPL_RED_PRIVATE_ROOTが設定されていない場合は # 既存のバージョンファイルからTADのみ生成する +# 現在、製品版の証明書を含んだものは生成しない + TARGET_FIRM = SYSTEMMENU include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs include ./commondefs.sysmenuVersion +# タイムスタンプ VER_TIMESTAMP = 08062300 # システムメニューバージョン +STR_VERSION = 0.1A MAJOR_VERSION = 0 MINOR_VERSION = 1 # ユーザー領域サイズ(=128MB) USER_AREA_SIZE = 134217728 +# NUPホストネーム +NUP_HOSTNAME = nus.shop.wii.com:443 + +# EULAのURL +EULA_URL = https://cfh-test.t.app.nintendowifi.net/eula/ + +GEN_VERSION_PARAM = $(VER_TIMESTAMP) $(STR_VERSION) $(MAJOR_VERSION) $(MINOR_VERSION) \ + $(USER_AREA_SIZE) $(NUP_HOSTNAME) $(EULA_URL) + GEN_VERSION_FILE = $(SYSMENU_TOOLSDIR)/bin/genVersion.plx VERSION_TAD = HNLA.tad @@ -55,7 +68,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules do-build : $(VERSION_TAD) $(VERSION_DAT): ./Makefile ./commondefs.sysmenuVersion - $(GEN_VERSION_FILE) $(VER_TIMESTAMP) $(MAJOR_VERSION) $(MINOR_VERSION) $(USER_AREA_SIZE) + $(GEN_VERSION_FILE) $(GEN_VERSION_PARAM) $(VERSION_TAD) : $(SYSMENU_VERSION_FILE) $(MAKETAD) $(call empath,$<) $(SYSMENU_VERSION_MAKETAD_OPTION) -o $@ diff --git a/build/systemMenu_RED/sysmenuVersion/SysmenuVersion.dat b/build/systemMenu_RED/sysmenuVersion/SysmenuVersion.dat index 3d03c038..dce5cefe 100644 Binary files a/build/systemMenu_RED/sysmenuVersion/SysmenuVersion.dat and b/build/systemMenu_RED/sysmenuVersion/SysmenuVersion.dat differ diff --git a/build/systemMenu_RED/sysmenuVersion/archive_data/NintendoCA-G2.der b/build/systemMenu_RED/sysmenuVersion/archive_data/NintendoCA-G2.der new file mode 100644 index 00000000..56696aa8 Binary files /dev/null and b/build/systemMenu_RED/sysmenuVersion/archive_data/NintendoCA-G2.der differ diff --git a/build/systemMenu_RED/sysmenuVersion/archive_data/TWL-NUP-Dev-1-cert.bin b/build/systemMenu_RED/sysmenuVersion/archive_data/TWL-NUP-Dev-1-cert.bin new file mode 100644 index 00000000..560fcb57 Binary files /dev/null and b/build/systemMenu_RED/sysmenuVersion/archive_data/TWL-NUP-Dev-1-cert.bin differ diff --git a/build/systemMenu_RED/sysmenuVersion/archive_data/TWL-Shop-Dev-1-cert.bin b/build/systemMenu_RED/sysmenuVersion/archive_data/TWL-Shop-Dev-1-cert.bin new file mode 100644 index 00000000..57e61f06 Binary files /dev/null and b/build/systemMenu_RED/sysmenuVersion/archive_data/TWL-Shop-Dev-1-cert.bin differ diff --git a/build/systemMenu_RED/sysmenuVersion/archive_data/twl-nup-dev-1-prvkey.bin b/build/systemMenu_RED/sysmenuVersion/archive_data/twl-nup-dev-1-prvkey.bin new file mode 100644 index 00000000..77938646 Binary files /dev/null and b/build/systemMenu_RED/sysmenuVersion/archive_data/twl-nup-dev-1-prvkey.bin differ diff --git a/build/systemMenu_RED/sysmenuVersion/archive_data/twl-shop-dev-1-prvkey.bin b/build/systemMenu_RED/sysmenuVersion/archive_data/twl-shop-dev-1-prvkey.bin new file mode 100644 index 00000000..177cd925 Binary files /dev/null and b/build/systemMenu_RED/sysmenuVersion/archive_data/twl-shop-dev-1-prvkey.bin differ diff --git a/tools/bin/genVersion.plx b/tools/bin/genVersion.plx index 71a7fd13..a3cdfab2 100644 --- a/tools/bin/genVersion.plx +++ b/tools/bin/genVersion.plx @@ -6,117 +6,51 @@ # generate SystemMenu Version Data # # [[ FILE FORMAT ]] -# security code (128 bytes) : RSA signature of Version Data # -# Header ( 96 bytes) -# TimeStamp ( 4 bytes) : date %y%m%d%H -# 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. +# Security code (128 bytes) : RSA signature of Header +# Header + Data : NitroSystemArchive Format # ###################################################################### use POSIX 'strftime'; use File::Basename; -if ($#ARGV < 3) { - printf STDOUT ("Usage: %s [genVersion] timestamp majorVersion minorVersion userAreaSize\n", $0); +if ($#ARGV < 6) { + printf STDOUT ("Usage: %s [genVersion] timestamp strVersion majorVersion minorVersion userAreaSize NUPHostName EULAURL\n", $0); exit(-1); } -my $outFile = "SysmenuVersion.dat"; -my $data1File = "data1.bin"; -my $headerFile = "header.bin"; -my $digestFile = "digest.bin"; -my $tmpFile = "tmp.bin"; -my $signFile = "sign.bin"; +# アーカイブにまとめるデータファイル +my $dataDir = "archive_data"; +my $versionFile = "$dataDir/version.bin"; +my $timeStampFile = "$dataDir/time_stamp.bin"; +my $userAreaSizeFile = "$dataDir/user_area_size.bin"; +my $nupHostFile = "$dataDir/nup_host.bin"; +my $urlEULAFile = "$dataDir/eula_url.bin"; + +# 証明書および鍵はIPL_privateで作成したものをそのまま使うのでここでは作成しない +#my $cert4SSLClientFile = "$dataDir/cert4ssl"; +#my $privKeyCert4SSLClientFile = "$dataDir/priv_key_cert4ssl"; +#my $rootCACert4SSLFile1 = "$dataDir/root_ca_cert4ssl1"; +#my $rootCACert4SSLFile2 = "$dataDir/root_ca_cert4ssl2"; +#my $rootCACert4SSLFile3 = "$dataDir/root_ca_cert4ssl3"; +#my $rootCACert4SSLFile4 = "$dataDir/root_ca_cert4ssl4"; +#my $rootCACert4SSLFile5 = "$dataDir/root_ca_cert4ssl5"; +#my $rootCACert4SSLFile6 = "$dataDir/root_ca_cert4ssl6"; + +# 出力ファイル +my $outFile = "SysmenuVersion.dat"; + +# 中間ファイル +my $archiveFile = "archive.narc"; +my $digestFile = "digest.bin"; +my $signFile = "sign.bin"; # 後始末 sub deleteTemp { - system ("rm -f $tmpFile"); system ("rm -f $digestFile"); - system ("rm -f $data1File"); - system ("rm -f $headerFile"); system ("rm -f $signFile"); -} - -my $signSize = 0x80; -my $headerSize = 0x80; -my $data1Len = 0x20; - -# Data1情報の出力 -{ - open DATA1, ">$data1File" or die "File Open Error.\n"; - binmode DATA1; - - # ダミーデータの出力 - 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 ] & 0xffff ) << 16 ) | ($ARGV[ 2 ] & 0xffff); - my $userAreaSize = $ARGV[ 3 ]; - - # タイムスタンプの出力 - printf "timestamp = %s\n", $timestamp; - syswrite( HEADER, pack( "N", unpack( "L", pack( "H8", $timestamp ) ) ) ); - - # バージョンの出力 - printf "version = %d.%d\n", ($ver >> 16), ($ver & 0xffff); - syswrite( HEADER, pack( "L", $ver ) ); - - # ユーザ領域サイズの出力 - 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 ) ); - - # パディング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; + system ("rm -f $archiveFile"); } # 環境変数サーチ @@ -126,14 +60,97 @@ foreach ( sort keys ( %ENV ) ){ } } if (!$KEYROOT) { - deleteTemp(); die "No TWL_IPL_RED_PRIVATE_ROOT is found.\n"; } +my $TWLIPLRED_ROOT; + +# 環境変数のキーにTWL_IPL_RED_ROOTがあるか +if (exists($ENV{"TWL_IPL_RED_ROOT"}) ){ + $TWLIPLRED_ROOT = $ENV{"TWL_IPL_RED_ROOT"}; +}else +{ + die "No TWL_IPL_RED_ROOT is found.\n"; +} + +# バージョンの出力 +{ + open VERSION, ">$versionFile" or die "File Open Error.\n"; + binmode VERSION; +# my $ver = ( ( $ARGV[ 1 ] & 0xffff ) << 16 ) | ($ARGV[ 2 ] & 0xffff); +# printf "version = %d.%d\n", ($ver >> 16), ($ver & 0xffff); +# syswrite( VERSION, pack( "L", $ver ) ); + printf "version = %s\n", $ARGV[1]; + syswrite( VERSION, pack( "a*x", $ARGV[1]) ); + close VERSION; +} + +# タイムスタンプの出力 +{ + open TIMESTAMP, ">$timeStampFile" or die "File Open Error.\n"; + binmode TIMESTAMP; +# my $timestamp = strftime "%y%m%d%H", localtime; + my $timestamp = $ARGV[ 0 ]; + printf "timestamp = %s\n", $timestamp; + syswrite( TIMESTAMP, pack( "N", unpack( "L", pack( "H8", $timestamp ) ) ) ); + close TIMESTAMP; +} + +# ユーザエリアサイズの出力 +{ + open USERAREA, ">$userAreaSizeFile" or die "File Open Error.\n"; + binmode USERAREA; + my $userAreaSize = $ARGV[ 4 ]; + printf "userAreaSize = $userAreaSize\n"; + syswrite( USERAREA, pack( "L", $userAreaSize ) ); + close USERAREA; +} + +# NUP_HOSTNAMEの出力 +{ + open NUPHOSTNAME, ">$nupHostFile" or die "File Open Error.\n"; + binmode NUPHOSTNAME; + my $nupHostName = $ARGV[ 5 ]; + printf "NUPHostName = $nupHostName\n"; + syswrite( NUPHOSTNAME, pack( "a*x", $nupHostName ) ); + close NUPHOSTNAME; +} + +# EULA_URLの出力 +{ + open EULAURL, ">$urlEULAFile" or die "File Open Error.\n"; + binmode EULAURL; + my $urlEULA = $ARGV[ 6 ]; + printf "EULAURL = $urlEULA\n"; + syswrite( EULAURL, pack( "a*x", $urlEULA ) ); + close EULAURL; +} + +my $TWLSYSTEM_ROOT; + +# 環境変数のキーにTWLSYSTEM_ROOTがあるか +if (exists($ENV{"TWLSYSTEM_ROOT"}) ){ + $TWLSYSTEM_ROOT = $ENV{"TWLSYSTEM_ROOT"}; +}else +{ + deleteTemp(); + die "No TWLSYSTEM_ROOT is found.\n"; +} + +# アーカイブ作成 +{ + system ( "$TWLSYSTEM_ROOT/tools/bin/nnsarc.exe -c $archiveFile $dataDir -s -E .svn" ); +} + +# アーカイブのハッシュの出力 +{ + my $digest; + system ("openssl dgst -sha1 -binary -out $digestFile $archiveFile"); +} + # 署名付加 { - 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" ); + system ( "openssl rsautl -sign -in $digestFile -inkey $KEYROOT/keys/rsa/private_sharedFont.der -keyform DER -out $signFile" ); + system ( "cat $signFile $archiveFile >$outFile" ); deleteTemp(); }