openssl/apps/progs.pl
Rich Salz 7e1b748570 Big apps cleanup (option-parsing, etc)
This is merges the old "rsalz-monolith" branch over to master.  The biggest
change is that option parsing switch from cascasding 'else if strcmp("-foo")'
to a utility routine and somethin akin to getopt.  Also, an error in the
command line no longer prints the full summary; use -help (or --help :)
for that.  There have been many other changes and code-cleanup, see
bullet list below.

Special thanks to Matt for the long and detailed code review.

TEMPORARY:
        For now, comment out CRYPTO_mem_leaks() at end of main

Tickets closed:
        RT3515: Use 3DES in pkcs12 if built with no-rc2
        RT1766: s_client -reconnect and -starttls broke
        RT2932: Catch write errors
        RT2604: port should be 'unsigned short'
        RT2983: total_bytes undeclared #ifdef RENEG
        RT1523: Add -nocert to fix output in x509 app
        RT3508: Remove unused variable introduced by b09eb24
        RT3511: doc fix; req default serial is random
        RT1325,2973: Add more extensions to c_rehash
        RT2119,3407: Updated to dgst.pod
        RT2379: Additional typo fix
        RT2693: Extra include of string.h
        RT2880: HFS is case-insensitive filenames
        RT3246: req command prints version number wrong

Other changes; incompatibilities marked with *:
        Add SCSV support
        Add -misalign to speed command
        Make dhparam, dsaparam, ecparam, x509 output C in proper style
        Make some internal ocsp.c functions void
        Only display cert usages with -help in verify
        Use global bio_err, remove "BIO*err" parameter from functions
        For filenames, - always means stdin (or stdout as appropriate)
        Add aliases for -des/aes "wrap" ciphers.
        *Remove support for IISSGC (server gated crypto)
        *The undocumented OCSP -header flag is now "-header name=value"
        *Documented the OCSP -header flag

Reviewed-by: Matt Caswell <matt@openssl.org>
2015-04-24 15:26:15 -04:00

129 lines
3.8 KiB
Raku

#!/usr/local/bin/perl
# Generate progs.h file from list of "programs" passed on the command line.
print <<'EOF';
/*
* Automatically generated by progs.pl for openssl.c
* Copyright (c) 2008 The OpenSSL Project. All rights reserved.
* See the openssl.c for copyright details.
*/
typedef enum FUNC_TYPE {
FT_none, FT_general, FT_md, FT_cipher, FT_pkey,
FT_md_alg, FT_cipher_alg
} FUNC_TYPE;
typedef struct function_st {
FUNC_TYPE type;
const char *name;
int (*func)(int argc,char *argv[]);
const OPTIONS *help;
} FUNCTION;
EOF
grep(s/\.o//, @ARGV);
grep(s/^asn1pars$/asn1parse/, @ARGV);
grep(s/^crl2p7$/crl2pkcs7/, @ARGV);
push @ARGV, 'list';
push @ARGV, 'help';
push @ARGV, 'exit';
foreach (@ARGV) {
printf "extern int %s_main(int argc, char *argv[]);\n", $_;
}
printf "\n#ifdef INCLUDE_FUNCTION_TABLE\n";
foreach (@ARGV) {
printf "extern OPTIONS %s_options[];\n", $_;
}
printf "FUNCTION functions[] = {\n";
foreach (@ARGV) {
$str=" { FT_general, \"$_\", ${_}_main, ${_}_options },\n";
if (/^s_/ || /^ciphers$/) {
print "#if !defined(OPENSSL_NO_SOCK)\n${str}#endif\n";
} elsif (/^engine$/) {
print "#ifndef OPENSSL_NO_ENGINE\n${str}#endif\n";
} elsif (/^rsa$/ || /^genrsa$/ || /^rsautl$/) {
print "#ifndef OPENSSL_NO_RSA\n${str}#endif\n";
} elsif (/^dsa$/ || /^gendsa$/ || /^dsaparam$/) {
print "#ifndef OPENSSL_NO_DSA\n${str}#endif\n";
} elsif (/^ec$/ || /^ecparam$/) {
print "#ifndef OPENSSL_NO_EC\n${str}#endif\n";
} elsif (/^dh$/ || /^gendh$/ || /^dhparam$/) {
print "#ifndef OPENSSL_NO_DH\n${str}#endif\n";
} elsif (/^pkcs12$/) {
print "#if !defined(OPENSSL_NO_DES)\n${str}#endif\n";
} elsif (/^cms$/) {
print "#ifndef OPENSSL_NO_CMS\n${str}#endif\n";
} elsif (/^ocsp$/) {
print "#ifndef OPENSSL_NO_OCSP\n${str}#endif\n";
} elsif (/^srp$/) {
print "#ifndef OPENSSL_NO_SRP\n${str}#endif\n";
} else {
print $str;
}
}
foreach (
"md2", "md4", "md5",
"md_ghost94",
"sha", "sha1", "sha224", "sha256", "sha384", "sha512",
"mdc2", "rmd160"
) {
printf "#ifndef OPENSSL_NO_".uc($_)."\n" if ! /sha/;
printf " { FT_md, \"".$_."\", dgst_main},\n";
printf "#endif\n" if ! /sha/;
}
foreach (
"aes-128-cbc", "aes-128-ecb",
"aes-192-cbc", "aes-192-ecb",
"aes-256-cbc", "aes-256-ecb",
"camellia-128-cbc", "camellia-128-ecb",
"camellia-192-cbc", "camellia-192-ecb",
"camellia-256-cbc", "camellia-256-ecb",
"base64", "zlib",
"des", "des3", "desx", "idea", "seed", "rc4", "rc4-40",
"rc2", "bf", "cast", "rc5",
"des-ecb", "des-ede", "des-ede3",
"des-cbc", "des-ede-cbc","des-ede3-cbc",
"des-cfb", "des-ede-cfb","des-ede3-cfb",
"des-ofb", "des-ede-ofb","des-ede3-ofb",
"idea-cbc","idea-ecb", "idea-cfb", "idea-ofb",
"seed-cbc","seed-ecb", "seed-cfb", "seed-ofb",
"rc2-cbc", "rc2-ecb", "rc2-cfb","rc2-ofb", "rc2-64-cbc", "rc2-40-cbc",
"bf-cbc", "bf-ecb", "bf-cfb", "bf-ofb",
"cast5-cbc","cast5-ecb", "cast5-cfb","cast5-ofb",
"cast-cbc", "rc5-cbc", "rc5-ecb", "rc5-cfb", "rc5-ofb"
) {
$str=" { FT_cipher, \"$_\", enc_main, enc_options },\n";
if (/des/) {
printf "#ifndef OPENSSL_NO_DES\n${str}#endif\n";
} elsif (/aes/) {
printf "#ifndef OPENSSL_NO_AES\n${str}#endif\n";
} elsif (/camellia/) {
printf "#ifndef OPENSSL_NO_CAMELLIA\n${str}#endif\n";
} elsif (/idea/) {
printf "#ifndef OPENSSL_NO_IDEA\n${str}#endif\n";
} elsif (/seed/) {
printf "#ifndef OPENSSL_NO_SEED\n${str}#endif\n";
} elsif (/rc4/) {
printf "#ifndef OPENSSL_NO_RC4\n${str}#endif\n";
} elsif (/rc2/) {
printf "#ifndef OPENSSL_NO_RC2\n${str}#endif\n";
} elsif (/bf/) {
printf "#ifndef OPENSSL_NO_BF\n${str}#endif\n";
} elsif (/cast/) {
printf "#ifndef OPENSSL_NO_CAST\n${str}#endif\n";
} elsif (/rc5/) {
printf "#ifndef OPENSSL_NO_RC5\n${str}#endif\n";
} elsif (/zlib/) {
printf "#ifdef ZLIB\n${str}#endif\n";
} else {
print $str;
}
}
print " { 0, NULL, NULL}\n};\n";
printf "#endif\n";