-#!/usr/my/bin/perl -w
+#!/usr/local/bin/perl -w
#
# generate a .def file
#
# prototyped functions: it then prunes the output.
#
-$crypto_num="util/libeay.num";
-$ssl_num= "util/ssleay.num";
+my $crypto_num="util/libeay.num";
+my $ssl_num= "util/ssleay.num";
my $do_update = 0;
my $do_crypto = 0;
my $do_ssl = 0;
-$rsaref = 0;
+my $do_ctest = 0;
+my $rsaref = 0;
-$W32=1;
-$NT=0;
+my $W32=1;
+my $NT=0;
# Set this to make typesafe STACK definitions appear in DEF
-$safe_stack_def = 1;
-foreach (@ARGV)
+my $safe_stack_def = 1;
+
+my $options="";
+open(IN,"<Makefile.ssl") || die "unable to open Makefile.ssl!\n";
+while(<IN>) {
+ $options=$1 if (/^OPTIONS=(.*)$/);
+}
+close(IN);
+
+# The following ciphers may be excluded (by Configure). This means functions
+# defined with ifndef(NO_XXX) are not included in the .def file, and everything
+# in directory xxx is ignored.
+my $no_rc2; my $no_rc4; my $no_rc5; my $no_idea; my $no_des; my $no_bf;
+my $no_cast; my $no_md2; my $no_md5; my $no_sha; my $no_ripemd; my $no_mdc2;
+my $no_rsa; my $no_dsa; my $no_dh; my $no_hmac=0;
+
+foreach (@ARGV, split(/ /, $options))
{
$W32=1 if $_ eq "32";
$W32=0 if $_ eq "16";
$do_crypto=1 if $_ eq "libeay";
$do_crypto=1 if $_ eq "crypto";
$do_update=1 if $_ eq "update";
+ $do_ctest=1 if $_ eq "ctest";
$rsaref=1 if $_ eq "rsaref";
+
+ if (/^no-rc2$/) { $no_rc2=1; }
+ elsif (/^no-rc4$/) { $no_rc4=1; }
+ elsif (/^no-rc5$/) { $no_rc5=1; }
+ elsif (/^no-idea$/) { $no_idea=1; }
+ elsif (/^no-des$/) { $no_des=1; }
+ elsif (/^no-bf$/) { $no_bf=1; }
+ elsif (/^no-cast$/) { $no_cast=1; }
+ elsif (/^no-md2$/) { $no_md2=1; }
+ elsif (/^no-md5$/) { $no_md5=1; }
+ elsif (/^no-sha$/) { $no_sha=1; }
+ elsif (/^no-ripemd$/) { $no_ripemd=1; }
+ elsif (/^no-mdc2$/) { $no_mdc2=1; }
+ elsif (/^no-rsa$/) { $no_rsa=1; }
+ elsif (/^no-dsa$/) { $no_dsa=1; }
+ elsif (/^no-dh$/) { $no_dh=1; }
+ elsif (/^no-hmac$/) { $no_hmac=1; }
}
+
if (!$do_ssl && !$do_crypto)
{
print STDERR "usage: $0 ( ssl | crypto ) [ 16 | 32 | NT ] [rsaref]\n";
%crypto_list=&load_numbers($crypto_num);
$max_crypto = $max_num;
-$ssl="ssl/ssl.h";
-
-$crypto ="crypto/crypto.h";
-$crypto.=" crypto/des/des.h";
-$crypto.=" crypto/idea/idea.h";
-$crypto.=" crypto/rc4/rc4.h";
-$crypto.=" crypto/rc5/rc5.h";
-$crypto.=" crypto/rc2/rc2.h";
-$crypto.=" crypto/bf/blowfish.h";
-$crypto.=" crypto/cast/cast.h";
-$crypto.=" crypto/md2/md2.h";
-$crypto.=" crypto/md5/md5.h";
-$crypto.=" crypto/mdc2/mdc2.h";
-$crypto.=" crypto/sha/sha.h";
-$crypto.=" crypto/ripemd/ripemd.h";
+my $ssl="ssl/ssl.h";
+
+my $crypto ="crypto/crypto.h";
+$crypto.=" crypto/des/des.h" unless $no_des;
+$crypto.=" crypto/idea/idea.h" unless $no_idea;
+$crypto.=" crypto/rc4/rc4.h" unless $no_rc4;
+$crypto.=" crypto/rc5/rc5.h" unless $no_rc5;
+$crypto.=" crypto/rc2/rc2.h" unless $no_rc2;
+$crypto.=" crypto/bf/blowfish.h" unless $no_bf;
+$crypto.=" crypto/cast/cast.h" unless $no_cast;
+$crypto.=" crypto/md2/md2.h" unless $no_md2;
+$crypto.=" crypto/md5/md5.h" unless $no_md5;
+$crypto.=" crypto/mdc2/mdc2.h" unless $no_mdc2;
+$crypto.=" crypto/sha/sha.h" unless $no_sha;
+$crypto.=" crypto/ripemd/ripemd.h" unless $no_ripemd;
$crypto.=" crypto/bn/bn.h";
-$crypto.=" crypto/rsa/rsa.h";
-$crypto.=" crypto/dsa/dsa.h";
-$crypto.=" crypto/dh/dh.h";
+$crypto.=" crypto/rsa/rsa.h" unless $no_rsa;
+$crypto.=" crypto/dsa/dsa.h" unless $no_dsa;
+$crypto.=" crypto/dh/dh.h" unless $no_dh;
+$crypto.=" crypto/hmac/hmac.h" unless $no_hmac;
$crypto.=" crypto/stack/stack.h";
$crypto.=" crypto/buffer/buffer.h";
$crypto.=" crypto/x509/x509_vfy.h";
$crypto.=" crypto/x509v3/x509v3.h";
$crypto.=" crypto/rand/rand.h";
-$crypto.=" crypto/hmac/hmac.h";
$crypto.=" crypto/comp/comp.h";
$crypto.=" crypto/tmdiff.h";
-@ssl_func = &do_defs("SSLEAY", $ssl);
-@crypto_func = &do_defs("LIBEAY", $crypto);
+my @ssl_func = &do_defs("SSLEAY", $ssl);
+my @crypto_func = &do_defs("LIBEAY", $crypto);
if ($do_update) {
open(OUT, ">>$crypto_num");
&update_numbers(*OUT,"LIBEAY",*crypto_list,$max_crypto, @crypto_func);
close OUT;
-}
+}
+
+} elsif ($do_ctest) {
+
+ print <<"EOF";
+
+/* Test file to check all DEF file symbols are present by trying
+ * to link to all of them. This is *not* intended to be run!
+ */
+
+int main()
+{
+EOF
+ &print_test_file(*STDOUT,"SSLEAY",*ssl_list,@ssl_func)
+ if $do_ssl == 1;
+
+ &print_test_file(*STDOUT,"LIBEAY",*crypto_list,@crypto_func)
+ if $do_crypto == 1;
+
+ print "}\n";
} else {
sub do_defs
{
my($name,$files)=@_;
+ my $file;
my @ret;
my %funcs;
+ my $cpp;
foreach $file (split(/\s+/,$files))
{
open(IN,"<$file") || die "unable to open $file:$!\n";
-
- my $line = "", $def= "";
+ my $line = "", my $def= "";
my %tag = (
FreeBSD => 0,
NOPROTO => 0,
NO_FP_API => 0,
CONST_STRICT => 0,
TRUE => 1,
+ NO_RC2 => 0,
+ NO_RC4 => 0,
+ NO_RC5 => 0,
+ NO_IDEA => 0,
+ NO_DES => 0,
+ NO_BF => 0,
+ NO_CAST => 0,
+ NO_MD2 => 0,
+ NO_MD5 => 0,
+ NO_SHA => 0,
+ NO_RIPEMD => 0,
+ NO_MDC2 => 0,
+ NO_RSA => 0,
+ NO_DSA => 0,
+ NO_DH => 0,
+ NO_HMAC => 0,
);
while(<IN>) {
last if (/BEGIN ERROR CODES/);
push(@tag,"TRUE");
$tag{"TRUE"}=1;
next;
+ } elsif (/^\#\s*if\s+0/) {
+ # Dummy tag
+ push(@tag,"TRUE");
+ $tag{"TRUE"}=-1;
+ next;
} elsif (/^\#/) {
next;
}
$funcs{"sk_${1}_set"} = 1;
$funcs{"sk_${1}_zero"} = 1;
$funcs{"sk_${1}_push"} = 1;
- $funcs{"sk_${1}_pop"} = 1;
+ $funcs{"sk_${1}_unshift"} = 1;
$funcs{"sk_${1}_find"} = 1;
$funcs{"sk_${1}_delete"} = 1;
$funcs{"sk_${1}_delete_ptr"} = 1;
+ $funcs{"sk_${1}_insert"} = 1;
$funcs{"sk_${1}_set_cmp_func"} = 1;
$funcs{"sk_${1}_dup"} = 1;
$funcs{"sk_${1}_pop_free"} = 1;
$funcs{"sk_${1}_shift"} = 1;
+ $funcs{"sk_${1}_pop"} = 1;
+ $funcs{"sk_${1}_sort"} = 1;
} elsif ($safe_stack_def &&
/^\s*DECLARE_ASN1_SET_OF\s*\(\s*(\w*)\s*\)/) {
$funcs{"d2i_ASN1_SET_OF_${1}"} = 1;
$funcs{"i2d_ASN1_SET_OF_${1}"} = 1;
- } elsif (
+ } elsif (/^DECLARE_PEM_rw\s*\(\s*(\w*)\s*,/ ||
+ /^DECLARE_PEM_rw_cb\s*\(\s*(\w*)\s*,/ ) {
+ if($W32) {
+ $funcs{"PEM_read_${1}"} = 1;
+ $funcs{"PEM_write_${1}"} = 1;
+ }
+ $funcs{"PEM_read_bio_${1}"} = 1;
+ $funcs{"PEM_write_bio_${1}"} = 1;
+ } elsif (/^DECLARE_PEM_write\s*\(\s*(\w*)\s*,/ ||
+ /^DECLARE_PEM_write_cb\s*\(\s*(\w*)\s*,/ ) {
+ if($W32) {
+ $funcs{"PEM_write_${1}"} = 1;
+ }
+ $funcs{"PEM_write_bio_${1}"} = 1;
+ } elsif (/^DECLARE_PEM_read\s*\(\s*(\w*)\s*,/ ||
+ /^DECLARE_PEM_read_cb\s*\(\s*(\w*)\s*,/ ) {
+ if($W32) {
+ $funcs{"PEM_read_${1}"} = 1;
+ }
+ $funcs{"PEM_read_bio_${1}"} = 1;
+ } elsif (
+ ($tag{'TRUE'} != -1) &&
($tag{'FreeBSD'} != 1) &&
($tag{'CONST_STRICT'} != 1) &&
(($W32 && ($tag{'WIN16'} != 1)) ||
((!$W32 && $tag{'_WINDLL'} != -1) ||
($W32 && $tag{'_WINDLL'} != 1)) &&
((($tag{'NO_FP_API'} != 1) && $W32) ||
- (($tag{'NO_FP_API'} != -1) && !$W32)))
+ (($tag{'NO_FP_API'} != -1) && !$W32)) &&
+ ($tag{'NO_RC2'} == 0 || !$no_rc2) &&
+ ($tag{'NO_RC4'} == 0 || !$no_rc4) &&
+ ($tag{'NO_RC5'} == 0 || !$no_rc5) &&
+ ($tag{'NO_IDEA'} == 0 || !$no_idea) &&
+ ($tag{'NO_DES'} == 0 || !$no_des) &&
+ ($tag{'NO_BF'} == 0 || !$no_bf) &&
+ ($tag{'NO_CAST'} == 0 || !$no_cast) &&
+ ($tag{'NO_MD2'} == 0 || !$no_md2) &&
+ ($tag{'NO_MD5'} == 0 || !$no_md5) &&
+ ($tag{'NO_SHA'} == 0 || !$no_sha) &&
+ ($tag{'NO_RIPEMD'} == 0 || !$no_ripemd) &&
+ ($tag{'NO_MDC2'} == 0 || !$no_mdc2) &&
+ ($tag{'NO_RSA'} == 0 || !$no_rsa) &&
+ ($tag{'NO_DSA'} == 0 || !$no_dsa) &&
+ ($tag{'NO_DH'} == 0 || !$no_dh) &&
+ ($tag{'NO_HMAC'} == 0 || !$no_hmac))
{
if (/{|\/\*/) { # }
$line = $_;
s/^[\n\s]*//g;
s/[\n\s]*$//g;
next if(/typedef\W/);
+ next if(/EVP_bf/ and $no_bf);
+ next if(/EVP_cast/ and $no_cast);
+ next if(/EVP_des/ and $no_des);
+ next if(/EVP_dss/ and $no_dsa);
+ next if(/EVP_idea/ and $no_idea);
+ next if(/EVP_md2/ and $no_md2);
+ next if(/EVP_md5/ and $no_md5);
+ next if(/EVP_rc2/ and $no_rc2);
+ next if(/EVP_rc4/ and $no_rc4);
+ next if(/EVP_rc5/ and $no_rc5);
+ next if(/EVP_ripemd/ and $no_ripemd);
+ next if(/EVP_sha/ and $no_sha);
if (/\(\*(\w*)\([^\)]+/) {
$funcs{$1} = 1;
} elsif (/\w+\W+(\w+)\W*\(\s*\)$/s) {
# Prune the returned functions
delete $funcs{"SSL_add_dir_cert_subjects_to_stack"};
- delete $funcs{"des_crypt"};
delete $funcs{"RSA_PKCS1_RSAref"} unless $rsaref;
if($W32) {
return(@ret);
}
+sub print_test_file
+{
+ (*OUT,my $name,*nums,my @functions)=@_;
+ my $n = 1; my @e; my @r;
+ my $func;
+
+ (@e)=grep(/^SSLeay/,@functions);
+ (@r)=grep(!/^SSLeay/,@functions);
+ @functions=((sort @e),(sort @r));
+
+ foreach $func (@functions) {
+ if (!defined($nums{$func})) {
+ printf STDERR "$func does not have a number assigned\n"
+ if(!$do_update);
+ } else {
+ $n=$nums{$func};
+ print OUT "\t$func();\n";
+ }
+ }
+}
+
sub print_def_file
{
- (*OUT,my $name,*nums,@functions)=@_;
- my $n =1;
+ (*OUT,my $name,*nums,my @functions)=@_;
+ my $n = 1; my @e; my @r;
if ($W32)
{ $name.="32"; }