バージョンファイル関係更新

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1817 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-07-08 07:34:04 +00:00
parent b4e285d208
commit de01bc3833
8 changed files with 132 additions and 102 deletions

View File

@ -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 $@

View File

@ -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();
}