From c616200172f922718c7200002470a48d31ec4fb5 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Thu, 4 Oct 2012 13:27:11 +0000 Subject: Add support for Windows CE and C64+ to FIPS module. --- util/fips_standalone_sha1 | 32 ++++++ util/fipsas.pl | 52 +++------ util/fipsdist.pl | 2 +- util/fipslink.pl | 13 +++ util/hmac_sha1.pl | 196 +++++++++++++++++++++++++++++++++ util/mk1mf.pl | 53 +++++++-- util/msincore | 169 ++++++++++++++++++++++++++++ util/pl/TI_CGTOOLS.pl | 274 ++++++++++++++++++++++++++++++++++++++++++++++ util/pl/VC-32.pl | 11 +- 9 files changed, 748 insertions(+), 54 deletions(-) create mode 100644 util/fips_standalone_sha1 create mode 100755 util/hmac_sha1.pl create mode 100755 util/msincore create mode 100644 util/pl/TI_CGTOOLS.pl (limited to 'util') 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 = ; + 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 () last if (/assembler/) } -# Store all renames. +# Store all renames [noting minimal length]. +my $minlen=0x10000; while () { - 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 = ; # 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 () -{ - 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 () } 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 . +# +{ 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 . +# +{ 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"; -- cgit v1.2.3