diff -r 000000000000 -r ba25891c3a9e secureswitools/swisistools/test/tinterpretsis/preparesis.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/secureswitools/swisistools/test/tinterpretsis/preparesis.pl Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,293 @@ +# +# Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +use Cwd; +use strict; +use Getopt::Std; +use File::Basename; +use File::Copy; # for future portability + +# Note that although Win32 internally will quite happily accept +# forward slashes as directory separators, both cmd.exe and +# makesis.exe/signsis.exe interpret these as option separators, +# so use backslashes when calling these programs. + +die "EPOCROOT not defined" if !defined ($ENV{EPOCROOT}); +my $makesis = "$ENV{EPOCROOT}epoc32\\tools\\makesis.exe"; +my $signsis = "$ENV{EPOCROOT}epoc32\\tools\\signsis.exe"; +if ( ! -x $makesis || ! -x $signsis ) { + die "$makesis and $signsis are not executable"; +} + +my %opt; +getopts( "vch:", \%opt ) or usage(); + +my $platform = lc($ARGV[0]); +my $configuration = lc($ARGV[1]); +my $packagedir = "$ENV{EPOCROOT}epoc32\\winscw\\c\\tswi\\tinterpretsis\\pkg"; +my $builddir = "$ENV{EPOCROOT}epoc32\\winscw\\c\\tswi\\tinterpretsis\\sis_${platform}_${configuration}"; +my $log = "$ENV{EPOCROOT}epoc32\\winscw\\c\\tswi\\tinterpretsis\\logfile.txt"; + +usage() if $opt{h}; +clean() if $opt{c}; +usage() if !defined($ARGV[0]) || !defined($ARGV[1]); + +# -------------------------------------------------------------------------- + +sub usage() { + print STDERR << "EOF"; + usage: $0 [-hcv] + -h : this (help) message + -v : verbose output + -c : clean up signed .sis files +EOF + exit; +} + +# -------------------------------------------------------------------------- + +sub clean() { + foreach my $file (getFiles($builddir, "\.pkg\$")) { unlink("$builddir/$file"); } + foreach my $file (getFiles($builddir, "\.sis\$")) { unlink("$builddir/$file"); } + exit; +} + +# -------------------------------------------------------------------------- + +sub mtime($) { + my ($file) = shift; + my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev, + $size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($file); + + $mtime = 0 if ! defined( $mtime ); + return $mtime; +} + +# -------------------------------------------------------------------------- + +# Return an array of files matching a regexp in a directory +sub getFiles($$) { + my $dir = shift; + my $regfiles = shift; + my @files; + + if ( opendir DIR, $dir ) { + @files = grep (/$regfiles/, readdir(DIR)); + closedir DIR; + } + return @files; +} + +# -------------------------------------------------------------------------- + +# Edit a file +sub EditFile ($$) { + my ($file, $coderef) = @_; + local $_ = ReadFile($file); + &$coderef(); + WriteFile($file, $_); +} + +# -------------------------------------------------------------------------- + +# Read the contents of a file into a string and return it +sub ReadFile ($) { + my ($file) = @_; + open FILE, "<$file" or die "Can't read from $file: $!"; + local $/ = undef; + my $data = ; + close FILE; + return $data; +} + +# -------------------------------------------------------------------------- + +# Replace a file with a string +sub WriteFile ($$) { + my ($file, $data) = @_; + + # Ensure directory exists + if ($file =~ basename($1) && ! -e $1) { + mkdir($1); + } + + system("attrib -r $file"); + open FILE, ">$file" or die "Can't write to $file: $!"; + print FILE $data; + close FILE; +} + +# -------------------------------------------------------------------------- + +print "\nBuilding test executables for $platform $configuration configuration\n\n"; + +if ($platform =~ /armv5/i) +{ + mkdir("/epoc32/winscw/c/tswi/tinterpretsis/data/armv5/"); +} + +mkdir($builddir); + + +print "Processing files in directory: $builddir\n\n"; + +foreach my $file ( getFiles( $packagedir, "\.pkg\$" )) { + + # Copy package files to builddir if not present or package more recent. + # Some package files are re-written with platform, config and builddir. + # + if ( mtime("$packagedir/$file") > mtime("$builddir/$file") ) + { + print "Copying $packagedir/$file to $builddir/$file and re-writing\n" if $opt{v}; + copy("$packagedir/$file", "$builddir/$file"); + + # replace with the platform and with the configuration + EditFile("$builddir/$file" , sub { s//$platform/gm; + s//$configuration/gm; + s//$builddir/gm; }); + } + # Run makesis/signsis if needed on package files + # + $file =~ s/\.pkg//; + if ( mtime("$builddir/$file.sis") < mtime("$builddir/$file.pkg") + || mtime("$builddir/$file.sis") < mtime("$ENV{EPOCROOT}epoc32\\winscw\\c\\tswi\\tinterpretsis\\certs\\default.cer") + || mtime("$builddir/$file.sis") < mtime("$ENV{EPOCROOT}epoc32\\winscw\\c\\tswi\\tinterpretsis\\certs\\default.key") + || mtime("$builddir/$file.sis") < mtime($makesis) + || mtime("$builddir/$file.sis") < mtime($signsis)) + { + # build sis file + system ("$makesis $builddir\\$file.pkg $builddir\\$file-tmp.sis"); + print ("$makesis $builddir\\$file.pkg $builddir\\$file-tmp.sis\n") if $opt{v}; + system("$signsis -s $builddir\\$file-tmp.sis $builddir\\$file.sis $ENV{EPOCROOT}epoc32\\winscw\\c\\tswi\\tinterpretsis\\certs\\default.cer $ENV{EPOCROOT}epoc32\\winscw\\c\\tswi\\tinterpretsis\\certs\\default.key"); + print ("$signsis -s $builddir\\$file-tmp.sis $builddir\\$file.sis $ENV{EPOCROOT}epoc32\\winscw\\c\\tswi\\tinterpretsis\\certs\\default.cer $ENV{EPOCROOT}epoc32\\winscw\\c\\tswi\\tinterpretsis\\certs\\default.key\n") if $opt{v}; + print "\n" if $opt{v}; + } else { + print ("$builddir/$file.sis is up-to-date\n"); + } + + # If the package file contains the string "CREATE_UNSIGNED_SIS" + # copy the unsigned sis file too. Note that these SIS files are + # not currently added to the ROM, since we can't change the + # swipolicy file on the fly on the ROM. + + if (grep(/CREATE_UNSIGNED_SIS/, ReadFile("$builddir/$file.pkg"))) + { + rename("$builddir/$file-tmp.sis", "$builddir/$file-unsigned.sis"); + } else { + unlink("$builddir/$file-tmp.sis"); + } + + +} + + +# Keep original method names for ease of merging/compatibility +sub SignFile($$$$) { SignFileLen(1, @_); } +sub SignFile2($$$$) { SignFileLen(2, @_); } + +sub SignFileLen($$$$$) +{ + my ($len, $infile, $outfile, $signwith, $iby) = @_; + my $certpath="$ENV{'SECURITYSOURCEDIR'}\\installationservices\\switestfw\\testcertificates\\swi\\test\\tsisfile\\data\\signedsis"; + my $keypath = "$ENV{'SECURITYSOURCEDIR'}\\installationservices\\swi\\test\\tsisfile\\data\\signedsis"; + my $sispath=$builddir; + + + my $type="rsa"; + if ($signwith =~ /DSA/i) { + $type="dsa"; + } + + my $pemfile = "$certpath\\$signwith\\cert_chain_$type\_len$len\\chain_$type\_len$len.cert.pem "; + my $keyfile = "$keypath\\$signwith\\cert_chain_$type\_len$len\\" . $type . "$len.key"; + + # If infile, keyfile, pemfile or signsis.exe is more recent than + # outfile, or outfile is non-existent then sign the sis file. + # + if ( mtime("$sispath/$outfile") < mtime("$sispath/$infile") + || mtime("$sispath/$outfile") < mtime("$signsis") + || mtime("$sispath/$outfile") < mtime("$pemfile") + || mtime("$sispath/$outfile") < mtime("$keyfile")) { + printf("\t$infile with $signwith to $outfile\n"); + my $cmd = "$signsis -s $sispath\\$infile $sispath\\$outfile $pemfile $keyfile"; + system($cmd); + print "$cmd\n\n" if $opt{v}; + } else { + print("$sispath/$outfile is up-to-date\n"); + } +} + + +sub SignFileWithSpecifiedCert($$$$$) +{ + + my ($infile, $outfile, $signcert, $signkey, $iby) = @_; + my $certpath="$ENV{'SECURITYSOURCEDIR'}\\installationservices\\switestfw\\testcertificates\\swi\\test\\tsisfile\\data\\signedsis"; + my $keypath = "$ENV{'SECURITYSOURCEDIR'}\\installationservices\\swi\\test\\tsisfile\\data\\signedsis"; + + if ($signkey =~ /\.pem$/) + { + $keypath = "$ENV{'SECURITYSOURCEDIR'}\\installationservices\\switestfw\\testcertificates\\swi\\test\\tsisfile\\data\\signedsis"; + } + + my $sispath=$builddir; + + if ( mtime("$sispath/$outfile") < mtime("$sispath/$infile") + || mtime("$sispath/$outfile") < mtime("$signsis") + || mtime("$sispath/$outfile") < mtime("$keypath/$signkey") + || mtime("$sispath/$outfile") < mtime("$certpath/$signcert")) { + printf("\t$infile with $signcert and $signkey to $outfile\n"); + my $cmd = "$signsis -s $sispath\\$infile $sispath\\$outfile $certpath\\$signcert $keypath\\$signkey"; + system($cmd); + print "$cmd\n\n" if $opt{v}; + } else { + print("$sispath/$outfile is up-to-date\n"); + } +} + + +# +# Sign the files as necessary for the following tests +# + +printf("Signing files...\n"); +SignFile("exe.sis", "exe_s.sis", "Root5CA",\*iby); +SignFile("dll_exe_dup_sid.sis", "dll_exe_dup_sid_s.sis", "Root5CA",\*iby); +SignFile("dll_dll_dup_sid.sis", "dll_dll_dup_sid_s.sis", "Root5CA",\*iby); +SignFile("eclipse.sis", "eclipse_s.sis", "Root5CA",\*iby); +SignFile("partial.sis", "partial_s.sis", "Root5CA",\*iby); +SignFile("patch.sis", "patch_s.sis", "Root5CA",\*iby); +SignFile("overwrite.sis", "overwrite_s.sis", "Root5CA",\*iby); +SignFile("private_fail.sis", "private_fail_s.sis", "Root5CA",\*iby); +SignFile("duplicate_sid.sis", "duplicate_sid_s.sis", "Root5CA",\*iby); +SignFile("depend1.sis", "depend1_s.sis", "Root5CA",\*iby); +SignFile("depend2.sis", "depend2_s.sis", "Root5CA",\*iby); +SignFile("depend3.sis", "depend3_s.sis", "Root5CA",\*iby); +SignFile("depend4.sis", "depend4_s.sis", "Root5CA",\*iby); +SignFile("depend5.sis", "depend5_s.sis", "Root5CA",\*iby); +SignFile("depend6.sis", "depend6_s.sis", "Root5CA",\*iby); +SignFile("functions_base.sis", "functions_base_s.sis", "Root5CA",\*iby); +SignFile("functions.sis", "functions_s.sis", "Root5CA",\*iby); +SignFile("stub_file_depend.sis", "stub_file_depend_s.sis", "Root5CA",\*iby); +SignFile("fn_flag.sis", "fn_flag_s.sis", "Root5CA",\*iby); +SignFile("testconfig.sis", "testconfig_s.sis", "Root5CA",\*iby); + +# DEF070572 - SIS files signed by multiple chains to test OCSP result dialog +#SignFileWithSpecifiedCert("tswinocapability_Root5.sis", "testocspresultdialog_a.sis", "SymbianTestRootExpiredCARSA\\cacert.pem", "SymbianTestRootExpiredCARSA\\cakey.pem", \*iby); +#SignFileWithSpecifiedCert("testocspresultdialog_a.sis", "testocspresultdialog_b.sis", "..\\..\\..\\tdevcerts\\SymbianTestRootCARSA_OCSP\\SymbianTestRootCARSA\\certs\\revoked_user_caps.cert.pem", "..\\..\\..\\tdevcerts\\SymbianTestRootCARSA_OCSP\\SymbianTestRootCARSA\\certs\\revoked_user_caps.key.pem", \*iby); + +printf("\n"); +