secureswitools/swisistools/test/tinterpretsis/preparesis.pl
changeset 0 ba25891c3a9e
--- /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] <platform> <udeb|urel>
+     -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 = <FILE>;
+	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 <PLATFORM> with the platform and <CFG> with the configuration
+		EditFile("$builddir/$file" , sub { s/<PLATFORM>/$platform/gm;
+						   s/<CONFIGURATION>/$configuration/gm;
+						   s/<BUILD>/$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");
+