summaryrefslogtreecommitdiffstats
path: root/util
diff options
context:
space:
mode:
Diffstat (limited to 'util')
-rw-r--r--util/fips_standalone_sha132
-rw-r--r--util/fipsas.pl52
-rw-r--r--util/fipsdist.pl2
-rw-r--r--util/fipslink.pl13
-rwxr-xr-xutil/hmac_sha1.pl196
-rwxr-xr-xutil/mk1mf.pl53
-rwxr-xr-xutil/msincore169
-rw-r--r--util/pl/TI_CGTOOLS.pl274
-rw-r--r--util/pl/VC-32.pl11
9 files changed, 748 insertions, 54 deletions
diff --git a/util/fips_standalone_sha1 b/util/fips_standalone_sha1
new file mode 100644
index 0000000000..ea2268cb4e
--- /dev/null
+++ b/util/fips_standalone_sha1
@@ -0,0 +1,32 @@
+#!/usr/bin/env perl
+#
+$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
+
+unshift(@INC,$dir);
+require "hmac_sha1.pl";
+
+(!@ARV[0] && -f @ARGV[$#ARGV]) || die "usage: $0 [-verify] file";
+
+$verify=shift if (@ARGV[0] eq "-verify");
+
+sysopen(FD,@ARGV[0],0) || die "$!";
+binmode(FD);
+
+my $ctx = HMAC->Init("etaonrishdlcupfm");
+
+while (read(FD,$blob,4*1024)) { $ctx->Update($blob); }
+
+close(FD);
+
+my $signature = unpack("H*",$ctx->Final());
+
+print "HMAC-SHA1(@ARGV[0])= $signature\n";
+
+if ($verify) {
+ open(FD,"<@ARGV[0].sha1") || die "$!";
+ $line = <FD>;
+ close(FD);
+ exit(0) if ($line =~ /HMAC\-SHA1\([^\)]*\)=\s*([0-9a-f]+)/i &&
+ $1 eq $signature);
+ die "signature mismatch";
+}
diff --git a/util/fipsas.pl b/util/fipsas.pl
index 2734a20181..9dfe0d895c 100644
--- a/util/fipsas.pl
+++ b/util/fipsas.pl
@@ -8,9 +8,6 @@ my @ARGS = @ARGV;
my $top = shift @ARGS;
my $target = shift @ARGS;
-my $tmptarg = $target;
-
-$tmptarg =~ s/\.[^\\\/\.]+$/.tmp/;
my $runasm = 1;
@@ -40,43 +37,31 @@ while (<IN>)
last if (/assembler/)
}
-# Store all renames.
+# Store all renames [noting minimal length].
+my $minlen=0x10000;
while (<IN>)
{
- if (/^#define\s+(\w+)\s+(\w+)\b/)
+ if (/^#define\s+_?(\w+)\s+_?(\w+)\b/)
{
$edits{$1} = $2;
+ my $len = length($1);
+ $minlen = $len if ($len<$minlen);
}
}
-my ($from, $to);
-
-#delete any temp file lying around
+open(IN,"$target") || die "Can't open $target for reading";
-unlink $tmptarg;
+@code = <IN>; # suck in whole file
-#rename target temporarily
-my $rencnt = 0;
-# On windows the previous file doesn't always close straight away
-# so retry the rename operation a few times if it fails.
-while (!rename($target, $tmptarg))
- {
- sleep 2;
- die "Can't rename $target" if ($rencnt++ > 10);
- }
+close IN;
-#edit target
-open(IN,$tmptarg) || die "Can't open temporary file";
-open(OUT, ">$target") || die "Can't open output file $target";
+open(OUT,">$target") || die "Can't open $target for writing";
-while (<IN>)
-{
- while (($from, $to) = each %edits)
- {
- s/(\b_*)$from(\b)/$1$to$2/g;
- }
- print OUT $_;
-}
+foreach $line (@code)
+ {
+ $line =~ s/\b(_?)(\w{$minlen,})\b/$1.($edits{$2} or $2)/geo;
+ print OUT $line;
+ }
close OUT;
@@ -87,14 +72,5 @@ if ($runasm)
my $rv = $?;
- # restore target
- unlink $target;
- rename $tmptarg, $target;
-
die "Error executing assembler!" if $rv != 0;
}
-else
- {
- # Don't care about target
- unlink $tmptarg;
- }
diff --git a/util/fipsdist.pl b/util/fipsdist.pl
index e10a2fe8cf..53f9d3e18a 100644
--- a/util/fipsdist.pl
+++ b/util/fipsdist.pl
@@ -58,7 +58,7 @@ while (<STDIN>)
}
else
{
- next unless (/^(fips\/|crypto|util|test|include|ms)/);
+ next unless (/^(fips\/|crypto|util|test|include|ms|c6x)/);
}
if (/^crypto\/([^\/]+)/)
{
diff --git a/util/fipslink.pl b/util/fipslink.pl
index 4f47efa39c..331c456878 100644
--- a/util/fipslink.pl
+++ b/util/fipslink.pl
@@ -27,6 +27,19 @@ if (exists $ENV{"PREMAIN_DSO_EXE"})
$fips_premain_dso = "";
}
+my $fips_sig = $ENV{"FIPS_SIG"};
+if (defined $fips_sig)
+ {
+ if ($fips_premain_dso ne "")
+ {
+ $fips_premain_dso = "$fips_sig -dso";
+ }
+ else
+ {
+ $fips_premain_dso = "$fips_sig -exe";
+ }
+ }
+
check_hash($sha1_exe, "fips_premain.c");
check_hash($sha1_exe, "fipscanister.lib");
diff --git a/util/hmac_sha1.pl b/util/hmac_sha1.pl
new file mode 100755
index 0000000000..494f7e8569
--- /dev/null
+++ b/util/hmac_sha1.pl
@@ -0,0 +1,196 @@
+#!/usr/bin/env perl
+#
+# Copyright (c) 2011 The OpenSSL Project.
+#
+######################################################################
+#
+# SHA1 and HMAC in Perl by <appro@openssl.org>.
+#
+{ package SHA1;
+ use integer;
+
+ {
+ ################################### SHA1 block code generator
+ my @V = ('$A','$B','$C','$D','$E');
+ my $i;
+
+ sub XUpdate {
+ my $ret;
+ $ret="(\$T=\$W[($i-16)%16]^\$W[($i-14)%16]^\$W[($i-8)%16]^\$W[($i-3)%16],\n\t";
+ if ((1<<31)<<1) {
+ $ret.=" \$W[$i%16]=((\$T<<1)|(\$T>>31))&0xffffffff)\n\t ";
+ } else {
+ $ret.=" \$W[$i%16]=(\$T<<1)|((\$T>>31)&1))\n\t ";
+ }
+ }
+ sub tail {
+ my ($a,$b,$c,$d,$e)=@V;
+ my $ret;
+ if ((1<<31)<<1) {
+ $ret.="(($a<<5)|($a>>27));\n\t";
+ $ret.="$b=($b<<30)|($b>>2); $e&=0xffffffff; #$b&=0xffffffff;\n\t";
+ } else {
+ $ret.="(($a<<5)|($a>>27)&0x1f);\n\t";
+ $ret.="$b=($b<<30)|($b>>2)&0x3fffffff;\n\t";
+ }
+ $ret;
+ }
+ sub BODY_00_15 {
+ my ($a,$b,$c,$d,$e)=@V;
+ "$e+=\$W[$i]+0x5a827999+((($c^$d)&$b)^$d)+".tail();
+ }
+ sub BODY_16_19 {
+ my ($a,$b,$c,$d,$e)=@V;
+ "$e+=".XUpdate()."+0x5a827999+((($c^$d)&$b)^$d)+".tail();
+ }
+ sub BODY_20_39 {
+ my ($a,$b,$c,$d,$e)=@V;
+ "$e+=".XUpdate()."+0x6ed9eba1+($b^$c^$d)+".tail();
+ }
+ sub BODY_40_59 {
+ my ($a,$b,$c,$d,$e)=@V;
+ "$e+=".XUpdate()."+0x8f1bbcdc+(($b&$c)|(($b|$c)&$d))+".tail();
+ }
+ sub BODY_60_79 {
+ my ($a,$b,$c,$d,$e)=@V;
+ "$e+=".XUpdate()."+0xca62c1d6+($b^$c^$d)+".tail();
+ }
+
+ my $sha1_impl =
+ 'sub block {
+ my $self = @_[0];
+ my @W = unpack("N16",@_[1]);
+ my ($A,$B,$C,$D,$E,$T) = @{$self->{H}};
+ ';
+
+ $sha1_impl.='
+ $A &= 0xffffffff;
+ $B &= 0xffffffff;
+ ' if ((1<<31)<<1);
+
+ for($i=0;$i<16;$i++){ $sha1_impl.=BODY_00_15(); unshift(@V,pop(@V)); }
+ for(;$i<20;$i++) { $sha1_impl.=BODY_16_19(); unshift(@V,pop(@V)); }
+ for(;$i<40;$i++) { $sha1_impl.=BODY_20_39(); unshift(@V,pop(@V)); }
+ for(;$i<60;$i++) { $sha1_impl.=BODY_40_59(); unshift(@V,pop(@V)); }
+ for(;$i<80;$i++) { $sha1_impl.=BODY_60_79(); unshift(@V,pop(@V)); }
+
+ $sha1_impl.='
+ $self->{H}[0]+=$A; $self->{H}[1]+=$B; $self->{H}[2]+=$C;
+ $self->{H}[3]+=$D; $self->{H}[4]+=$E; }';
+
+ #print $sha1_impl,"\n";
+ eval($sha1_impl); # generate code
+ }
+
+ sub Init {
+ my $class = shift; # multiple instances...
+ my $self = {};
+
+ bless $self,$class;
+ $self->{H} = [0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0];
+ $self->{N} = 0;
+ return $self;
+ }
+
+ sub Update {
+ my $self = shift;
+ my $msg;
+
+ foreach $msg (@_) {
+ my $len = length($msg);
+ my $num = length($self->{buf});
+ my $off = 0;
+
+ $self->{N} += $len;
+
+ if (($num+$len)<64)
+ { $self->{buf} .= $msg; next; }
+ elsif ($num)
+ { $self->{buf} .= substr($msg,0,($off=64-$num));
+ $self->block($self->{buf});
+ }
+
+ while(($off+64) <= $len)
+ { $self->block(substr($msg,$off,64));
+ $off += 64;
+ }
+
+ $self->{buf} = substr($msg,$off);
+ }
+ return $self;
+ }
+
+ sub Final {
+ my $self = shift;
+ my $num = length($self->{buf});
+
+ $self->{buf} .= chr(0x80); $num++;
+ if ($num>56)
+ { $self->{buf} .= chr(0)x(64-$num);
+ $self->block($self->{buf});
+ $self->{buf}=undef;
+ $num=0;
+ }
+ $self->{buf} .= chr(0)x(56-$num);
+ $self->{buf} .= pack("N2",($self->{N}>>29)&0x7,$self->{N}<<3);
+ $self->block($self->{buf});
+
+ return pack("N*",@{$self->{H}});
+ }
+
+ sub Selftest {
+ my $hash;
+
+ $hash=SHA1->Init()->Update('abc')->Final();
+ die "SHA1 test#1" if (unpack("H*",$hash) ne 'a9993e364706816aba3e25717850c26c9cd0d89d');
+
+ $hash=SHA1->Init()->Update('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq')->Final();
+ die "SHA1 test#2" if (unpack("H*",$hash) ne '84983e441c3bd26ebaae4aa1f95129e5e54670f1');
+
+ #$hash=SHA1->Init()->Update('a'x1000000)->Final();
+ #die "SHA1 test#3" if (unpack("H*",$hash) ne '34aa973cd4c4daa4f61eeb2bdbad27316534016f');
+ }
+}
+
+{ package HMAC;
+
+ sub Init {
+ my $class = shift;
+ my $key = shift;
+ my $self = {};
+
+ bless $self,$class;
+
+ if (length($key)>64) {
+ $key = SHA1->Init()->Update($key)->Final();
+ }
+ $key .= chr(0x00)x(64-length($key));
+
+ my @ikey = map($_^=0x36,unpack("C*",$key));
+ ($self->{hash} = SHA1->Init())->Update(pack("C*",@ikey));
+ $self->{okey} = pack("C*",map($_^=0x36^0x5c,@ikey));
+
+ return $self;
+ }
+
+ sub Update {
+ my $self = shift;
+ $self->{hash}->Update(@_);
+ return $self;
+ }
+
+ sub Final {
+ my $self = shift;
+ my $ihash = $self->{hash}->Final();
+ return SHA1->Init()->Update($self->{okey},$ihash)->Final();
+ }
+
+ sub Selftest {
+ my $hmac;
+
+ $hmac = HMAC->Init('0123456789:;<=>?@ABC')->Update('Sample #2')->Final();
+ die "HMAC test" if (unpack("H*",$hmac) ne '0922d3405faa3d194f82a45830737d5cc6c75d24');
+ }
+}
+
+1;
diff --git a/util/mk1mf.pl b/util/mk1mf.pl
index af039c78ac..2325607e8f 100755
--- a/util/mk1mf.pl
+++ b/util/mk1mf.pl
@@ -23,6 +23,7 @@ local $fips_canister_path = "";
my $fips_premain_dso_exe_path = "";
my $fips_premain_c_path = "";
my $fips_sha1_exe_path = "";
+my $fips_sha1_exe_build = 1;
local $fipscanisterbuild = 0;
@@ -248,6 +249,10 @@ elsif (($platform eq "netware-clib") || ($platform eq "netware-libc") ||
$BSDSOCK=1 if ($platform eq "netware-libc-bsdsock") || ($platform eq "netware-clib-bsdsock");
require 'netware.pl';
}
+elsif ($platform eq "c64xplus")
+ {
+ require "TI_CGTOOLS.pl";
+ }
else
{
require "unix.pl";
@@ -500,8 +505,16 @@ if ($fips)
{
if ($fips_sha1_exe_path eq "")
{
- $fips_sha1_exe_path =
- "\$(BIN_D)${o}fips_standalone_sha1$exep";
+ $fips_sha1_exe_path = $ENV{"FIPS_SHA1_PATH"};
+ if (defined $fips_sha1_exe_path)
+ {
+ $fips_sha1_exe_build = 0;
+ }
+ else
+ {
+ $fips_sha1_exe_path =
+ "\$(BIN_D)${o}fips_standalone_sha1$exep";
+ }
}
}
else
@@ -545,7 +558,7 @@ if ($fips)
if ($fipscanisteronly)
{
- $build_targets = "\$(O_FIPSCANISTER) \$(T_EXE)";
+ $build_targets = "\$(O_FIPSCANISTER)";
$libs_dep = "";
}
@@ -567,9 +580,14 @@ if ($fipscanisteronly)
\$(CP) \"fips${o}fips_premain.c.sha1\" \"\$(INSTALLTOP)${o}lib\"
\$(CP) \"\$(INCO_D)${o}fips.h\" \"\$(INSTALLTOP)${o}include${o}openssl\"
\$(CP) \"\$(INCO_D)${o}fips_rand.h\" \"\$(INSTALLTOP)${o}include${o}openssl\"
- \$(CP) "\$(BIN_D)${o}fips_standalone_sha1$exep" \"\$(INSTALLTOP)${o}bin\"
\$(CP) \"util${o}fipslink.pl\" \"\$(INSTALLTOP)${o}bin\"
EOF
+ if ($fips_sha1_exe_build)
+ {
+ $extra_install .= <<"EOF";
+ \$(CP) "\$(BIN_D)${o}fips_standalone_sha1$exep" \"\$(INSTALLTOP)${o}bin\"
+EOF
+ }
}
elsif ($shlib)
{
@@ -716,7 +734,7 @@ LIBS_DEP=$libs_dep
EOF
$rules=<<"EOF";
-all: banner \$(TMP_D) \$(BIN_D) \$(TEST_D) \$(LIB_D) \$(INCO_D) headers \$(FIPS_SHA1_EXE) $build_targets
+all: banner \$(TMP_D) \$(BIN_D) \$(TEST_D) \$(LIB_D) \$(INCO_D) headers $build_targets
banner:
$banner
@@ -744,7 +762,11 @@ headers: \$(HEADER) \$(EXHEADER)
lib: \$(LIBS_DEP) \$(E_SHLIB)
-exe: \$(T_EXE) \$(BIN_D)$o\$(E_EXE)$exep
+exe: \$(BIN_D)$o\$(E_EXE)$exep
+
+build_tests: \$(T_EXE)
+
+build_algvs: \$(T_SRC) \$(BIN_D)${o}fips_algvs$exep
install: all
\$(MKDIR) \"\$(INSTALLTOP)\"
@@ -846,6 +868,9 @@ if ($fips)
$rules.=&cc_compile_target("\$(OBJ_D)${o}\$(E_PREMAIN_DSO)$obj",
"fips${o}fips_premain.c",
"-DFINGERPRINT_PREMAIN_DSO_LOAD \$(SHLIB_CFLAGS)");
+ $rules.=&cc_compile_target("\$(OBJ_D)${o}fips_algvs$obj",
+ "test${o}fips_algvs.c",
+ "\$(SHLIB_CFLAGS)");
}
foreach (values %lib_nam)
@@ -878,6 +903,7 @@ EOF
}
$defs.=&do_defs("T_EXE",$test,"\$(TEST_D)",$exep);
+$defs.=&do_defs("T_SRC",$test,"\$(TMP_D)",".c");
foreach (split(/\s+/,$test))
{
my $t_libs;
@@ -899,8 +925,11 @@ foreach (split(/\s+/,$test))
$tt="\$(OBJ_D)${o}$t${obj}";
$rules.=&do_link_rule("\$(TEST_D)$o$t$exep",$tt,"\$(LIBS_DEP)","$t_libs \$(EX_LIBS)", $ltype);
+ $rules.=&do_copy_rule("\$(TMP_D)",$_,".c");
}
+ $rules.=&do_link_rule("\$(TEST_D)${o}fips_algvs$exep","\$(OBJ_D)${o}fips_algvs$obj","\$(LIBS_DEP)","\$(O_FIPSCANISTER) \$(EX_LIBS)", 2) if $fips;
+
$defs.=&do_defs("E_SHLIB",$engines . $otherlibs,"\$(ENG_D)",$shlibp);
foreach (split(/\s+/,$engines))
@@ -955,20 +984,20 @@ if ($fips)
"\$(OBJ_D)${o}fips_start$obj",
"\$(FIPSOBJ)",
"\$(OBJ_D)${o}fips_end$obj",
- "\$(FIPS_SHA1_EXE)", "");
+ "");
# FIXME
$rules.=&do_link_rule("\$(FIPS_SHA1_EXE)",
"\$(OBJ_D)${o}fips_standalone_sha1$obj \$(OBJ_D)${o}sha1dgst$obj $sha1_asm_obj",
- "","\$(EX_LIBS)", 1);
+ "","\$(EX_LIBS)", 1) if $fips_sha1_exe_build;
}
else
{
$rules.=&do_link_rule("\$(FIPS_SHA1_EXE)",
"\$(OBJ_D)${o}fips_standalone_sha1$obj \$(O_FIPSCANISTER)",
- "","", 1);
+ "","", 1) if $fips_sha1_exe_build;
}
- $rules.=&do_link_rule("\$(PREMAIN_DSO_EXE)","\$(OBJ_D)${o}\$(E_PREMAIN_DSO)$obj \$(CRYPTOOBJ) \$(O_FIPSCANISTER)","","\$(EX_LIBS)", 1);
+ $rules.=&do_link_rule("\$(PREMAIN_DSO_EXE)","\$(OBJ_D)${o}\$(E_PREMAIN_DSO)$obj \$(CRYPTOOBJ) \$(O_FIPSCANISTER)","","\$(EX_LIBS)", 1) unless defined $ENV{"FIPS_SIG"};
}
@@ -1192,6 +1221,10 @@ sub do_compile_rule
{
$ret.=&Sasm_compile_target("$to${o}$n$obj",$s,$n);
}
+ elsif (-f ($s="${d}${o}asm${o}${n}.asm"))
+ {
+ $ret.=&cc_compile_target("$to${o}$n$obj","$s",$ex);
+ }
else { die "no rule for $_"; }
}
return($ret);
diff --git a/util/msincore b/util/msincore
new file mode 100755
index 0000000000..08f81be8d5
--- /dev/null
+++ b/util/msincore
@@ -0,0 +1,169 @@
+#!/usr/bin/env perl
+#
+# Copyright (c) 2012 The OpenSSL Project.
+#
+# The script embeds fingerprint into Microsoft PE-COFF executable object.
+
+$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
+
+unshift(@INC,$dir);
+require "hmac_sha1.pl";
+
+######################################################################
+#
+# PE-COFF segment table parser by <appro@openssl.org>.
+#
+{ package PECOFF;
+ use FileHandle;
+
+ sub dup { my %copy=map {$_} @_; return \%copy; }
+
+ sub Load {
+ my $class = shift;
+ my $self = {};
+ my $FD = FileHandle->new(); # autoclose
+ my $file = shift;
+
+ bless $self,$class;
+
+ sysopen($FD,$file,0) or die "$!";
+ binmode($FD);
+
+ #################################################
+ # read IMAGE_DOS_HEADER
+ #
+ read($FD,my $mz,64) or die "$!";
+ my @dos_header=unpack("a2C58V",$mz);
+
+ $!=42; # signal fipsld to revert to two-step link
+ die "$file is not PE-COFF image" if (@dos_header[0] ne "MZ");
+
+ my $e_lfanew=pop(@dos_header);
+ seek($FD,$e_lfanew,0) or die "$!";
+ read($FD,my $magic,4) or die "$!";
+
+ $!=42; # signal fipsld to revert to two-step link
+ die "$file is not PE-COFF image" if (unpack("V",$magic)!=0x4550);
+
+ #################################################
+ # read and parse COFF header...
+ #
+ read($FD,my $coff,20) or die "$!";
+
+ my %coff_header;
+ @coff_header{machine,nsects,date,syms_off,nsyms,opt,flags}=
+ unpack("v2V3v2",$coff);
+
+ my $strings;
+ my $symsize;
+
+ #################################################
+ # load strings table
+ #
+ if ($coff_header{syms_off}) {
+ seek($FD,$coff_header{syms_off}+18*$coff_header{nsyms},0) or die "$!";
+ read($FD,$strings,4) or die "$!";
+ $symsize = unpack("V",$strings);
+ read($FD,$strings,$symsize,4) or die "$!";
+ }
+
+ #################################################
+ # read sections
+ #
+ my $i;
+
+ # seek to section headers
+ seek($FD,$e_lfanew+24+@coff_header{opt},0) or die "$!";
+
+ for ($i=0;$i<$coff_header{nsects};$i++) {
+ my %coff_shdr;
+ my $name;
+
+ read($FD,my $section,40) or die "$!";
+
+ @coff_shdr{sh_name,sh_vsize,sh_vaddr,
+ sh_rawsize,sh_offset,sh_relocs,sh_lines,
+ sh_nrelocls,sh_nlines,sh_flags} =
+ unpack("a8V6v2V",$section);
+
+ $name = $coff_shdr{sh_name};
+ # see if sh_name is an offset in $strings
+ my ($hi,$lo) = unpack("V2",$name);
+ if ($hi==0 && $lo<$symsize) {
+ $name = substr($strings,$lo,64);
+ }
+ $name = (split(chr(0),$name))[0];
+ $coff_shdr{sh_name} = $name;
+
+ $self->{sections}{$name} = dup(%coff_shdr);
+ }
+
+ return $self;
+ }
+
+ sub Lookup {
+ my $self = shift;
+ my $name = shift;
+ return $self->{sections}{$name};
+ }
+}
+
+######################################################################
+#
+# main()
+#
+my $legacy_mode;
+
+if ($#ARGV<0 || ($#ARGV>0 && !($legacy_mode=(@ARGV[0] =~ /^\-(dso|exe)$/)))) {
+ print STDERR "usage: $0 [-dso|-exe] pe-coff-binary\n";
+ exit(1);
+}
+
+$exe = PECOFF->Load(@ARGV[$#ARGV]);
+
+sysopen(FD,@ARGV[$#ARGV],$legacy_mode?0:2) or die "$!"; # 2 is read/write
+binmode(FD);
+
+sub FIPS_incore_fingerprint {
+ my $ctx = HMAC->Init("etaonrishdlcupfm");
+ my ($beg,$end);
+ my $sect;
+
+ $sect = $exe->Lookup("fipstx") or die "no fipstx section";
+
+ seek(FD,$sect->{sh_offset},0) or die "$!";
+ read(FD,$blob,$sect->{sh_vsize}) or die "$!";
+
+ ($beg = index($blob,"SPIFxet_ts_tXtra")) >= 0
+ or die "no FIPS_text_startX";
+ ($end = rindex($blob,"SPIFxet_ne_t][Xd")) >= 0
+ or die "no FIPS_text_endX";
+
+ $ctx->Update(substr($blob,$beg,$end-$beg));
+
+ $sect = $exe->Lookup("fipsro") or die "no fipsro section";
+
+ seek(FD,$sect->{sh_offset},0) or die "$!";
+ read(FD,$blob,$sect->{sh_vsize}) or die "$!";
+
+ ($beg = index($blob,"SPIFdor__atarats",40)) >= 0
+ or die "no FIPS_rodata_start";
+ ($end = rindex($blob,"SPIFdor__ata[dne")) >= 0
+ or die "no FIPS_rodata_end";
+
+ $ctx->Update(substr($blob,$beg,$end-$beg));
+
+ return $ctx->Final();
+}
+
+$fingerprint = FIPS_incore_fingerprint();
+
+if ($legacy_mode) {
+ print unpack("H*",$fingerprint);
+} else {
+ my $sect = $exe->Lookup("fipsro");
+ seek(FD,$sect->{sh_offset},0) or die "$!";
+ print FD unpack("H*",$fingerprint) or die "$!";
+}
+
+close (FD);
diff --git a/util/pl/TI_CGTOOLS.pl b/util/pl/TI_CGTOOLS.pl
new file mode 100644
index 0000000000..d12d318062
--- /dev/null
+++ b/util/pl/TI_CGTOOLS.pl
@@ -0,0 +1,274 @@
+#!/usr/local/bin/perl
+#
+# TI_CGTOOLS.pl, Texas Instruments CGTOOLS under Unix or MSYS.
+#
+
+$ssl= "ssl";
+$crypto="crypto";
+
+if ($fips && !$shlib)
+ {
+ $crypto="fips";
+ $crypto_compat = "cryptocompat.lib";
+ }
+else
+ {
+ $crypto="crypto";
+ }
+
+if ($fipscanisterbuild)
+ {
+ $fips_canister_path = "\$(LIB_D)/fipscanister.obj";
+ }
+
+$o='/';
+$cp='cp';
+$cp2='$(PERL) util/copy.pl -stripcr';
+$mkdir='$(PERL) util/mkdir-p.pl';
+$rm='rm -f';
+
+$zlib_lib="zlib1.lib";
+
+# Santize -L options for ms link
+$l_flags =~ s/-L("\[^"]+")/\/libpath:$1/g;
+$l_flags =~ s/-L(\S+)/\/libpath:$1/g;
+
+# C compiler stuff
+$cc='cl6x';
+$base_cflags= " $mf_cflag";
+my $f;
+$opt_cflags='';
+$dbg_cflags=$f.' -g -DDEBUG -D_DEBUG';
+$lflags='';
+
+*::cc_compile_target = sub {
+ my ($target,$source,$ex_flags)=@_;
+ my $ret;
+
+ $ex_flags.=" -DMK1MF_BUILD" if ($source =~/cversion/);
+ $ret ="$target: \$(SRC_D)$o$source\n\t";
+ if ($fipscanisterbuild && $source=~/\.asm$/) {
+ $ret.="\$(PERL) util${o}fipsas.pl . \$< norunasm \$(CFLAG)\n\t";
+ }
+ $ret.="\$(CC) --obj_directory=\$(OBJ_D) $ex_flags -c \$(SRC_D)$o$source\n";
+ $target =~ s/.*${o}([^${o}]+)/$1/;
+ $source =~ s/.*${o}([^${o}\.]+)\..*/$1${obj}/;
+ $ret.="\tmv \$(OBJ_D)${o}$source \$(OBJ_D)${o}$target\n" if ($target ne $source);
+ $ret.="\n";
+ return($ret);
+};
+*::perlasm_compile_target = sub {
+ my ($target,$source,$bname)=@_;
+ my $ret;
+
+ $bname =~ s/(.*)\.[^\.]$/$1/;
+ $ret=<<___;
+\$(TMP_D)$o$bname.asm: $source
+ \$(PERL) $source \$\@
+___
+ $ret .= "\t\$(PERL) util${o}fipsas.pl . \$@ norunasm \$(CFLAG)\n" if $fipscanisterbuild;
+
+ $ret.=<<___;
+
+$target: \$(TMP_D)$o$bname.asm
+ \$(ASM) --obj_directory=\$(OBJ_D) \$(TMP_D)$o$bname.asm
+
+___
+};
+
+$mlflags='';
+
+$out_def ="c6x";
+$tmp_def ="$out_def/tmp";
+$inc_def="$out_def/inc";
+
+if ($debug)
+ {
+ $cflags=$dbg_cflags.$base_cflags;
+ }
+else
+ {
+ $cflags=$opt_cflags.$base_cflags;
+ }
+
+$obj='.obj';
+$asm_suffix='.asm';
+$ofile="";
+
+# EXE linking stuff
+$link='$(CC) -z';
+$efile="-o ";
+$exep='.out';
+$ex_libs='';
+
+# static library stuff
+$mklib='ar6x';
+$ranlib='';
+$plib="";
+$libp=".lib";
+$shlibp=($shlib)?".dll":".lib";
+$lfile='-o ';
+
+$shlib_ex_obj="";
+$asm='$(CC) $(CFLAG) -c';
+
+$bn_asm_obj='';
+$bn_asm_src='';
+$des_enc_obj='';
+$des_enc_src='';
+$bf_enc_obj='';
+$bf_enc_src='';
+
+if (!$no_asm)
+ {
+ import_asm($mf_bn_asm, "bn", \$bn_asm_obj, \$bn_asm_src);
+ import_asm($mf_aes_asm, "aes", \$aes_asm_obj, \$aes_asm_src);
+ import_asm($mf_des_asm, "des", \$des_enc_obj, \$des_enc_src);
+ import_asm($mf_bf_asm, "bf", \$bf_enc_obj, \$bf_enc_src);
+ import_asm($mf_cast_asm, "cast", \$cast_enc_obj, \$cast_enc_src);
+ import_asm($mf_rc4_asm, "rc4", \$rc4_enc_obj, \$rc4_enc_src);
+ import_asm($mf_rc5_asm, "rc5", \$rc5_enc_obj, \$rc5_enc_src);
+ import_asm($mf_md5_asm, "md5", \$md5_asm_obj, \$md5_asm_src);
+ import_asm($mf_sha_asm, "sha", \$sha1_asm_obj, \$sha1_asm_src);
+ import_asm($mf_rmd_asm, "ripemd", \$rmd160_asm_obj, \$rmd160_asm_src);
+ import_asm($mf_wp_asm, "whrlpool", \$whirlpool_asm_obj, \$whirlpool_asm_src);
+ import_asm($mf_modes_asm, "modes", \$modes_asm_obj, \$modes_asm_src);
+ import_asm($mf_cpuid_asm, "", \$cpuid_asm_obj, \$cpuid_asm_src);
+ $perl_asm = 1;
+ }
+
+sub do_lib_rule
+ {
+ my($objs,$target,$name,$shlib,$ign,$base_addr) = @_;
+ local($ret);
+
+ $taget =~ s/\//$o/g if $o ne '/';
+ my $base_arg;
+ if ($base_addr ne "")
+ {
+ $base_arg= " /base:$base_addr";
+ }
+ else
+ {
+ $base_arg = "";
+ }
+ if ($name ne "")
+ {
+ $name =~ tr/a-z/A-Z/;
+ $name = "/def:ms/${name}.def";
+ }
+
+# $target="\$(LIB_D)$o$target";
+# $ret.="$target: $objs\n";
+ if (!$shlib)
+ {
+# $ret.="\t\$(RM) \$(O_$Name)\n";
+ $ret.="$target: $objs\n";
+ $ret.="\t\$(MKLIB) $lfile$target $objs\n";
+ }
+ else
+ {
+ local($ex)=($target =~ /O_CRYPTO/)?'':' $(L_CRYPTO)';
+ $ex.=" $zlib_lib" if $zlib_opt == 1 && $target =~ /O_CRYPTO/;
+
+ if ($fips && $target =~ /O_CRYPTO/)
+ {
+ $ret.="$target: $objs \$(PREMAIN_DSO_EXE)";
+ $ret.="\n\tFIPS_LINK=\"\$(LINK)\" \\\n";
+ $ret.="\tFIPS_CC=\$(CC)\\\n";
+ $ret.="\tFIPS_CC_ARGS=/Fo\$(OBJ_D)${o}fips_premain.obj \$(SHLIB_CFLAGS) -c\\\n";
+ $ret.="\tPREMAIN_DSO_EXE=\$(PREMAIN_DSO_EXE)\\\n";
+ $ret.="\tFIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\\\n";
+ $ret.="\tFIPS_TARGET=$target\\\n";
+ $ret.="\tFIPSLIB_D=\$(FIPSLIB_D)\\\n";
+ $ret.="\t\$(FIPSLINK) \$(MLFLAGS) /map $base_arg $efile$target ";
+ $ret.="$name \$(SHLIB_EX_OBJ) $objs \$(EX_LIBS) ";
+ $ret.="\$(OBJ_D)${o}fips_premain.obj $ex\n";
+ }
+ else
+ {
+ $ret.="$target: $objs";
+ $ret.="\n\t\$(LINK) \$(MLFLAGS) $efile$target $name \$(SHLIB_EX_OBJ) $objs $ex \$(EX_LIBS)\n";
+ }
+
+ $ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;2\n\n";
+ }
+ $ret.="\n";
+ return($ret);
+ }
+
+sub do_link_rule
+ {
+ my($target,$files,$dep_libs,$libs,$standalone)=@_;
+ local($ret,$_);
+ $file =~ s/\//$o/g if $o ne '/';
+ $n=&bname($targer);
+ $ret.="$target: $files $dep_libs\n";
+ if ($standalone == 1)
+ {
+ $ret.=" \$(LINK) \$(LFLAGS) $efile$target ";
+ $ret.= "\$(EX_LIBS) " if ($files =~ /O_FIPSCANISTER/ && !$fipscanisterbuild);
+ $ret.="$files $libs\n";
+ }
+ elsif ($standalone == 2)
+ {
+ $ret.="\t\$(LINK) \$(LFLAGS) $efile$target $files \$(O_FIPSCANISTER) $out_def/application.cmd\n";
+ $ret.="\t$out_def/incore6x $target\n\n";
+ }
+ else
+ {
+ $ret.="\t\$(LINK) \$(LFLAGS) $efile$target ";
+ $ret.="\t\$(APP_EX_OBJ) $files $libs\n";
+ }
+ return($ret);
+ }
+
+sub do_rlink_rule
+ {
+ local($target,$rl_start, $rl_mid, $rl_end,$dep_libs,$libs)=@_;
+ local($ret,$_);
+ my $files = "$rl_start $rl_mid $rl_end";
+
+ $file =~ s/\//$o/g if $o ne '/';
+ $n=&bname($target);
+ $ret.="$target: $files $dep_libs\n";
+ $ret.="\t\$(LINK) -r $lfile$target $files $out_def/fipscanister.cmd\n";
+ $ret.="\t\$(PERL) $out_def${o}fips_standalone_sha1 $target > ${target}.sha1\n";
+ $ret.="\t\$(PERL) util${o}copy.pl -stripcr fips${o}fips_premain.c \$(LIB_D)${o}fips_premain.c\n";
+ $ret.="\t\$(CP) fips${o}fips_premain.c.sha1 \$(LIB_D)${o}fips_premain.c.sha1\n";
+ $ret.="\n";
+ return($ret);
+ }
+
+sub import_asm
+ {
+ my ($mf_var, $asm_name, $oref, $sref) = @_;
+ my $asm_dir;
+ if ($asm_name eq "")
+ {
+ $asm_dir = "crypto$o";
+ }
+ else
+ {
+ $asm_dir = "crypto$o$asm_name$oasm$o";
+ }
+
+ $$oref = "";
+ $$sref = "";
+ $mf_var =~ s/\.o//g;
+
+ foreach (split(/ /, $mf_var))
+ {
+ $$sref .= $asm_dir . $_ . ".asm ";
+ }
+ foreach (split(/ /, $mf_var))
+ {
+ $$oref .= "\$(TMP_D)\\" . $_ . ".obj ";
+ }
+ $$oref =~ s/ $//;
+ $$sref =~ s/ $//;
+
+ }
+
+
+1;
diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl
index e98eb1e1b9..aef3de23ea 100644
--- a/util/pl/VC-32.pl
+++ b/util/pl/VC-32.pl
@@ -123,7 +123,7 @@ elsif ($FLAVOR =~ /CE/)
}
$cc='$(CC)';
- $base_cflags=' /W3 /WX /GF /Gy /nologo -DUNICODE -D_UNICODE -DOPENSSL_SYSNAME_WINCE -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DNO_CHMOD -DOPENSSL_SMALL_FOOTPRINT';
+ $base_cflags=' /W3 /GF /Gy /nologo -DUNICODE -D_UNICODE -DOPENSSL_SYSNAME_WINCE -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DNO_CHMOD -DOPENSSL_SMALL_FOOTPRINT';
$base_cflags.=" $wcecdefs";
$base_cflags.=' -I$(WCECOMPAT)/include' if (defined($ENV{'WCECOMPAT'}));
$base_cflags.=' -I$(PORTSDK_LIBPATH)/../../include' if (defined($ENV{'PORTSDK_LIBPATH'}));
@@ -174,12 +174,12 @@ $rsc="rc";
$efile="/out:";
$exep='.exe';
if ($no_sock) { $ex_libs=''; }
-elsif ($FLAVOR =~ /CE/) { $ex_libs='winsock.lib'; }
+elsif ($FLAVOR =~ /CE/) { $ex_libs='ws2.lib'; }
else { $ex_libs='ws2_32.lib'; }
if ($FLAVOR =~ /CE/)
{
- $ex_libs.=' $(WCECOMPAT)/lib/wcecompatex.lib' if (defined($ENV{'WCECOMPAT'}));
+ $ex_libs.=' $(WCECOMPAT)/lib/wcecompatex.lib crypt32.lib coredll.lib corelibc.lib' if (defined($ENV{'WCECOMPAT'}));
$ex_libs.=' $(PORTSDK_LIBPATH)/portlib.lib' if (defined($ENV{'PORTSDK_LIBPATH'}));
$ex_libs.=' /nodefaultlib:oldnames.lib coredll.lib corelibc.lib' if ($ENV{'TARGETCPU'} eq "X86");
}
@@ -389,8 +389,9 @@ sub do_rlink_rule
$file =~ s/\//$o/g if $o ne '/';
$n=&bname($targer);
- $ret.="$target: $files $dep_libs \$(FIPS_SHA1_EXE)\n";
- $ret.="\t\$(PERL) ms\\segrenam.pl \$\$a $rl_start\n";
+ $ret.="$target: $files $dep_libs";
+ $ret.=" \$(FIPS_SHA1_EXE)" unless defined $ENV{"FIPS_SHA1_PATH"};
+ $ret.="\n\t\$(PERL) ms\\segrenam.pl \$\$a $rl_start\n";
$ret.="\t\$(PERL) ms\\segrenam.pl \$\$b $rl_mid\n";
$ret.="\t\$(PERL) ms\\segrenam.pl \$\$c $rl_end\n";
$ret.="\t\$(MKLIB) $lfile$target @<<\n\t$files\n<<\n";