#!/usr/bin/perl -w use strict; use File::Basename; # バイナリファイルをCソースに変換 my $KEY_VER = 1; my $srcfname = $ARGV[0]; my $dstfname_c; my $dstfname_h; my $arrayname; my $size; if( !$ARGV[0] || !$ARGV[1] ) { die "parameter error.\n"; } $_ = "cr_" . basename($srcfname, ""); s/(\..*)/_$ARGV[1]\.c/; $dstfname_c = $_; #s/(\..*)/\.h/; #$dstfname_h = $_; s/(\..*)//; $arrayname = $_; $size = -s $srcfname; open SRC, "< $srcfname" or die "Cannot open file $srcfname : $!"; open DST, "> $dstfname_c" or die "Cannot open file temp : $!"; #open DST2, "> $dstfname_h" # or die "Cannot open file temp : $!"; binmode( SRC ); # $sizeが16byte超(AES鍵でない)なら、配列サイズを + magic_code(8) + keyLen(2) + padding(6) し、16bytesでROUNDUP my $array_size = ( $size + 16 + 15) & 0xfffffff0; # .c ファイルに変換して出力 printf DST "#include \n\n"; printf DST "\/\/下記配列は、KEYデータの前に magic_code[8] + keyLen[2] + keyVer[1] + padding[5] のデータが挿入されています。\n\n"; printf DST "const unsigned char %s[ 0x%x ] = {\n\t", $arrayname, $array_size; # magic code my $magic_priv = "REDCODER"; my $magic_pub = "REDCODEU"; my @magic_list; if( $srcfname =~ m/priv/ ) { @magic_list = unpack( "H2H2H2H2H2H2H2H2", $magic_priv ); }else { @magic_list = unpack( "H2H2H2H2H2H2H2H2", $magic_pub ); } foreach my $elem ( @magic_list ) { printf DST "0x%s, ", $elem; } # サイズ printf DST "0x%02x, ", $size % 256; printf DST "0x%02x, ", $size / 256; # KEYバージョン printf DST "0x%02x, ", $KEY_VER; # パディング my $i; for ( $i = 0; $i < 5; $i++) { printf DST "0x%02x, ", rand(255); } # KEY実体 my $buff; my $count = 0; while( sysread( SRC, $buff, 1 ) ) { my $src = unpack( "C", $buff ); print DST "\n\t" if( ( $count & 0x0f ) == 0 ); printf DST "0x%02x, ", $src; $count++; } print DST "\n};\n"; close SRC; close DST; # .h ファイルも出力 #printf DST2 "extern const unsigned char %s[ 0x%x ];\n", $arrayname, $array_size; #close DST2;