obj_dat.pl revision 7c478bd95313f5f23a4c958a745db2134aa03244
# fixes bug in floating point emulation on sparc64 when
# this script produces off-by-one output on sparc64
use integer;
sub obj_cmp
{
local(@a,@b,$_,$r);
$r=($A-$B);
return($r) if $r != 0;
return($A cmp $B);
}
sub expand_obj
{
local(*v)=@_;
local($k,$d);
local($i);
do {
$i=0;
foreach $k (keys %v)
{
if (($v{$k} =~ s/(OBJ_[^,]+),/$v{$1},/))
{ $i++; }
}
} while($i);
foreach $k (keys %v)
{
@a=split(/,/,$v{$k});
$objn{$k}=$#a+1;
}
return(%objn);
}
while (<IN>)
{
next unless /^\#define\s+(\S+)\s+(.*)$/;
$v=$1;
$d=$2;
$d =~ s/^\"//;
$d =~ s/\"$//;
if ($v =~ /^SN_(.*)$/)
{
if(defined $snames{$d})
{
print "WARNING: Duplicate short name \"$d\"\n";
}
else
{ $snames{$d} = "X"; }
$sn{$1}=$d;
}
elsif ($v =~ /^LN_(.*)$/)
{
if(defined $lnames{$d})
{
print "WARNING: Duplicate long name \"$d\"\n";
}
else
{ $lnames{$d} = "X"; }
$ln{$1}=$d;
}
elsif ($v =~ /^NID_(.*)$/)
{ $nid{$d}=$1; }
elsif ($v =~ /^OBJ_(.*)$/)
{
$obj{$1}=$v;
$objd{$v}=$d;
}
}
close IN;
@a=sort { $a <=> $b } keys %nid;
$n=$a[$#a]+1;
@lvalues=();
$lvalues=0;
for ($i=0; $i<$n; $i++)
{
if (!defined($nid{$i}))
{
push(@out,"{NULL,NULL,NID_undef,0,NULL},\n");
}
else
{
if ($sn eq "NULL") {
}
if ($ln eq "NULL") {
}
$out ="{";
$out.="\"$sn\"";
$out.=",NID_$nid{$i},";
{
$v =~ s/L//g;
$v =~ s/,/ /g;
$r=&der_it($v);
$z="";
$length=0;
foreach (unpack("C*",$r))
{
$z.=sprintf("0x%02X,",$_);
$length++;
}
push(@lvalues,sprintf("%-45s/* [%3d] %s */\n",
$out.="$length,&(lvalues[$lvalues]),0";
}
else
{
$out.="0,NULL";
}
$out.="},\n";
}
}
{
push(@sn,sprintf("&(nid_objs[%2d]),/* \"$sn{$nid{$_}}\" */\n",$_));
}
{
push(@ln,sprintf("&(nid_objs[%2d]),/* \"$ln{$nid{$_}}\" */\n",$_));
}
foreach (sort obj_cmp @a)
{
$v=$objd{$m};
$v =~ s/L//g;
$v =~ s/,/ /g;
push(@ob,sprintf("&(nid_objs[%2d]),/* %-32s %s */\n",$_,$m,$v));
}
print OUT <<'EOF';
*/
*
*
*
*
* "This product includes cryptographic software written by
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
*
*
*/
printf OUT "#define NUM_NID %d\n",$n;
print OUT "};\n\n";
printf OUT "static ASN1_OBJECT nid_objs[NUM_NID]={\n";
foreach (@out)
{
if (length($_) > 75)
{
$out="";
foreach (split(/,/))
{
$t=$out.$_.",";
if (length($t) > 70)
{
print OUT "$out\n";
$t="\t$_,";
}
$out=$t;
}
chop $out;
print OUT "$out";
}
else
{ print OUT $_; }
}
print OUT "};\n\n";
printf OUT "static ASN1_OBJECT *sn_objs[NUM_SN]={\n";
print OUT "};\n\n";
printf OUT "static ASN1_OBJECT *ln_objs[NUM_LN]={\n";
print OUT "};\n\n";
printf OUT "static ASN1_OBJECT *obj_objs[NUM_OBJ]={\n";
print OUT "};\n\n";
close OUT;
sub der_it
{
local($v)=@_;
local(@a,$i,$ret,@r);
@a=split(/\s+/,$v);
shift @a;
shift @a;
foreach (@a)
{
@r=();
$t=0;
while ($_ >= 128)
{
$x=$_%128;
$_/=128;
push(@r,((($t++)?0x80:0)|$x));
}
push(@r,((($t++)?0x80:0)|$_));
$ret.=pack("C*",reverse(@r));
}
return($ret);
}