| lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | #! /usr/bin/env perl | 
|  | 2 | # Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. | 
|  | 3 | # | 
|  | 4 | # Licensed under the OpenSSL license (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 | # Generate progs.h file by looking for command mains in list of C files | 
|  | 10 | # passed on the command line. | 
|  | 11 |  | 
|  | 12 | use strict; | 
|  | 13 | use warnings; | 
|  | 14 | use lib '.'; | 
|  | 15 | use configdata qw/@disablables %unified_info/; | 
|  | 16 |  | 
|  | 17 | my %commands     = (); | 
|  | 18 | my $cmdre        = qr/^\s*int\s+([a-z_][a-z0-9_]*)_main\(\s*int\s+argc\s*,/; | 
|  | 19 | my $apps_openssl = shift @ARGV; | 
|  | 20 | my $YEAR         = [localtime()]->[5] + 1900; | 
|  | 21 |  | 
|  | 22 | # because the program apps/openssl has object files as sources, and | 
|  | 23 | # they then have the corresponding C files as source, we need to chain | 
|  | 24 | # the lookups in %unified_info | 
|  | 25 | my @openssl_source = | 
|  | 26 | map { @{$unified_info{sources}->{$_}} } | 
|  | 27 | grep { /\.o$/ } | 
|  | 28 | @{$unified_info{sources}->{$apps_openssl}}; | 
|  | 29 |  | 
|  | 30 | foreach my $filename (@openssl_source) { | 
|  | 31 | open F, $filename or die "Couldn't open $filename: $!\n"; | 
|  | 32 | foreach ( grep /$cmdre/, <F> ) { | 
|  | 33 | my @foo = /$cmdre/; | 
|  | 34 | $commands{$1} = 1; | 
|  | 35 | } | 
|  | 36 | close F; | 
|  | 37 | } | 
|  | 38 |  | 
|  | 39 | @ARGV = sort keys %commands; | 
|  | 40 |  | 
|  | 41 | print <<"EOF"; | 
|  | 42 | /* | 
|  | 43 | * WARNING: do not edit! | 
|  | 44 | * Generated by apps/progs.pl | 
|  | 45 | * | 
|  | 46 | * Copyright 1995-$YEAR The OpenSSL Project Authors. All Rights Reserved. | 
|  | 47 | * | 
|  | 48 | * Licensed under the OpenSSL license (the "License").  You may not use | 
|  | 49 | * this file except in compliance with the License.  You can obtain a copy | 
|  | 50 | * in the file LICENSE in the source distribution or at | 
|  | 51 | * https://www.openssl.org/source/license.html | 
|  | 52 | */ | 
|  | 53 |  | 
|  | 54 | typedef enum FUNC_TYPE { | 
|  | 55 | FT_none, FT_general, FT_md, FT_cipher, FT_pkey, | 
|  | 56 | FT_md_alg, FT_cipher_alg | 
|  | 57 | } FUNC_TYPE; | 
|  | 58 |  | 
|  | 59 | typedef struct function_st { | 
|  | 60 | FUNC_TYPE type; | 
|  | 61 | const char *name; | 
|  | 62 | int (*func)(int argc, char *argv[]); | 
|  | 63 | const OPTIONS *help; | 
|  | 64 | } FUNCTION; | 
|  | 65 |  | 
|  | 66 | DEFINE_LHASH_OF(FUNCTION); | 
|  | 67 |  | 
|  | 68 | EOF | 
|  | 69 |  | 
|  | 70 | foreach (@ARGV) { | 
|  | 71 | printf "extern int %s_main(int argc, char *argv[]);\n", $_; | 
|  | 72 | } | 
|  | 73 | print "\n"; | 
|  | 74 |  | 
|  | 75 | foreach (@ARGV) { | 
|  | 76 | printf "extern const OPTIONS %s_options[];\n", $_; | 
|  | 77 | } | 
|  | 78 | print "\n"; | 
|  | 79 |  | 
|  | 80 | my %cmd_disabler = ( | 
|  | 81 | ciphers  => "sock", | 
|  | 82 | genrsa   => "rsa", | 
|  | 83 | rsautl   => "rsa", | 
|  | 84 | gendsa   => "dsa", | 
|  | 85 | dsaparam => "dsa", | 
|  | 86 | gendh    => "dh", | 
|  | 87 | dhparam  => "dh", | 
|  | 88 | ecparam  => "ec", | 
|  | 89 | pkcs12   => "des", | 
|  | 90 | ); | 
|  | 91 |  | 
|  | 92 | print "#ifdef INCLUDE_FUNCTION_TABLE\n"; | 
|  | 93 | print "static FUNCTION functions[] = {\n"; | 
|  | 94 | foreach my $cmd ( @ARGV ) { | 
|  | 95 | my $str = "    {FT_general, \"$cmd\", ${cmd}_main, ${cmd}_options},\n"; | 
|  | 96 | if ($cmd =~ /^s_/) { | 
|  | 97 | print "#ifndef OPENSSL_NO_SOCK\n${str}#endif\n"; | 
|  | 98 | } elsif (grep { $cmd eq $_ } @disablables) { | 
|  | 99 | print "#ifndef OPENSSL_NO_" . uc($cmd) . "\n${str}#endif\n"; | 
|  | 100 | } elsif (my $disabler = $cmd_disabler{$cmd}) { | 
|  | 101 | print "#ifndef OPENSSL_NO_" . uc($disabler) . "\n${str}#endif\n"; | 
|  | 102 | } else { | 
|  | 103 | print $str; | 
|  | 104 | } | 
|  | 105 | } | 
|  | 106 |  | 
|  | 107 | my %md_disabler = ( | 
|  | 108 | blake2b512 => "blake2", | 
|  | 109 | blake2s256 => "blake2", | 
|  | 110 | ); | 
|  | 111 | foreach my $cmd ( | 
|  | 112 | "md2", "md4", "md5", | 
|  | 113 | "gost", | 
|  | 114 | "sha1", "sha224", "sha256", "sha384", | 
|  | 115 | "sha512", "sha512-224", "sha512-256", | 
|  | 116 | "sha3-224", "sha3-256", "sha3-384", "sha3-512", | 
|  | 117 | "shake128", "shake256", | 
|  | 118 | "mdc2", "rmd160", "blake2b512", "blake2s256", | 
|  | 119 | "sm3" | 
|  | 120 | ) { | 
|  | 121 | my $str = "    {FT_md, \"$cmd\", dgst_main},\n"; | 
|  | 122 | if (grep { $cmd eq $_ } @disablables) { | 
|  | 123 | print "#ifndef OPENSSL_NO_" . uc($cmd) . "\n${str}#endif\n"; | 
|  | 124 | } elsif (my $disabler = $md_disabler{$cmd}) { | 
|  | 125 | print "#ifndef OPENSSL_NO_" . uc($disabler) . "\n${str}#endif\n"; | 
|  | 126 | } else { | 
|  | 127 | print $str; | 
|  | 128 | } | 
|  | 129 | } | 
|  | 130 |  | 
|  | 131 | my %cipher_disabler = ( | 
|  | 132 | des3  => "des", | 
|  | 133 | desx  => "des", | 
|  | 134 | cast5 => "cast", | 
|  | 135 | ); | 
|  | 136 | foreach my $cmd ( | 
|  | 137 | "aes-128-cbc", "aes-128-ecb", | 
|  | 138 | "aes-192-cbc", "aes-192-ecb", | 
|  | 139 | "aes-256-cbc", "aes-256-ecb", | 
|  | 140 | "aria-128-cbc", "aria-128-cfb", | 
|  | 141 | "aria-128-ctr", "aria-128-ecb", "aria-128-ofb", | 
|  | 142 | "aria-128-cfb1", "aria-128-cfb8", | 
|  | 143 | "aria-192-cbc", "aria-192-cfb", | 
|  | 144 | "aria-192-ctr", "aria-192-ecb", "aria-192-ofb", | 
|  | 145 | "aria-192-cfb1", "aria-192-cfb8", | 
|  | 146 | "aria-256-cbc", "aria-256-cfb", | 
|  | 147 | "aria-256-ctr", "aria-256-ecb", "aria-256-ofb", | 
|  | 148 | "aria-256-cfb1", "aria-256-cfb8", | 
|  | 149 | "camellia-128-cbc", "camellia-128-ecb", | 
|  | 150 | "camellia-192-cbc", "camellia-192-ecb", | 
|  | 151 | "camellia-256-cbc", "camellia-256-ecb", | 
|  | 152 | "base64", "zlib", | 
|  | 153 | "des", "des3", "desx", "idea", "seed", "rc4", "rc4-40", | 
|  | 154 | "rc2", "bf", "cast", "rc5", | 
|  | 155 | "des-ecb", "des-ede", "des-ede3", | 
|  | 156 | "des-cbc", "des-ede-cbc","des-ede3-cbc", | 
|  | 157 | "des-cfb", "des-ede-cfb","des-ede3-cfb", | 
|  | 158 | "des-ofb", "des-ede-ofb","des-ede3-ofb", | 
|  | 159 | "idea-cbc","idea-ecb", "idea-cfb", "idea-ofb", | 
|  | 160 | "seed-cbc","seed-ecb", "seed-cfb", "seed-ofb", | 
|  | 161 | "rc2-cbc", "rc2-ecb", "rc2-cfb","rc2-ofb", "rc2-64-cbc", "rc2-40-cbc", | 
|  | 162 | "bf-cbc", "bf-ecb", "bf-cfb", "bf-ofb", | 
|  | 163 | "cast5-cbc","cast5-ecb", "cast5-cfb","cast5-ofb", | 
|  | 164 | "cast-cbc", "rc5-cbc", "rc5-ecb", "rc5-cfb", "rc5-ofb", | 
|  | 165 | "sm4-cbc", "sm4-ecb", "sm4-cfb", "sm4-ofb", "sm4-ctr" | 
|  | 166 | ) { | 
|  | 167 | my $str = "    {FT_cipher, \"$cmd\", enc_main, enc_options},\n"; | 
|  | 168 | (my $algo = $cmd) =~ s/-.*//g; | 
|  | 169 | if ($cmd eq "zlib") { | 
|  | 170 | print "#ifdef ZLIB\n${str}#endif\n"; | 
|  | 171 | } elsif (grep { $algo eq $_ } @disablables) { | 
|  | 172 | print "#ifndef OPENSSL_NO_" . uc($algo) . "\n${str}#endif\n"; | 
|  | 173 | } elsif (my $disabler = $cipher_disabler{$algo}) { | 
|  | 174 | print "#ifndef OPENSSL_NO_" . uc($disabler) . "\n${str}#endif\n"; | 
|  | 175 | } else { | 
|  | 176 | print $str; | 
|  | 177 | } | 
|  | 178 | } | 
|  | 179 |  | 
|  | 180 | print "    {0, NULL, NULL}\n};\n"; | 
|  | 181 | print "#endif\n"; |