1e1051a39Sopenharmony_ci#! /usr/bin/env perl 2e1051a39Sopenharmony_ci# Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci# 4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci# this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci 9e1051a39Sopenharmony_ci# Generate progs.h file by looking for command mains in list of C files 10e1051a39Sopenharmony_ci# passed on the command line. 11e1051a39Sopenharmony_ci 12e1051a39Sopenharmony_ciuse strict; 13e1051a39Sopenharmony_ciuse warnings; 14e1051a39Sopenharmony_ciuse lib '.'; 15e1051a39Sopenharmony_ciuse configdata qw/@disablables %unified_info/; 16e1051a39Sopenharmony_ci 17e1051a39Sopenharmony_cimy $opt = shift @ARGV; 18e1051a39Sopenharmony_cidie "Unrecognised option, must be -C or -H\n" 19e1051a39Sopenharmony_ci unless ($opt eq '-H' || $opt eq '-C'); 20e1051a39Sopenharmony_ci 21e1051a39Sopenharmony_cimy %commands = (); 22e1051a39Sopenharmony_cimy $cmdre = qr/^\s*int\s+([a-z_][a-z0-9_]*)_main\(\s*int\s+argc\s*,/; 23e1051a39Sopenharmony_cimy $apps_openssl = shift @ARGV; 24e1051a39Sopenharmony_cimy $YEAR = [gmtime($ENV{SOURCE_DATE_EPOCH} || time())]->[5] + 1900; 25e1051a39Sopenharmony_ci 26e1051a39Sopenharmony_ci# because the program apps/openssl has object files as sources, and 27e1051a39Sopenharmony_ci# they then have the corresponding C files as source, we need to chain 28e1051a39Sopenharmony_ci# the lookups in %unified_info 29e1051a39Sopenharmony_cimy @openssl_source = 30e1051a39Sopenharmony_ci map { @{$unified_info{sources}->{$_}} } 31e1051a39Sopenharmony_ci grep { /\.o$/ 32e1051a39Sopenharmony_ci && !$unified_info{attributes}->{sources}->{$apps_openssl}->{$_}->{nocheck} } 33e1051a39Sopenharmony_ci @{$unified_info{sources}->{$apps_openssl}}; 34e1051a39Sopenharmony_ci 35e1051a39Sopenharmony_ciforeach my $filename (@openssl_source) { 36e1051a39Sopenharmony_ci open F, $filename or die "Couldn't open $filename: $!\n"; 37e1051a39Sopenharmony_ci foreach ( grep /$cmdre/, <F> ) { 38e1051a39Sopenharmony_ci my @foo = /$cmdre/; 39e1051a39Sopenharmony_ci $commands{$1} = 1; 40e1051a39Sopenharmony_ci } 41e1051a39Sopenharmony_ci close F; 42e1051a39Sopenharmony_ci} 43e1051a39Sopenharmony_ci 44e1051a39Sopenharmony_ci@ARGV = sort keys %commands; 45e1051a39Sopenharmony_ci 46e1051a39Sopenharmony_ciif ($opt eq '-H') { 47e1051a39Sopenharmony_ci print <<"EOF"; 48e1051a39Sopenharmony_ci/* 49e1051a39Sopenharmony_ci * WARNING: do not edit! 50e1051a39Sopenharmony_ci * Generated by apps/progs.pl 51e1051a39Sopenharmony_ci * 52e1051a39Sopenharmony_ci * Copyright 1995-$YEAR The OpenSSL Project Authors. All Rights Reserved. 53e1051a39Sopenharmony_ci * 54e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 55e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 56e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 57e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 58e1051a39Sopenharmony_ci */ 59e1051a39Sopenharmony_ci 60e1051a39Sopenharmony_ci#include "function.h" 61e1051a39Sopenharmony_ci 62e1051a39Sopenharmony_ciEOF 63e1051a39Sopenharmony_ci 64e1051a39Sopenharmony_ci foreach (@ARGV) { 65e1051a39Sopenharmony_ci printf "extern int %s_main(int argc, char *argv[]);\n", $_; 66e1051a39Sopenharmony_ci } 67e1051a39Sopenharmony_ci print "\n"; 68e1051a39Sopenharmony_ci 69e1051a39Sopenharmony_ci foreach (@ARGV) { 70e1051a39Sopenharmony_ci printf "extern const OPTIONS %s_options[];\n", $_; 71e1051a39Sopenharmony_ci } 72e1051a39Sopenharmony_ci print "\n"; 73e1051a39Sopenharmony_ci print "extern FUNCTION functions[];\n"; 74e1051a39Sopenharmony_ci} 75e1051a39Sopenharmony_ci 76e1051a39Sopenharmony_ciif ($opt eq '-C') { 77e1051a39Sopenharmony_ci print <<"EOF"; 78e1051a39Sopenharmony_ci/* 79e1051a39Sopenharmony_ci * WARNING: do not edit! 80e1051a39Sopenharmony_ci * Generated by apps/progs.pl 81e1051a39Sopenharmony_ci * 82e1051a39Sopenharmony_ci * Copyright 1995-$YEAR The OpenSSL Project Authors. All Rights Reserved. 83e1051a39Sopenharmony_ci * 84e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 85e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 86e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 87e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 88e1051a39Sopenharmony_ci */ 89e1051a39Sopenharmony_ci 90e1051a39Sopenharmony_ci#include "progs.h" 91e1051a39Sopenharmony_ci 92e1051a39Sopenharmony_ciEOF 93e1051a39Sopenharmony_ci 94e1051a39Sopenharmony_ci my %cmd_disabler = ( 95e1051a39Sopenharmony_ci ciphers => "sock", 96e1051a39Sopenharmony_ci genrsa => "rsa", 97e1051a39Sopenharmony_ci gendsa => "dsa", 98e1051a39Sopenharmony_ci dsaparam => "dsa", 99e1051a39Sopenharmony_ci gendh => "dh", 100e1051a39Sopenharmony_ci dhparam => "dh", 101e1051a39Sopenharmony_ci ecparam => "ec", 102e1051a39Sopenharmony_ci ); 103e1051a39Sopenharmony_ci my %cmd_deprecated = ( 104e1051a39Sopenharmony_ci# The format of this table is: 105e1051a39Sopenharmony_ci# [0] = alternative command to use instead 106e1051a39Sopenharmony_ci# [1] = deprecented in this version 107e1051a39Sopenharmony_ci# [2] = preprocessor conditional for exclusing irrespective of deprecation 108e1051a39Sopenharmony_ci# rsa => [ "pkey", "3_0", "rsa" ], 109e1051a39Sopenharmony_ci# genrsa => [ "genpkey", "3_0", "rsa" ], 110e1051a39Sopenharmony_ci rsautl => [ "pkeyutl", "3_0", "rsa" ], 111e1051a39Sopenharmony_ci# dhparam => [ "pkeyparam", "3_0", "dh" ], 112e1051a39Sopenharmony_ci# dsaparam => [ "pkeyparam", "3_0", "dsa" ], 113e1051a39Sopenharmony_ci# dsa => [ "pkey", "3_0", "dsa" ], 114e1051a39Sopenharmony_ci# gendsa => [ "genpkey", "3_0", "dsa" ], 115e1051a39Sopenharmony_ci# ec => [ "pkey", "3_0", "ec" ], 116e1051a39Sopenharmony_ci# ecparam => [ "pkeyparam", "3_0", "ec" ], 117e1051a39Sopenharmony_ci ); 118e1051a39Sopenharmony_ci 119e1051a39Sopenharmony_ci print "FUNCTION functions[] = {\n"; 120e1051a39Sopenharmony_ci foreach my $cmd ( @ARGV ) { 121e1051a39Sopenharmony_ci my $str = 122e1051a39Sopenharmony_ci " {FT_general, \"$cmd\", ${cmd}_main, ${cmd}_options, NULL, NULL},\n"; 123e1051a39Sopenharmony_ci if ($cmd =~ /^s_/) { 124e1051a39Sopenharmony_ci print "#ifndef OPENSSL_NO_SOCK\n${str}#endif\n"; 125e1051a39Sopenharmony_ci } elsif (my $deprecated = $cmd_deprecated{$cmd}) { 126e1051a39Sopenharmony_ci my @dep = @{$deprecated}; 127e1051a39Sopenharmony_ci my $daltprg = $dep[0]; 128e1051a39Sopenharmony_ci my $dver = $dep[1]; 129e1051a39Sopenharmony_ci my $dsys = $dep[2]; 130e1051a39Sopenharmony_ci print "#if !defined(OPENSSL_NO_DEPRECATED_" . $dver . ")"; 131e1051a39Sopenharmony_ci if ($dsys) { 132e1051a39Sopenharmony_ci print " && !defined(OPENSSL_NO_" . uc($dsys) . ")"; 133e1051a39Sopenharmony_ci } 134e1051a39Sopenharmony_ci $dver =~ s/_/./g; 135e1051a39Sopenharmony_ci my $dalt = "\"" . $daltprg . "\", \"" . $dver . "\""; 136e1051a39Sopenharmony_ci $str =~ s/NULL, NULL/$dalt/; 137e1051a39Sopenharmony_ci print "\n${str}#endif\n"; 138e1051a39Sopenharmony_ci } elsif (grep { $cmd eq $_ } @disablables) { 139e1051a39Sopenharmony_ci print "#ifndef OPENSSL_NO_" . uc($cmd) . "\n${str}#endif\n"; 140e1051a39Sopenharmony_ci } elsif (my $disabler = $cmd_disabler{$cmd}) { 141e1051a39Sopenharmony_ci print "#ifndef OPENSSL_NO_" . uc($disabler) . "\n${str}#endif\n"; 142e1051a39Sopenharmony_ci } else { 143e1051a39Sopenharmony_ci print $str; 144e1051a39Sopenharmony_ci } 145e1051a39Sopenharmony_ci } 146e1051a39Sopenharmony_ci 147e1051a39Sopenharmony_ci my %md_disabler = ( 148e1051a39Sopenharmony_ci blake2b512 => "blake2", 149e1051a39Sopenharmony_ci blake2s256 => "blake2", 150e1051a39Sopenharmony_ci ); 151e1051a39Sopenharmony_ci foreach my $cmd ( 152e1051a39Sopenharmony_ci "md2", "md4", "md5", 153e1051a39Sopenharmony_ci "sha1", "sha224", "sha256", "sha384", 154e1051a39Sopenharmony_ci "sha512", "sha512-224", "sha512-256", 155e1051a39Sopenharmony_ci "sha3-224", "sha3-256", "sha3-384", "sha3-512", 156e1051a39Sopenharmony_ci "shake128", "shake256", 157e1051a39Sopenharmony_ci "mdc2", "rmd160", "blake2b512", "blake2s256", 158e1051a39Sopenharmony_ci "sm3" 159e1051a39Sopenharmony_ci ) { 160e1051a39Sopenharmony_ci my $str = " {FT_md, \"$cmd\", dgst_main, NULL, NULL},\n"; 161e1051a39Sopenharmony_ci if (grep { $cmd eq $_ } @disablables) { 162e1051a39Sopenharmony_ci print "#ifndef OPENSSL_NO_" . uc($cmd) . "\n${str}#endif\n"; 163e1051a39Sopenharmony_ci } elsif (my $disabler = $md_disabler{$cmd}) { 164e1051a39Sopenharmony_ci print "#ifndef OPENSSL_NO_" . uc($disabler) . "\n${str}#endif\n"; 165e1051a39Sopenharmony_ci } else { 166e1051a39Sopenharmony_ci print $str; 167e1051a39Sopenharmony_ci } 168e1051a39Sopenharmony_ci } 169e1051a39Sopenharmony_ci 170e1051a39Sopenharmony_ci my %cipher_disabler = ( 171e1051a39Sopenharmony_ci des3 => "des", 172e1051a39Sopenharmony_ci desx => "des", 173e1051a39Sopenharmony_ci cast5 => "cast", 174e1051a39Sopenharmony_ci ); 175e1051a39Sopenharmony_ci foreach my $cmd ( 176e1051a39Sopenharmony_ci "aes-128-cbc", "aes-128-ecb", 177e1051a39Sopenharmony_ci "aes-192-cbc", "aes-192-ecb", 178e1051a39Sopenharmony_ci "aes-256-cbc", "aes-256-ecb", 179e1051a39Sopenharmony_ci "aria-128-cbc", "aria-128-cfb", 180e1051a39Sopenharmony_ci "aria-128-ctr", "aria-128-ecb", "aria-128-ofb", 181e1051a39Sopenharmony_ci "aria-128-cfb1", "aria-128-cfb8", 182e1051a39Sopenharmony_ci "aria-192-cbc", "aria-192-cfb", 183e1051a39Sopenharmony_ci "aria-192-ctr", "aria-192-ecb", "aria-192-ofb", 184e1051a39Sopenharmony_ci "aria-192-cfb1", "aria-192-cfb8", 185e1051a39Sopenharmony_ci "aria-256-cbc", "aria-256-cfb", 186e1051a39Sopenharmony_ci "aria-256-ctr", "aria-256-ecb", "aria-256-ofb", 187e1051a39Sopenharmony_ci "aria-256-cfb1", "aria-256-cfb8", 188e1051a39Sopenharmony_ci "camellia-128-cbc", "camellia-128-ecb", 189e1051a39Sopenharmony_ci "camellia-192-cbc", "camellia-192-ecb", 190e1051a39Sopenharmony_ci "camellia-256-cbc", "camellia-256-ecb", 191e1051a39Sopenharmony_ci "base64", "zlib", 192e1051a39Sopenharmony_ci "des", "des3", "desx", "idea", "seed", "rc4", "rc4-40", 193e1051a39Sopenharmony_ci "rc2", "bf", "cast", "rc5", 194e1051a39Sopenharmony_ci "des-ecb", "des-ede", "des-ede3", 195e1051a39Sopenharmony_ci "des-cbc", "des-ede-cbc","des-ede3-cbc", 196e1051a39Sopenharmony_ci "des-cfb", "des-ede-cfb","des-ede3-cfb", 197e1051a39Sopenharmony_ci "des-ofb", "des-ede-ofb","des-ede3-ofb", 198e1051a39Sopenharmony_ci "idea-cbc","idea-ecb", "idea-cfb", "idea-ofb", 199e1051a39Sopenharmony_ci "seed-cbc","seed-ecb", "seed-cfb", "seed-ofb", 200e1051a39Sopenharmony_ci "rc2-cbc", "rc2-ecb", "rc2-cfb","rc2-ofb", "rc2-64-cbc", "rc2-40-cbc", 201e1051a39Sopenharmony_ci "bf-cbc", "bf-ecb", "bf-cfb", "bf-ofb", 202e1051a39Sopenharmony_ci "cast5-cbc","cast5-ecb", "cast5-cfb","cast5-ofb", 203e1051a39Sopenharmony_ci "cast-cbc", "rc5-cbc", "rc5-ecb", "rc5-cfb", "rc5-ofb", 204e1051a39Sopenharmony_ci "sm4-cbc", "sm4-ecb", "sm4-cfb", "sm4-ofb", "sm4-ctr" 205e1051a39Sopenharmony_ci ) { 206e1051a39Sopenharmony_ci my $str = " {FT_cipher, \"$cmd\", enc_main, enc_options, NULL},\n"; 207e1051a39Sopenharmony_ci (my $algo = $cmd) =~ s/-.*//g; 208e1051a39Sopenharmony_ci if ($cmd eq "zlib") { 209e1051a39Sopenharmony_ci print "#ifdef ZLIB\n${str}#endif\n"; 210e1051a39Sopenharmony_ci } elsif (grep { $algo eq $_ } @disablables) { 211e1051a39Sopenharmony_ci print "#ifndef OPENSSL_NO_" . uc($algo) . "\n${str}#endif\n"; 212e1051a39Sopenharmony_ci } elsif (my $disabler = $cipher_disabler{$algo}) { 213e1051a39Sopenharmony_ci print "#ifndef OPENSSL_NO_" . uc($disabler) . "\n${str}#endif\n"; 214e1051a39Sopenharmony_ci } else { 215e1051a39Sopenharmony_ci print $str; 216e1051a39Sopenharmony_ci } 217e1051a39Sopenharmony_ci } 218e1051a39Sopenharmony_ci 219e1051a39Sopenharmony_ci print " {0, NULL, NULL, NULL, NULL}\n};\n"; 220e1051a39Sopenharmony_ci} 221