summaryrefslogtreecommitdiffstats
path: root/fips/tools/api_list.pl
diff options
context:
space:
mode:
Diffstat (limited to 'fips/tools/api_list.pl')
-rw-r--r--fips/tools/api_list.pl267
1 files changed, 0 insertions, 267 deletions
diff --git a/fips/tools/api_list.pl b/fips/tools/api_list.pl
deleted file mode 100644
index 2102fc2976..0000000000
--- a/fips/tools/api_list.pl
+++ /dev/null
@@ -1,267 +0,0 @@
-#!/bin/env perl
-#
-# Quick and dirty utility to help assemble the mandated (but otherwise
-# useless) API documentation. We get the list of external function
-# symbols from fipscanister.o, pair those with the source file names
-# (from ./fips/fipssyms.h), and map to the object file name containing
-# them.
-#
-# Requires the "nm" and "find" utilities.
-# Execure from the root of the FIPS module source code workarea
-
-use HTML::Entities;
-use File::Basename;
-
-$here = dirname($0);
-require "$here/api_fns.pm";
-
-$_direction_question = ''; # Set to '?' to show "<-?", "<->?" for uncertain directions
-
-print STDERR "Info: finding FIPS renames and reimplementations of OpenSSL symbols\n";
-# Get mapping of old (source code) to new (live as renamed) symbols
-foreach $file ("./fips/fipssyms.h") {
- open(IN, $file) || die "Error opening $file";
- # grab pairs until assembler symbols
- my $buf = '';
- my $reimplementations = 1; # When 1, we're looking at reimplementations
- # (not renames) of OpenSSL functions. They
- # still have to be saved to get the API.
- while (<IN>) {
- $reimplementations = 0 if m|^\s*/\*\sRename\ssymbols\s|;
-
- if ($buf) {
- $_ = $buf . $_;
- $buf = '';
- }
- if (s/\\\n$//) {
- $buf = $_;
- next;
- }
- if (m/\(/) {
- ($oldname, $newname) = m/#define\s+(\S+)\(.*\)\s+(\S+)\(.*\)/;
- } else {
- ($oldname, $newname) = m/#define\s+(\S+)\s+(\S+)/;
- }
-
- $oldname || next;
- if (!$reimplementations) {
- $oldname{$newname} = $oldname;
- }
- $oldimpl{$newname} = $oldname;
- last if (/assembler/)
- }
- close(IN);
- # %oldname is the mapping of new function names to old
- print "<!-- Total of ", scalar(keys %oldname), " mapped symbols in $file -->\n";
-}
-
-print STDERR "Info: finding FIPS symbols in object files\n";
-# generate list of external function names in fipscanister.o
-$file = "./fips/fipscanister.o";
-for (`nm -g --defined-only -p -o $file`) {
- chomp;
- s/^\S+ T // || next;
- m/^fips_/ && next;
- $fipssyms{$_}++;
- $objname =~ s/\.o$/\.\[o\|c\]/;
- $objname{$symname} = $objname;
-}
-# keys %fipssyms is the list of module functions
-print "<!-- Total of ", scalar(keys %fipssyms), " functions in $file -->\n";
-
-# grab filename to symbol name mapping, each line is of the format
-# ./fips/sha/fips_sha1_selftest.o:00000000 T FIPS_selftest_sha1
-# discard the offset and type ":00000000 T".
-for (`find . -name '*.o' \\! -name 'fipscanister.o' -exec nm -g --defined-only -p -o {} \\;`) {
- ($objname, $symname) = m/^(\S+):\S+\s+T+\s+(\S+)/;
- $objname || next;
-# $fipssyms{$symname} || next;
- $objname =~ s/\.o$/\.\[o\|c\]/;
- $objname{$symname} = $objname;
- }
-# %objname is the mapping of new symbol name to (source/object) file name
-print "<!-- Total of ", scalar(keys %objname), " functions found in files -->\n";
-
-print STDERR "Info: finding declarations in header files\n";
-
-# grab filenames in include/openssl, run each of them through
-# get_function_declarations_from_file (defined in api_fns.pl)
-# and collect the result.
-%declarations = ();
-while (<include/openssl/*.h ./crypto/cryptlib.h>) {
- my %decls = api_data::get_function_declaration_strings_from_file($_);
- map { $declarations{$_} = $decls{$_} } keys %decls;
-}
-# %declarations is the mapping of old symbol name to their declaration
-print "<!-- Total of ", scalar(keys %declarations), " declarations found in header files -->\n";
-
-# Add the markers FIPS_text_start and FIPS_text_end
-$declarations{FIPS_text_start} = "void *FIPS_text_start()";
-$declarations{FIPS_text_end} = "void *FIPS_text_end()";
-
-
-# Read list of API names obtained from edited "nm -g fipscanister.o"
-$spill = 0;
-sub printer {
- foreach (@_) {
- if ($_->{kind} >= 0) {
- if ($spill) {
- print " " x $indent;
- print "kind: ",$_->{kind} ? "function" : "variable","\n";
- print " " x $indent;
- print "sym: ",$_->{sym},"\n";
- print " " x $indent;
- print "type: ",$_->{type},"\n";
- }
- if ($_->{kind}) {
- $c = 0;
- map {
- if ($spill) {
- print " " x $indent;
- printf "param %d:\n", ++$c;
- }
- $indent += 2;
- printer($_);
- my $direction = $_->{direction};
- if (!$_direction_question) {
- $direction =~ s/<-\? <->\?/<->/;
- $direction =~ s/\?//g;
- }
- print " " x $indent,$direction," ",$_->{sym},"\n";
- $indent -= 2;
- } @{$_->{params}};
- if ($_->{type} !~ m/^\s*void\s*$/) {
- print " " x $indent;
- print "<- Return\n";
- }
- }
- } else {
- if ($spill) {
- print " " x $indent;
- print "decl: ",$_->{decl},"\n";
- }
- }
- }
-}
-
-sub html_printer {
- my $print_mode = shift; # 0 = print declaration with symbol in bold,
- # call recursively with 1 for each parameter,
- # call recursively with 2 for each parameter
- # 1 = print declaration with sym grey background,
- # call recursivelt with 3 for each parameter
- # 2 = just print declaration
- my $d = shift; # Parsed declaration
- my $s = '';
-
- if ($print_mode == 0) {
- $d->{sym} || return $s;
- my $h = "<hr><br />\n";
- $h .= $d->{sym} . ($d->{symcomment} ? " " . $d->{symcomment} : "");
- $h .= " in file " . $d->{objfile} . "<br />\n<br />\n";
-
- $s .= '<b>' . $d->{sym} . '</b>';
- if ($d->{kind} == 1) {
- $s .= '(';
- $s .= join(', ',
- map {
- html_printer(1,$_);
- } @{$d->{params}});
- $s .= ')';
- }
- my $t = $d->{type};
- $t =~ s/\?/$s/;
- $s = $t;
- if ($d->{kind} == 1) {
- map {
- my $direction = $_->{direction};
- if (!$_direction_question) {
- $direction =~ s/<-\? <->\?/<->/;
- $direction =~ s/\?//g;
- }
- $s .= "<br />\n";
- $s .= encode_entities($direction
- . "\xA0" x (9 - length($direction)));
- $s .= $_->{sym};
- } @{$d->{params}};
- }
- if ($d->{type} !~ m/^\s*void\s*\?$/) {
- $s .= "<br />\n";
- $s .= encode_entities('<-'.("\xA0" x 7).'Return');
- }
- $s = $h . $s;
- } elsif ($print_mode == 1) {
- $s .= '<span style="background: #c0c0c0">' . $d->{sym} . '</span>';
- if ($d->{kind} == 1) {
- $s .= '(';
- $s .= join(', ',
- map {
- html_printer(3,$_);
- } @{$d->{params}});
- $s .= ')';
- }
- my $t = $d->{type};
- $t =~ s/\?/$s/;
- $s = $t;
- } elsif ($print_mode == 2) {
- $s .= $d->{sym};
- if ($d->{kind} == 1) {
- $s .= '(';
- $s .= join(', ',
- map {
- html_printer(2,$_);
- } @{$d->{params}});
- $s .= ')';
- }
- my $t = $d->{type};
- $t =~ s/\?/$s/;
- $s = $t;
- }
- return $s;
-}
-
-print STDERR "Info: building/updating symbol information database\n";
-
-$d = api_data->new();
-if (-s "$here/declarations.dat") {
- $d->read_declaration_db("$here/declarations.dat");
-} else {
- print STDERR "Warning: there was no file '$here/declarations.dat'. A new one will be created\n";
-}
-
-for (sort keys %fipssyms) {
- $newname = $_;
- $namecomment = undef;
- if ($oldname{$newname}) {
- $oldname = $oldname{$newname};
- $objname = $objname{$oldname} ? $objname{$oldname} : $objname{$newname};
- $namecomment = "(renames $oldname)";
- } else {
- $objname = $objname{$newname};
- }
- if ($oldimpl{$newname}) {
- $apisym = $oldimpl{$newname};
- $namecomment = "(reimplements $apisym)" if !$namecomment;
- } else {
- $apisym = $newname;
- }
- $declaration = $declarations{$apisym};
- print "<!--\n";
- print "$newname\t\t$namecomment\tin file $objname:\n";
- print " ",$declaration,"\n ";
- $d->add_declaration($declaration,$newname,$objname,$namecomment);
- print "-->\n";
-}
-
-$d->complete_directions();
-$d->write_declaration_db("$here/declarations.dat");
-
-print STDERR "Info: printing output\n";
-
-$d->on_all_declarations(
- sub {
- my $decl = shift;
- #$indent = 2;
- #print printer($decl);
- print "<p>",html_printer(0,$decl),"</p>\n";
- });