1*e71b7053SJung-uk Kim /* 2*e71b7053SJung-uk Kim * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. 374664626SKris Kennaway * 4*e71b7053SJung-uk Kim * Licensed under the OpenSSL license (the "License"). You may not use 5*e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy 6*e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at 7*e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html 85c87c606SMark Murray */ 974664626SKris Kennaway 1074664626SKris Kennaway #include <stdio.h> 1174664626SKris Kennaway #include <stdlib.h> 1274664626SKris Kennaway #include <string.h> 1374664626SKris Kennaway #include "apps.h" 14*e71b7053SJung-uk Kim #include "progs.h" 1574664626SKris Kennaway #include <openssl/evp.h> 1674664626SKris Kennaway #include <openssl/crypto.h> 173b4e3dcbSSimon L. B. Nielsen #include <openssl/bn.h> 185c87c606SMark Murray #ifndef OPENSSL_NO_MD2 195c87c606SMark Murray # include <openssl/md2.h> 205c87c606SMark Murray #endif 215c87c606SMark Murray #ifndef OPENSSL_NO_RC4 225c87c606SMark Murray # include <openssl/rc4.h> 235c87c606SMark Murray #endif 245c87c606SMark Murray #ifndef OPENSSL_NO_DES 255c87c606SMark Murray # include <openssl/des.h> 265c87c606SMark Murray #endif 275c87c606SMark Murray #ifndef OPENSSL_NO_IDEA 285c87c606SMark Murray # include <openssl/idea.h> 295c87c606SMark Murray #endif 305c87c606SMark Murray #ifndef OPENSSL_NO_BF 315c87c606SMark Murray # include <openssl/blowfish.h> 325c87c606SMark Murray #endif 3374664626SKris Kennaway 34*e71b7053SJung-uk Kim typedef enum OPTION_choice { 35*e71b7053SJung-uk Kim OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, 36*e71b7053SJung-uk Kim OPT_B, OPT_D, OPT_E, OPT_F, OPT_O, OPT_P, OPT_V, OPT_A, OPT_R 37*e71b7053SJung-uk Kim } OPTION_CHOICE; 3874664626SKris Kennaway 39*e71b7053SJung-uk Kim const OPTIONS version_options[] = { 40*e71b7053SJung-uk Kim {"help", OPT_HELP, '-', "Display this summary"}, 41*e71b7053SJung-uk Kim {"a", OPT_A, '-', "Show all data"}, 42*e71b7053SJung-uk Kim {"b", OPT_B, '-', "Show build date"}, 43*e71b7053SJung-uk Kim {"d", OPT_D, '-', "Show configuration directory"}, 44*e71b7053SJung-uk Kim {"e", OPT_E, '-', "Show engines directory"}, 45*e71b7053SJung-uk Kim {"f", OPT_F, '-', "Show compiler flags used"}, 46*e71b7053SJung-uk Kim {"o", OPT_O, '-', "Show some internal datatype options"}, 47*e71b7053SJung-uk Kim {"p", OPT_P, '-', "Show target build platform"}, 48*e71b7053SJung-uk Kim {"r", OPT_R, '-', "Show random seeding options"}, 49*e71b7053SJung-uk Kim {"v", OPT_V, '-', "Show library version"}, 50*e71b7053SJung-uk Kim {NULL} 51*e71b7053SJung-uk Kim }; 52f579bf8eSKris Kennaway 53*e71b7053SJung-uk Kim #if defined(OPENSSL_RAND_SEED_DEVRANDOM) || defined(OPENSSL_RAND_SEED_EGD) 54*e71b7053SJung-uk Kim static void printlist(const char *prefix, const char **dev) 5574664626SKris Kennaway { 56*e71b7053SJung-uk Kim printf("%s (", prefix); 57*e71b7053SJung-uk Kim for ( ; *dev != NULL; dev++) 58*e71b7053SJung-uk Kim printf(" \"%s\"", *dev); 59*e71b7053SJung-uk Kim printf(" )"); 60*e71b7053SJung-uk Kim } 61*e71b7053SJung-uk Kim #endif 62*e71b7053SJung-uk Kim 63*e71b7053SJung-uk Kim int version_main(int argc, char **argv) 64*e71b7053SJung-uk Kim { 65*e71b7053SJung-uk Kim int ret = 1, dirty = 0, seed = 0; 665c87c606SMark Murray int cflags = 0, version = 0, date = 0, options = 0, platform = 0, dir = 0; 67*e71b7053SJung-uk Kim int engdir = 0; 68*e71b7053SJung-uk Kim char *prog; 69*e71b7053SJung-uk Kim OPTION_CHOICE o; 7074664626SKris Kennaway 71*e71b7053SJung-uk Kim prog = opt_init(argc, argv, version_options); 72*e71b7053SJung-uk Kim while ((o = opt_next()) != OPT_EOF) { 73*e71b7053SJung-uk Kim switch (o) { 74*e71b7053SJung-uk Kim case OPT_EOF: 75*e71b7053SJung-uk Kim case OPT_ERR: 76*e71b7053SJung-uk Kim opthelp: 77*e71b7053SJung-uk Kim BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); 7874664626SKris Kennaway goto end; 79*e71b7053SJung-uk Kim case OPT_HELP: 80*e71b7053SJung-uk Kim opt_help(version_options); 81*e71b7053SJung-uk Kim ret = 0; 82*e71b7053SJung-uk Kim goto end; 83*e71b7053SJung-uk Kim case OPT_B: 84*e71b7053SJung-uk Kim dirty = date = 1; 85*e71b7053SJung-uk Kim break; 86*e71b7053SJung-uk Kim case OPT_D: 87*e71b7053SJung-uk Kim dirty = dir = 1; 88*e71b7053SJung-uk Kim break; 89*e71b7053SJung-uk Kim case OPT_E: 90*e71b7053SJung-uk Kim dirty = engdir = 1; 91*e71b7053SJung-uk Kim break; 92*e71b7053SJung-uk Kim case OPT_F: 93*e71b7053SJung-uk Kim dirty = cflags = 1; 94*e71b7053SJung-uk Kim break; 95*e71b7053SJung-uk Kim case OPT_O: 96*e71b7053SJung-uk Kim dirty = options = 1; 97*e71b7053SJung-uk Kim break; 98*e71b7053SJung-uk Kim case OPT_P: 99*e71b7053SJung-uk Kim dirty = platform = 1; 100*e71b7053SJung-uk Kim break; 101*e71b7053SJung-uk Kim case OPT_R: 102*e71b7053SJung-uk Kim dirty = seed = 1; 103*e71b7053SJung-uk Kim break; 104*e71b7053SJung-uk Kim case OPT_V: 105*e71b7053SJung-uk Kim dirty = version = 1; 106*e71b7053SJung-uk Kim break; 107*e71b7053SJung-uk Kim case OPT_A: 108*e71b7053SJung-uk Kim seed = options = cflags = version = date = platform = dir = engdir 109*e71b7053SJung-uk Kim = 1; 110*e71b7053SJung-uk Kim break; 11174664626SKris Kennaway } 11274664626SKris Kennaway } 113*e71b7053SJung-uk Kim if (opt_num_rest() != 0) { 114*e71b7053SJung-uk Kim BIO_printf(bio_err, "Extra parameters given.\n"); 115*e71b7053SJung-uk Kim goto opthelp; 116*e71b7053SJung-uk Kim } 117*e71b7053SJung-uk Kim if (!dirty) 118*e71b7053SJung-uk Kim version = 1; 11974664626SKris Kennaway 1206f9291ceSJung-uk Kim if (version) { 121*e71b7053SJung-uk Kim if (OpenSSL_version_num() == OPENSSL_VERSION_NUMBER) 122*e71b7053SJung-uk Kim printf("%s\n", OpenSSL_version(OPENSSL_VERSION)); 123*e71b7053SJung-uk Kim else 1243b4e3dcbSSimon L. B. Nielsen printf("%s (Library: %s)\n", 125*e71b7053SJung-uk Kim OPENSSL_VERSION_TEXT, OpenSSL_version(OPENSSL_VERSION)); 1263b4e3dcbSSimon L. B. Nielsen } 1276f9291ceSJung-uk Kim if (date) 128*e71b7053SJung-uk Kim printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON)); 1296f9291ceSJung-uk Kim if (platform) 130*e71b7053SJung-uk Kim printf("%s\n", OpenSSL_version(OPENSSL_PLATFORM)); 1316f9291ceSJung-uk Kim if (options) { 13274664626SKris Kennaway printf("options: "); 13374664626SKris Kennaway printf("%s ", BN_options()); 1345c87c606SMark Murray #ifndef OPENSSL_NO_MD2 13574664626SKris Kennaway printf("%s ", MD2_options()); 13674664626SKris Kennaway #endif 1375c87c606SMark Murray #ifndef OPENSSL_NO_RC4 13874664626SKris Kennaway printf("%s ", RC4_options()); 13974664626SKris Kennaway #endif 1405c87c606SMark Murray #ifndef OPENSSL_NO_DES 1415c87c606SMark Murray printf("%s ", DES_options()); 14274664626SKris Kennaway #endif 1435c87c606SMark Murray #ifndef OPENSSL_NO_IDEA 144*e71b7053SJung-uk Kim printf("%s ", IDEA_options()); 14574664626SKris Kennaway #endif 1465c87c606SMark Murray #ifndef OPENSSL_NO_BF 14774664626SKris Kennaway printf("%s ", BF_options()); 14874664626SKris Kennaway #endif 14974664626SKris Kennaway printf("\n"); 15074664626SKris Kennaway } 1516f9291ceSJung-uk Kim if (cflags) 152*e71b7053SJung-uk Kim printf("%s\n", OpenSSL_version(OPENSSL_CFLAGS)); 1536f9291ceSJung-uk Kim if (dir) 154*e71b7053SJung-uk Kim printf("%s\n", OpenSSL_version(OPENSSL_DIR)); 155*e71b7053SJung-uk Kim if (engdir) 156*e71b7053SJung-uk Kim printf("%s\n", OpenSSL_version(OPENSSL_ENGINES_DIR)); 157*e71b7053SJung-uk Kim if (seed) { 158*e71b7053SJung-uk Kim printf("Seeding source:"); 159*e71b7053SJung-uk Kim #ifdef OPENSSL_RAND_SEED_RTDSC 160*e71b7053SJung-uk Kim printf(" rtdsc"); 161*e71b7053SJung-uk Kim #endif 162*e71b7053SJung-uk Kim #ifdef OPENSSL_RAND_SEED_RDCPU 163*e71b7053SJung-uk Kim printf(" rdrand ( rdseed rdrand )"); 164*e71b7053SJung-uk Kim #endif 165*e71b7053SJung-uk Kim #ifdef OPENSSL_RAND_SEED_LIBRANDOM 166*e71b7053SJung-uk Kim printf(" C-library-random"); 167*e71b7053SJung-uk Kim #endif 168*e71b7053SJung-uk Kim #ifdef OPENSSL_RAND_SEED_GETRANDOM 169*e71b7053SJung-uk Kim printf(" getrandom-syscall"); 170*e71b7053SJung-uk Kim #endif 171*e71b7053SJung-uk Kim #ifdef OPENSSL_RAND_SEED_DEVRANDOM 172*e71b7053SJung-uk Kim { 173*e71b7053SJung-uk Kim static const char *dev[] = { DEVRANDOM, NULL }; 174*e71b7053SJung-uk Kim printlist(" random-device", dev); 175*e71b7053SJung-uk Kim } 176*e71b7053SJung-uk Kim #endif 177*e71b7053SJung-uk Kim #ifdef OPENSSL_RAND_SEED_EGD 178*e71b7053SJung-uk Kim { 179*e71b7053SJung-uk Kim static const char *dev[] = { DEVRANDOM_EGD, NULL }; 180*e71b7053SJung-uk Kim printlist(" EGD", dev); 181*e71b7053SJung-uk Kim } 182*e71b7053SJung-uk Kim #endif 183*e71b7053SJung-uk Kim #ifdef OPENSSL_RAND_SEED_NONE 184*e71b7053SJung-uk Kim printf(" none"); 185*e71b7053SJung-uk Kim #endif 186*e71b7053SJung-uk Kim #ifdef OPENSSL_RAND_SEED_OS 187*e71b7053SJung-uk Kim printf(" os-specific"); 188*e71b7053SJung-uk Kim #endif 189*e71b7053SJung-uk Kim printf("\n"); 190*e71b7053SJung-uk Kim } 191*e71b7053SJung-uk Kim ret = 0; 19274664626SKris Kennaway end: 193*e71b7053SJung-uk Kim return ret; 19474664626SKris Kennaway } 195