155714Skris#!/usr/local/bin/perl
255714Skris
3127128Snectar# fixes bug in floating point emulation on sparc64 when
4127128Snectar# this script produces off-by-one output on sparc64
5238405Sjkimuse integer;
6127128Snectar
755714Skrissub obj_cmp
855714Skris	{
955714Skris	local(@a,@b,$_,$r);
1055714Skris
1155714Skris	$A=$obj_len{$obj{$nid{$a}}};
1255714Skris	$B=$obj_len{$obj{$nid{$b}}};
1355714Skris
1455714Skris	$r=($A-$B);
1555714Skris	return($r) if $r != 0;
1655714Skris
1755714Skris	$A=$obj_der{$obj{$nid{$a}}};
1855714Skris	$B=$obj_der{$obj{$nid{$b}}};
1955714Skris
2055714Skris	return($A cmp $B);
2155714Skris	}
2255714Skris
2355714Skrissub expand_obj
2455714Skris	{
2555714Skris	local(*v)=@_;
2655714Skris	local($k,$d);
2755714Skris	local($i);
2855714Skris
2955714Skris	do	{
3055714Skris		$i=0;
3155714Skris		foreach $k (keys %v)
3255714Skris			{
3355714Skris			if (($v{$k} =~ s/(OBJ_[^,]+),/$v{$1},/))
3455714Skris				{ $i++; }
3555714Skris			}
3655714Skris		} while($i);
3755714Skris	foreach $k (keys %v)
3855714Skris		{
3955714Skris		@a=split(/,/,$v{$k});
4055714Skris		$objn{$k}=$#a+1;
4155714Skris		}
4255714Skris	return(%objn);
4355714Skris	}
4455714Skris
4559191Skrisopen (IN,"$ARGV[0]") || die "Can't open input file $ARGV[0]";
4659191Skrisopen (OUT,">$ARGV[1]") || die "Can't open output file $ARGV[1]";
4759191Skris
4859191Skriswhile (<IN>)
4955714Skris	{
5055714Skris	next unless /^\#define\s+(\S+)\s+(.*)$/;
5155714Skris	$v=$1;
5255714Skris	$d=$2;
5368651Skris	$d =~ s/^\"//;
5468651Skris	$d =~ s/\"$//;
5555714Skris	if ($v =~ /^SN_(.*)$/)
5668651Skris		{
5768651Skris		if(defined $snames{$d})
5868651Skris			{
5968651Skris			print "WARNING: Duplicate short name \"$d\"\n";
6068651Skris			}
6168651Skris		else
6268651Skris			{ $snames{$d} = "X"; }
6368651Skris		$sn{$1}=$d;
6468651Skris		}
6555714Skris	elsif ($v =~ /^LN_(.*)$/)
6668651Skris		{
6768651Skris		if(defined $lnames{$d})
6868651Skris			{
6968651Skris			print "WARNING: Duplicate long name \"$d\"\n";
7068651Skris			}
7168651Skris		else
7268651Skris			{ $lnames{$d} = "X"; }
7368651Skris		$ln{$1}=$d;
7468651Skris		}
7555714Skris	elsif ($v =~ /^NID_(.*)$/)
7655714Skris		{ $nid{$d}=$1; }
7755714Skris	elsif ($v =~ /^OBJ_(.*)$/)
7855714Skris		{
7955714Skris		$obj{$1}=$v;
8055714Skris		$objd{$v}=$d;
8155714Skris		}
8255714Skris	}
8359191Skrisclose IN;
8455714Skris
8555714Skris%ob=&expand_obj(*objd);
8655714Skris
8755714Skris@a=sort { $a <=> $b } keys %nid;
8855714Skris$n=$a[$#a]+1;
8955714Skris
9055714Skris@lvalues=();
9155714Skris$lvalues=0;
9255714Skris
9355714Skrisfor ($i=0; $i<$n; $i++)
9455714Skris	{
9555714Skris	if (!defined($nid{$i}))
9655714Skris		{
97160814Ssimon		push(@out,"{NULL,NULL,NID_undef,0,NULL,0},\n");
9855714Skris		}
9955714Skris	else
10055714Skris		{
10155714Skris		$sn=defined($sn{$nid{$i}})?"$sn{$nid{$i}}":"NULL";
10255714Skris		$ln=defined($ln{$nid{$i}})?"$ln{$nid{$i}}":"NULL";
10368651Skris
10468651Skris		if ($sn eq "NULL") {
10568651Skris			$sn=$ln;
10668651Skris			$sn{$nid{$i}} = $ln;
10768651Skris		}
10868651Skris
10968651Skris		if ($ln eq "NULL") {
11068651Skris			$ln=$sn;
11168651Skris			$ln{$nid{$i}} = $sn;
11268651Skris		}
11368651Skris
11455714Skris		$out ="{";
11568651Skris		$out.="\"$sn\"";
11668651Skris		$out.=","."\"$ln\"";
11755714Skris		$out.=",NID_$nid{$i},";
118269686Sjkim		if (defined($obj{$nid{$i}}) && $objd{$obj{$nid{$i}}} =~ /,/)
11955714Skris			{
12055714Skris			$v=$objd{$obj{$nid{$i}}};
12155714Skris			$v =~ s/L//g;
12255714Skris			$v =~ s/,/ /g;
12355714Skris			$r=&der_it($v);
12455714Skris			$z="";
12555714Skris			$length=0;
12655714Skris			foreach (unpack("C*",$r))
12755714Skris				{
12855714Skris				$z.=sprintf("0x%02X,",$_);
12955714Skris				$length++;
13055714Skris				}
13155714Skris			$obj_der{$obj{$nid{$i}}}=$z;
13255714Skris			$obj_len{$obj{$nid{$i}}}=$length;
13355714Skris
13455714Skris			push(@lvalues,sprintf("%-45s/* [%3d] %s */\n",
13555714Skris				$z,$lvalues,$obj{$nid{$i}}));
13655714Skris			$out.="$length,&(lvalues[$lvalues]),0";
13755714Skris			$lvalues+=$length;
13855714Skris			}
13955714Skris		else
14055714Skris			{
141160814Ssimon			$out.="0,NULL,0";
14255714Skris			}
14355714Skris		$out.="},\n";
14455714Skris		push(@out,$out);
14555714Skris		}
14655714Skris	}
14755714Skris
14855714Skris@a=grep(defined($sn{$nid{$_}}),0 .. $n);
14955714Skrisforeach (sort { $sn{$nid{$a}} cmp $sn{$nid{$b}} } @a)
15055714Skris	{
151238405Sjkim	push(@sn,sprintf("%2d,\t/* \"$sn{$nid{$_}}\" */\n",$_));
15255714Skris	}
15355714Skris
15455714Skris@a=grep(defined($ln{$nid{$_}}),0 .. $n);
15555714Skrisforeach (sort { $ln{$nid{$a}} cmp $ln{$nid{$b}} } @a)
15655714Skris	{
157238405Sjkim	push(@ln,sprintf("%2d,\t/* \"$ln{$nid{$_}}\" */\n",$_));
15855714Skris	}
15955714Skris
16055714Skris@a=grep(defined($obj{$nid{$_}}),0 .. $n);
16155714Skrisforeach (sort obj_cmp @a)
16255714Skris	{
16355714Skris	$m=$obj{$nid{$_}};
16455714Skris	$v=$objd{$m};
16555714Skris	$v =~ s/L//g;
16655714Skris	$v =~ s/,/ /g;
167238405Sjkim	push(@ob,sprintf("%2d,\t/* %-32s %s */\n",$_,$m,$v));
16855714Skris	}
16955714Skris
17059191Skrisprint OUT <<'EOF';
17189837Skris/* crypto/objects/obj_dat.h */
17289837Skris
17389837Skris/* THIS FILE IS GENERATED FROM objects.h by obj_dat.pl via the
17489837Skris * following command:
175109998Smarkm * perl obj_dat.pl obj_mac.h obj_dat.h
17689837Skris */
17789837Skris
17855714Skris/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
17955714Skris * All rights reserved.
18055714Skris *
18155714Skris * This package is an SSL implementation written
18255714Skris * by Eric Young (eay@cryptsoft.com).
18355714Skris * The implementation was written so as to conform with Netscapes SSL.
18455714Skris *
18555714Skris * This library is free for commercial and non-commercial use as long as
18655714Skris * the following conditions are aheared to.  The following conditions
18755714Skris * apply to all code found in this distribution, be it the RC4, RSA,
18855714Skris * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
18955714Skris * included with this distribution is covered by the same copyright terms
19055714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com).
19155714Skris *
19255714Skris * Copyright remains Eric Young's, and as such any Copyright notices in
19355714Skris * the code are not to be removed.
19455714Skris * If this package is used in a product, Eric Young should be given attribution
19555714Skris * as the author of the parts of the library used.
19655714Skris * This can be in the form of a textual message at program startup or
19755714Skris * in documentation (online or textual) provided with the package.
19855714Skris *
19955714Skris * Redistribution and use in source and binary forms, with or without
20055714Skris * modification, are permitted provided that the following conditions
20155714Skris * are met:
20255714Skris * 1. Redistributions of source code must retain the copyright
20355714Skris *    notice, this list of conditions and the following disclaimer.
20455714Skris * 2. Redistributions in binary form must reproduce the above copyright
20555714Skris *    notice, this list of conditions and the following disclaimer in the
20655714Skris *    documentation and/or other materials provided with the distribution.
20755714Skris * 3. All advertising materials mentioning features or use of this software
20855714Skris *    must display the following acknowledgement:
20955714Skris *    "This product includes cryptographic software written by
21055714Skris *     Eric Young (eay@cryptsoft.com)"
21155714Skris *    The word 'cryptographic' can be left out if the rouines from the library
21255714Skris *    being used are not cryptographic related :-).
21355714Skris * 4. If you include any Windows specific code (or a derivative thereof) from
21455714Skris *    the apps directory (application code) you must include an acknowledgement:
21555714Skris *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
21655714Skris *
21755714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
21855714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21955714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22055714Skris * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22155714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22255714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22355714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22455714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22555714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22655714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22755714Skris * SUCH DAMAGE.
22855714Skris *
22955714Skris * The licence and distribution terms for any publically available version or
23055714Skris * derivative of this code cannot be changed.  i.e. this code cannot simply be
23155714Skris * copied and put under another distribution licence
23255714Skris * [including the GNU Public Licence.]
23355714Skris */
23455714Skris
23555714SkrisEOF
23655714Skris
23759191Skrisprintf OUT "#define NUM_NID %d\n",$n;
23859191Skrisprintf OUT "#define NUM_SN %d\n",$#sn+1;
23959191Skrisprintf OUT "#define NUM_LN %d\n",$#ln+1;
24059191Skrisprintf OUT "#define NUM_OBJ %d\n\n",$#ob+1;
24155714Skris
242238405Sjkimprintf OUT "static const unsigned char lvalues[%d]={\n",$lvalues+1;
24359191Skrisprint OUT @lvalues;
24459191Skrisprint OUT "};\n\n";
24555714Skris
246238405Sjkimprintf OUT "static const ASN1_OBJECT nid_objs[NUM_NID]={\n";
24755714Skrisforeach (@out)
24855714Skris	{
24955714Skris	if (length($_) > 75)
25055714Skris		{
25155714Skris		$out="";
25255714Skris		foreach (split(/,/))
25355714Skris			{
25455714Skris			$t=$out.$_.",";
25555714Skris			if (length($t) > 70)
25655714Skris				{
25759191Skris				print OUT "$out\n";
25855714Skris				$t="\t$_,";
25955714Skris				}
26055714Skris			$out=$t;
26155714Skris			}
26255714Skris		chop $out;
26359191Skris		print OUT "$out";
26455714Skris		}
26555714Skris	else
26659191Skris		{ print OUT $_; }
26755714Skris	}
26859191Skrisprint  OUT "};\n\n";
26955714Skris
270238405Sjkimprintf OUT "static const unsigned int sn_objs[NUM_SN]={\n";
27159191Skrisprint  OUT @sn;
27259191Skrisprint  OUT "};\n\n";
27355714Skris
274238405Sjkimprintf OUT "static const unsigned int ln_objs[NUM_LN]={\n";
27559191Skrisprint  OUT @ln;
27659191Skrisprint  OUT "};\n\n";
27755714Skris
278238405Sjkimprintf OUT "static const unsigned int obj_objs[NUM_OBJ]={\n";
27959191Skrisprint  OUT @ob;
28059191Skrisprint  OUT "};\n\n";
28155714Skris
28259191Skrisclose OUT;
28359191Skris
28455714Skrissub der_it
28555714Skris	{
28655714Skris	local($v)=@_;
28755714Skris	local(@a,$i,$ret,@r);
28855714Skris
28955714Skris	@a=split(/\s+/,$v);
29055714Skris	$ret.=pack("C*",$a[0]*40+$a[1]);
29155714Skris	shift @a;
29255714Skris	shift @a;
29355714Skris	foreach (@a)
29455714Skris		{
29555714Skris		@r=();
29655714Skris		$t=0;
29755714Skris		while ($_ >= 128)
29855714Skris			{
29955714Skris			$x=$_%128;
30055714Skris			$_/=128;
30155714Skris			push(@r,((($t++)?0x80:0)|$x));
30255714Skris			}
30355714Skris		push(@r,((($t++)?0x80:0)|$_));
30455714Skris		$ret.=pack("C*",reverse(@r));
30555714Skris		}
30655714Skris	return($ret);
30755714Skris	}
308