mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
共有フォントを1ファイルにまとめて管理するよう変更。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1332 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
1c786636b6
commit
d8d210fe72
@ -26,7 +26,7 @@ FONTS = TWL_BF00_l.NFTR \
|
||||
TWL_BF00_s.NFTR
|
||||
FONT_RSC = $(addprefix $(FONT_DIR)/, $(FONTS))
|
||||
|
||||
ifdef $(TWL_IPL_RED_PRIVATE_ROOT)
|
||||
ifneq ($(TWL_IPL_RED_PRIVATE_ROOT),)
|
||||
FONT_TABLE = TWLFontTable.dat
|
||||
endif
|
||||
|
||||
@ -36,7 +36,7 @@ GEN_FONT_TABLE = $(SYSMENU_TOOLSDIR)/bin/genFontTable.plx
|
||||
#INSTALL_TARGETS = $(FONT_TABLE)
|
||||
#INSTALL_DIR = $(FONT_TABLE)/build/tools/TwlNMenu/data
|
||||
|
||||
LDIRT_CLEAN = $(FONT_TABLE) $(FONTS)
|
||||
LDIRT_CLEAN = $(FONT_TABLE)
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
@ -46,6 +46,5 @@ do-build : $(FONT_TABLE)
|
||||
|
||||
$(FONT_TABLE): $(FONT_RSC)
|
||||
$(GEN_FONT_TABLE) $(FONT_RSC)
|
||||
cp $(FONT_RSC) ./
|
||||
|
||||
#===== End of Makefile =====
|
||||
|
||||
@ -3,22 +3,25 @@
|
||||
######################################################################
|
||||
# genFontTable.pl
|
||||
#
|
||||
# attach signature to firmware file
|
||||
# generate Secure Shared Font Data Table
|
||||
#
|
||||
# [[ HEADER FORMAT ]]
|
||||
# Header
|
||||
# TimeStamp ( 4 bytes) : number of file sections
|
||||
# number ( 2 bytes) : number of font files
|
||||
# padding ( 26 bytes) :
|
||||
#
|
||||
# security code (128 bytes) : RSA signature of Header
|
||||
#
|
||||
# section information ( 48 bytes * number)
|
||||
# fileName ( 24 bytes) : font file name
|
||||
# Header ( 32 bytes)
|
||||
# TimeStamp ( 4 bytes) : date %y%m%d%H
|
||||
# number ( 2 bytes) : number of font files
|
||||
# padding ( 6 bytes) :
|
||||
# padding ( 20 bytes) : SHA1 digest of Font info table
|
||||
#
|
||||
# Font info table ( 64 bytes * number)
|
||||
# fileName ( 32 bytes) : font file name
|
||||
# padding ( 4 bytes) :
|
||||
# file offset ( 4 bytes) : file offset of Font data
|
||||
# length ( 4 bytes) : length of file (bytes)
|
||||
# digest ( 20 bytes) : WLAN FW=2 DATAPATCH=5 signature = 128
|
||||
# digest ( 20 bytes) : SHA1 digest of Font data
|
||||
#
|
||||
# note: each section image is aligned to 48 bytes.
|
||||
# note: each section image is aligned to 32 bytes.
|
||||
#
|
||||
######################################################################
|
||||
|
||||
@ -31,19 +34,99 @@ if ($#ARGV < 1) {
|
||||
}
|
||||
|
||||
my $outFile = "TWLFontTable.dat";
|
||||
my $infoFile = "info.bin";
|
||||
my $headerFile = "header.bin";
|
||||
my $digestFile = "sha1.bin";
|
||||
my $signFile = "sign.bin";
|
||||
my $tempFile = "temp.bin";
|
||||
|
||||
# 後始末
|
||||
sub deleteTemp {
|
||||
system ("rm -f $infoFile");
|
||||
system ("rm -f $headerFile");
|
||||
system ("rm -f $digestFile");
|
||||
system ("rm -f $signFile");
|
||||
system ("rm -f $tempFile");
|
||||
}
|
||||
|
||||
my $signSize = 0x80;
|
||||
my $headerSize = 0x30;
|
||||
|
||||
# 要素数算出
|
||||
my $num = 0;
|
||||
foreach ( @ARGV ) {
|
||||
$num++;
|
||||
}
|
||||
|
||||
# 情報テーブルの出力
|
||||
{
|
||||
my $elementSize = 0x40;
|
||||
my $fileNameMax = 0x20;
|
||||
my $padLen = 0x04;
|
||||
# offset length = 0x04;
|
||||
# file length = 0x04;
|
||||
my $sha1Len = 0x14;
|
||||
|
||||
open INFO, ">$infoFile" or die;
|
||||
binmode INFO;
|
||||
|
||||
# オフセット算出
|
||||
my $offset = $signSize + $headerSize + $num * $elementSize;
|
||||
if( ( $offset % 32 ) > 0 ) { $offset += 32 - ( $offset % 32 ); }
|
||||
|
||||
foreach ( @ARGV ) {
|
||||
# ファイルネームの出力
|
||||
if( !( -e $_ ) ) {
|
||||
close( INFO );
|
||||
deleteTemp();
|
||||
die "file not exist. : $_\n";
|
||||
}
|
||||
my $name = basename( $_ );
|
||||
if( length $name >= $fileNameMax ) {
|
||||
close( INFO );
|
||||
deleteTemp();
|
||||
die "file name length must be smaller than $fileNameMax. : $_\n";
|
||||
}
|
||||
my $data = pack( "a$fileNameMax", $name );
|
||||
syswrite( INFO, $data, $fileNameMax );
|
||||
|
||||
# パディングの出力
|
||||
syswrite( INFO, pack( "x$padLen") );
|
||||
|
||||
# ファイルオフセットの出力
|
||||
$data = pack( "L", $offset );
|
||||
syswrite( INFO, $data, 4 );
|
||||
|
||||
# ファイル長の出力
|
||||
$data = pack( "L", -s $_ );
|
||||
syswrite( INFO, $data, 4 );
|
||||
|
||||
# ファイルのSHA1ハッシュの出力
|
||||
{
|
||||
my $digest;
|
||||
system ("openssl dgst -sha1 -binary -out $digestFile $_");
|
||||
open DIGEST, $digestFile or die;
|
||||
binmode DIGEST;
|
||||
sysread( DIGEST, $digest, $sha1Len );
|
||||
close DIGEST;
|
||||
syswrite( INFO, $digest, $sha1Len );
|
||||
}
|
||||
|
||||
printf "%s\t0x%08x\t0x%08x\n", $_, $offset, -s $_;
|
||||
|
||||
# オフセット加算
|
||||
$offset += -s $_;
|
||||
if( ( $offset % 32 ) > 0 ) { $offset += 32 - ( $offset % 32 ); }
|
||||
}
|
||||
close INFO;
|
||||
}
|
||||
|
||||
# ヘッダの出力
|
||||
{
|
||||
# timestampLen = 0x08;
|
||||
# elementNumLen = 0x02;
|
||||
my $padLen = 0x06;
|
||||
my $sha1Len = 0x14;
|
||||
|
||||
open HEADER, ">$headerFile" or die;
|
||||
binmode HEADER;
|
||||
@ -53,47 +136,20 @@ sub deleteTemp {
|
||||
syswrite( HEADER, pack( "H8", $date ) );
|
||||
|
||||
# 要素数の出力
|
||||
my $num = 0;
|
||||
foreach ( @ARGV ) {
|
||||
$num++;
|
||||
}
|
||||
syswrite( HEADER, pack( "S", $num ) );
|
||||
|
||||
# パディングの出力
|
||||
syswrite( HEADER, pack( "x26") );
|
||||
syswrite( HEADER, pack( "x$padLen") );
|
||||
|
||||
foreach ( @ARGV ) {
|
||||
# ファイルネームの出力
|
||||
my $fileNameMax = 0x18;
|
||||
if( !( -e $_ ) ) {
|
||||
close( HEADER );
|
||||
deleteTemp();
|
||||
die "file not exist. : $_\n";
|
||||
}
|
||||
my $name = basename( $_ );
|
||||
if( length $name >= $fileNameMax ) {
|
||||
close( HEADER );
|
||||
deleteTemp();
|
||||
die "file name length must be smaller than $fileNameMax. : $_\n";
|
||||
}
|
||||
my $data = pack( "a$fileNameMax", $name );
|
||||
syswrite( HEADER, $data, $fileNameMax );
|
||||
|
||||
# ファイル長の出力
|
||||
$data = pack( "L", -s $_ );
|
||||
syswrite( HEADER, $data, 4 );
|
||||
|
||||
# ファイルのSHA1ハッシュの出力
|
||||
{
|
||||
my $sha1Len = 20;
|
||||
my $digest;
|
||||
system ("openssl dgst -sha1 -binary -out $digestFile $_");
|
||||
open DIGEST, $digestFile or die;
|
||||
binmode DIGEST;
|
||||
sysread( DIGEST, $digest, $sha1Len );
|
||||
close DIGEST;
|
||||
syswrite( HEADER, $digest, $sha1Len );
|
||||
}
|
||||
# 情報テーブルのSHA1ハッシュの出力
|
||||
{
|
||||
my $digest;
|
||||
system ("openssl dgst -sha1 -binary -out $digestFile $infoFile");
|
||||
open DIGEST, $digestFile or die;
|
||||
binmode DIGEST;
|
||||
sysread( DIGEST, $digest, $sha1Len );
|
||||
close DIGEST;
|
||||
syswrite( HEADER, $digest, $sha1Len );
|
||||
}
|
||||
close HEADER;
|
||||
}
|
||||
@ -113,7 +169,38 @@ if (!$KEYROOT) {
|
||||
{
|
||||
system ( "openssl dgst -sha1 -binary -out $digestFile $headerFile" );
|
||||
system ( "openssl rsautl -sign -in $digestFile -inkey $KEYROOT/keys/rsa/private9_1.der -keyform DER -out $signFile" );
|
||||
system ( "cat $signFile $headerFile >$outFile" );
|
||||
system ( "cat $signFile $headerFile >$tempFile" );
|
||||
system ( "cat $tempFile $infoFile >$outFile" );
|
||||
deleteTemp();
|
||||
}
|
||||
|
||||
|
||||
# フォントの出力
|
||||
{
|
||||
open FONTTABLE, ">>$outFile" or die;
|
||||
binmode FONTTABLE;
|
||||
|
||||
{
|
||||
# パディング出力
|
||||
my $fileLen = -s $outFile;
|
||||
my $padNum = ( $fileLen % 32 ) ? ( 32 - ( $fileLen % 32 ) ) : 0;
|
||||
my $padding = pack( "x$padNum" );
|
||||
syswrite( FONTTABLE, $padding, $padNum );
|
||||
}
|
||||
|
||||
foreach ( @ARGV ) {
|
||||
# フォント出力
|
||||
my $fileLen = -s $_;
|
||||
open TEST, $_ or die;
|
||||
binmode TEST;
|
||||
sysread ( TEST, $buffer, $fileLen );
|
||||
close TEST;
|
||||
syswrite( FONTTABLE, $buffer, $fileLen );
|
||||
|
||||
# パディング出力
|
||||
my $padNum = ( $fileLen % 32 ) ? ( 32 - ( $fileLen % 32 ) ) : 0;
|
||||
my $padding = pack( "x$padNum" );
|
||||
syswrite( FONTTABLE, $padding, $padNum );
|
||||
}
|
||||
close FONTTABLE;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user