Home | History | Annotate | Line # | Download | only in objects
      1 #! /usr/bin/env perl
      2 # Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved.
      3 #
      4 # Licensed under the Apache License 2.0 (the "License").  You may not use
      5 # this file except in compliance with the License.  You can obtain a copy
      6 # in the file LICENSE in the source distribution or at
      7 # https://www.openssl.org/source/license.html
      8 
      9 use Getopt::Std;
     10 use FindBin;
     11 use lib "$FindBin::Bin/../../util/perl";
     12 use OpenSSL::copyright;
     13 
     14 our($opt_n);
     15 getopts('n');
     16 
     17 # The year the output file is generated.
     18 my $YEAR = OpenSSL::copyright::latest(($0, $ARGV[1], $ARGV[0]));
     19 
     20 open (NUMIN,"$ARGV[1]") || die "Can't open number file $ARGV[1]";
     21 $max_nid=0;
     22 $o=0;
     23 while(<NUMIN>)
     24 	{
     25 	s|\R$||;
     26 	$o++;
     27 	s/#.*$//;
     28 	next if /^\s*$/;
     29 	$_ = 'X'.$_;
     30 	($Cname,$mynum) = split;
     31 	$Cname =~ s/^X//;
     32 	if (defined($nidn{$mynum}))
     33 		{ die "$ARGV[1]:$o:There's already an object with NID ",$mynum," on line ",$order{$mynum},"\n"; }
     34 	if (defined($nid{$Cname}))
     35 		{ die "$ARGV[1]:$o:There's already an object with name ",$Cname," on line ",$order{$nid{$Cname}},"\n"; }
     36 	$nid{$Cname} = $mynum;
     37 	$nidn{$mynum} = $Cname;
     38 	$order{$mynum} = $o;
     39 	$max_nid = $mynum if $mynum > $max_nid;
     40 	}
     41 close NUMIN;
     42 
     43 open (IN,"$ARGV[0]") || die "Can't open input file $ARGV[0]";
     44 $Cname="";
     45 $o=0;
     46 while (<IN>)
     47 	{
     48 	s|\R$||;
     49 	$o++;
     50         if (/^!module\s+(.*)$/)
     51 		{
     52 		$module = $1."-";
     53 		$module =~ s/\./_/g;
     54 		$module =~ s/-/_/g;
     55 		}
     56         if (/^!global$/)
     57 		{ $module = ""; }
     58 	if (/^!Cname\s+(.*)$/)
     59 		{ $Cname = $1; }
     60 	if (/^!Alias\s+(.+?)\s+(.*)$/)
     61 		{
     62 		$Cname = $module.$1;
     63 		$myoid = $2;
     64 		$myoid = &process_oid($myoid);
     65 		$Cname =~ s/-/_/g;
     66 		$ordern{$o} = $Cname;
     67 		$order{$Cname} = $o;
     68 		$obj{$Cname} = $myoid;
     69 		$_ = "";
     70 		$Cname = "";
     71 		}
     72 	s/!.*$//;
     73 	s/#.*$//;
     74 	next if /^\s*$/;
     75 	($myoid,$mysn,$myln) = split ':';
     76 	$mysn =~ s/^\s*//;
     77 	$mysn =~ s/\s*$//;
     78 	$myln =~ s/^\s*//;
     79 	$myln =~ s/\s*$//;
     80 	$myoid =~ s/^\s*//;
     81 	$myoid =~ s/\s*$//;
     82 	if ($myoid ne "")
     83 		{
     84 		$myoid = &process_oid($myoid);
     85 		}
     86 
     87 	if ($Cname eq "" && ($myln =~ /^[_A-Za-z][\w.-]*$/ ))
     88 		{
     89 		$Cname = $myln;
     90 		$Cname =~ s/\./_/g;
     91 		$Cname =~ s/-/_/g;
     92 		if ($Cname ne "" && defined($ln{$module.$Cname}))
     93 			{ die "objects.txt:$o:There's already an object with long name ",$ln{$module.$Cname}," on line ",$order{$module.$Cname},"\n"; }
     94 		}
     95 	if ($Cname eq "")
     96 		{
     97 		$Cname = $mysn;
     98 		$Cname =~ s/-/_/g;
     99 		if ($Cname ne "" && defined($sn{$module.$Cname}))
    100 			{ die "objects.txt:$o:There's already an object with short name ",$sn{$module.$Cname}," on line ",$order{$module.$Cname},"\n"; }
    101 		}
    102 	if ($Cname eq "")
    103 		{
    104 		$Cname = $myln;
    105 		$Cname =~ s/-/_/g;
    106 		$Cname =~ s/\./_/g;
    107 		$Cname =~ s/ /_/g;
    108 		if ($Cname ne "" && defined($ln{$module.$Cname}))
    109 			{ die "objects.txt:$o:There's already an object with long name ",$ln{$module.$Cname}," on line ",$order{$module.$Cname},"\n"; }
    110 		}
    111 	$Cname =~ s/\./_/g;
    112 	$Cname =~ s/-/_/g;
    113 	$Cname = $module.$Cname;
    114 	$ordern{$o} = $Cname;
    115 	$order{$Cname} = $o;
    116 	$sn{$Cname} = $mysn;
    117 	$ln{$Cname} = $myln;
    118 	$obj{$Cname} = $myoid;
    119 	if (!defined($nid{$Cname}))
    120 		{
    121 		$max_nid++;
    122 		$nid{$Cname} = $max_nid;
    123 		$nidn{$max_nid} = $Cname;
    124 print STDERR "Added OID $Cname\n";
    125 		}
    126 	$Cname="";
    127 	}
    128 close IN;
    129 
    130 if ( $opt_n ) {
    131     foreach (sort { $a <=> $b } keys %nidn)
    132             {
    133             print $nidn{$_},"\t\t",$_,"\n";
    134             }
    135     exit;
    136 }
    137 
    138 print <<"EOF";
    139 /*
    140  * WARNING: do not edit!
    141  * Generated by crypto/objects/objects.pl
    142  *
    143  * Copyright 2000-$YEAR The OpenSSL Project Authors. All Rights Reserved.
    144  * Licensed under the Apache License 2.0 (the "License").  You may not use
    145  * this file except in compliance with the License.  You can obtain a copy
    146  * in the file LICENSE in the source distribution or at
    147  * https://www.openssl.org/source/license.html
    148  */
    149 
    150 #ifndef OPENSSL_OBJ_MAC_H
    151 # define OPENSSL_OBJ_MAC_H
    152 # pragma once
    153 
    154 #define SN_undef                        "UNDEF"
    155 #define LN_undef                        "undefined"
    156 #define NID_undef                       0
    157 #define OBJ_undef                       0L
    158 EOF
    159 
    160 sub expand
    161 	{
    162 	my $string = shift;
    163 
    164 	1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
    165 
    166 	return $string;
    167 	}
    168 
    169 foreach (sort { $a <=> $b } keys %ordern)
    170 	{
    171 	$Cname=$ordern{$_};
    172 	print "\n";
    173 	print expand("#define SN_$Cname\t\t\"$sn{$Cname}\"\n") if $sn{$Cname} ne "";
    174 	print expand("#define LN_$Cname\t\t\"$ln{$Cname}\"\n") if $ln{$Cname} ne "";
    175 	print expand("#define NID_$Cname\t\t$nid{$Cname}\n") if $nid{$Cname} ne "";
    176 	print expand("#define OBJ_$Cname\t\t$obj{$Cname}\n") if $obj{$Cname} ne "";
    177 	}
    178 
    179 print <<EOF;
    180 
    181 #endif /* OPENSSL_OBJ_MAC_H */
    182 EOF
    183 
    184 sub process_oid
    185 	{
    186 	local($oid)=@_;
    187 	local(@a,$oid_pref);
    188 
    189 	@a = split(/\s+/,$myoid);
    190 	$pref_oid = "";
    191 	$pref_sep = "";
    192 	if (!($a[0] =~ /^[0-9]+$/))
    193 		{
    194 		$a[0] =~ s/-/_/g;
    195 		if (!defined($obj{$a[0]}))
    196 			{ die "$ARGV[0]:$o:Undefined identifier ",$a[0],"\n"; }
    197 		$pref_oid = "OBJ_" . $a[0];
    198 		$pref_sep = ",";
    199 		shift @a;
    200 		}
    201 	$oids = join('L,',@a) . "L";
    202 	if ($oids ne "L")
    203 		{
    204 		$oids = $pref_oid . $pref_sep . $oids;
    205 		}
    206 	else
    207 		{
    208 		$oids = $pref_oid;
    209 		}
    210 	return($oids);
    211 	}
    212