| Index: openssl/apps/openssl.c
|
| ===================================================================
|
| --- openssl/apps/openssl.c (revision 105093)
|
| +++ openssl/apps/openssl.c (working copy)
|
| @@ -135,19 +135,17 @@
|
| * type of "FUNCTION*"). This removes the necessity for macro-generated wrapper
|
| * functions. */
|
|
|
| -/* static unsigned long MS_CALLBACK hash(FUNCTION *a); */
|
| -static unsigned long MS_CALLBACK hash(const void *a_void);
|
| -/* static int MS_CALLBACK cmp(FUNCTION *a,FUNCTION *b); */
|
| -static int MS_CALLBACK cmp(const void *a_void,const void *b_void);
|
| -static LHASH *prog_init(void );
|
| -static int do_cmd(LHASH *prog,int argc,char *argv[]);
|
| +static LHASH_OF(FUNCTION) *prog_init(void );
|
| +static int do_cmd(LHASH_OF(FUNCTION) *prog,int argc,char *argv[]);
|
| +static void list_pkey(BIO *out);
|
| +static void list_cipher(BIO *out);
|
| +static void list_md(BIO *out);
|
| char *default_config_file=NULL;
|
|
|
| /* Make sure there is only one when MONOLITH is defined */
|
| #ifdef MONOLITH
|
| CONF *config=NULL;
|
| BIO *bio_err=NULL;
|
| -int in_FIPS_mode=0;
|
| #endif
|
|
|
|
|
| @@ -214,8 +212,13 @@
|
| }
|
| }
|
|
|
| +#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64)
|
| +# define ARGV _Argv
|
| +#else
|
| +# define ARGV Argv
|
| +#endif
|
|
|
| -int main(int Argc, char *Argv[])
|
| +int main(int Argc, char *ARGV[])
|
| {
|
| ARGS arg;
|
| #define PROG_NAME_SIZE 39
|
| @@ -227,28 +230,60 @@
|
| int n,i,ret=0;
|
| int argc;
|
| char **argv,*p;
|
| - LHASH *prog=NULL;
|
| + LHASH_OF(FUNCTION) *prog=NULL;
|
| long errline;
|
| -
|
| - arg.data=NULL;
|
| - arg.count=0;
|
|
|
| - in_FIPS_mode = 0;
|
| +#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64)
|
| + /* 2011-03-22 SMS.
|
| + * If we have 32-bit pointers everywhere, then we're safe, and
|
| + * we bypass this mess, as on non-VMS systems. (See ARGV,
|
| + * above.)
|
| + * Problem 1: Compaq/HP C before V7.3 always used 32-bit
|
| + * pointers for argv[].
|
| + * Fix 1: For a 32-bit argv[], when we're using 64-bit pointers
|
| + * everywhere else, we always allocate and use a 64-bit
|
| + * duplicate of argv[].
|
| + * Problem 2: Compaq/HP C V7.3 (Alpha, IA64) before ECO1 failed
|
| + * to NULL-terminate a 64-bit argv[]. (As this was written, the
|
| + * compiler ECO was available only on IA64.)
|
| + * Fix 2: Unless advised not to (VMS_TRUST_ARGV), we test a
|
| + * 64-bit argv[argc] for NULL, and, if necessary, use a
|
| + * (properly) NULL-terminated (64-bit) duplicate of argv[].
|
| + * The same code is used in either case to duplicate argv[].
|
| + * Some of these decisions could be handled in preprocessing,
|
| + * but the code tends to get even uglier, and the penalty for
|
| + * deciding at compile- or run-time is tiny.
|
| + */
|
| + char **Argv = NULL;
|
| + int free_Argv = 0;
|
|
|
| - if(getenv("OPENSSL_FIPS")) {
|
| -#ifdef OPENSSL_FIPS
|
| - if (!FIPS_mode_set(1)) {
|
| - ERR_load_crypto_strings();
|
| - ERR_print_errors(BIO_new_fp(stderr,BIO_NOCLOSE));
|
| - EXIT(1);
|
| + if ((sizeof( _Argv) < 8) /* 32-bit argv[]. */
|
| +# if !defined( VMS_TRUST_ARGV)
|
| + || (_Argv[ Argc] != NULL) /* Untrusted argv[argc] not NULL. */
|
| +# endif
|
| + )
|
| + {
|
| + int i;
|
| + Argv = OPENSSL_malloc( (Argc+ 1)* sizeof( char *));
|
| + if (Argv == NULL)
|
| + { ret = -1; goto end; }
|
| + for(i = 0; i < Argc; i++)
|
| + Argv[i] = _Argv[i];
|
| + Argv[ Argc] = NULL; /* Certain NULL termination. */
|
| + free_Argv = 1;
|
| }
|
| - in_FIPS_mode = 1;
|
| -#else
|
| - fprintf(stderr, "FIPS mode not supported.\n");
|
| - EXIT(1);
|
| -#endif
|
| + else
|
| + {
|
| + /* Use the known-good 32-bit argv[] (which needs the
|
| + * type cast to satisfy the compiler), or the trusted or
|
| + * tested-good 64-bit argv[] as-is. */
|
| + Argv = (char **)_Argv;
|
| }
|
| +#endif /* defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64) */
|
|
|
| + arg.data=NULL;
|
| + arg.count=0;
|
| +
|
| if (bio_err == NULL)
|
| if ((bio_err=BIO_new(BIO_s_file())) != NULL)
|
| BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
|
| @@ -290,9 +325,23 @@
|
| i=NCONF_load(config,p,&errline);
|
| if (i == 0)
|
| {
|
| - NCONF_free(config);
|
| - config = NULL;
|
| - ERR_clear_error();
|
| + if (ERR_GET_REASON(ERR_peek_last_error())
|
| + == CONF_R_NO_SUCH_FILE)
|
| + {
|
| +#if 0 /* ANDROID */
|
| + BIO_printf(bio_err,
|
| + "WARNING: can't open config file: %s\n",p);
|
| +#endif
|
| + ERR_clear_error();
|
| + NCONF_free(config);
|
| + config = NULL;
|
| + }
|
| + else
|
| + {
|
| + ERR_print_errors(bio_err);
|
| + NCONF_free(config);
|
| + exit(1);
|
| + }
|
| }
|
|
|
| prog=prog_init();
|
| @@ -301,7 +350,7 @@
|
| program_name(Argv[0],pname,sizeof pname);
|
|
|
| f.name=pname;
|
| - fp=(FUNCTION *)lh_retrieve(prog,&f);
|
| + fp=lh_FUNCTION_retrieve(prog,&f);
|
| if (fp != NULL)
|
| {
|
| Argv[0]=pname;
|
| @@ -368,7 +417,7 @@
|
| NCONF_free(config);
|
| config=NULL;
|
| }
|
| - if (prog != NULL) lh_free(prog);
|
| + if (prog != NULL) lh_FUNCTION_free(prog);
|
| if (arg.data != NULL) OPENSSL_free(arg.data);
|
|
|
| apps_shutdown();
|
| @@ -379,14 +428,25 @@
|
| BIO_free(bio_err);
|
| bio_err=NULL;
|
| }
|
| +#if defined( OPENSSL_SYS_VMS) && (__INITIAL_POINTER_SIZE == 64)
|
| + /* Free any duplicate Argv[] storage. */
|
| + if (free_Argv)
|
| + {
|
| + OPENSSL_free(Argv);
|
| + }
|
| +#endif
|
| OPENSSL_EXIT(ret);
|
| }
|
|
|
| #define LIST_STANDARD_COMMANDS "list-standard-commands"
|
| #define LIST_MESSAGE_DIGEST_COMMANDS "list-message-digest-commands"
|
| +#define LIST_MESSAGE_DIGEST_ALGORITHMS "list-message-digest-algorithms"
|
| #define LIST_CIPHER_COMMANDS "list-cipher-commands"
|
| +#define LIST_CIPHER_ALGORITHMS "list-cipher-algorithms"
|
| +#define LIST_PUBLIC_KEY_ALGORITHMS "list-public-key-algorithms"
|
|
|
| -static int do_cmd(LHASH *prog, int argc, char *argv[])
|
| +
|
| +static int do_cmd(LHASH_OF(FUNCTION) *prog, int argc, char *argv[])
|
| {
|
| FUNCTION f,*fp;
|
| int i,ret=1,tp,nl;
|
| @@ -394,7 +454,22 @@
|
| if ((argc <= 0) || (argv[0] == NULL))
|
| { ret=0; goto end; }
|
| f.name=argv[0];
|
| - fp=(FUNCTION *)lh_retrieve(prog,&f);
|
| + fp=lh_FUNCTION_retrieve(prog,&f);
|
| + if (fp == NULL)
|
| + {
|
| + if (EVP_get_digestbyname(argv[0]))
|
| + {
|
| + f.type = FUNC_TYPE_MD;
|
| + f.func = dgst_main;
|
| + fp = &f;
|
| + }
|
| + else if (EVP_get_cipherbyname(argv[0]))
|
| + {
|
| + f.type = FUNC_TYPE_CIPHER;
|
| + f.func = enc_main;
|
| + fp = &f;
|
| + }
|
| + }
|
| if (fp != NULL)
|
| {
|
| ret=fp->func(argc,argv);
|
| @@ -409,7 +484,7 @@
|
| }
|
| #endif
|
| f.name=argv[0]+3;
|
| - ret = (lh_retrieve(prog,&f) != NULL);
|
| + ret = (lh_FUNCTION_retrieve(prog,&f) != NULL);
|
| if (!ret)
|
| BIO_printf(bio_stdout, "%s\n", argv[0]);
|
| else
|
| @@ -427,7 +502,10 @@
|
| }
|
| else if ((strcmp(argv[0],LIST_STANDARD_COMMANDS) == 0) ||
|
| (strcmp(argv[0],LIST_MESSAGE_DIGEST_COMMANDS) == 0) ||
|
| - (strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0))
|
| + (strcmp(argv[0],LIST_MESSAGE_DIGEST_ALGORITHMS) == 0) ||
|
| + (strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0) ||
|
| + (strcmp(argv[0],LIST_CIPHER_ALGORITHMS) == 0) ||
|
| + (strcmp(argv[0],LIST_PUBLIC_KEY_ALGORITHMS) == 0))
|
| {
|
| int list_type;
|
| BIO *bio_stdout;
|
| @@ -436,6 +514,12 @@
|
| list_type = FUNC_TYPE_GENERAL;
|
| else if (strcmp(argv[0],LIST_MESSAGE_DIGEST_COMMANDS) == 0)
|
| list_type = FUNC_TYPE_MD;
|
| + else if (strcmp(argv[0],LIST_MESSAGE_DIGEST_ALGORITHMS) == 0)
|
| + list_type = FUNC_TYPE_MD_ALG;
|
| + else if (strcmp(argv[0],LIST_PUBLIC_KEY_ALGORITHMS) == 0)
|
| + list_type = FUNC_TYPE_PKEY;
|
| + else if (strcmp(argv[0],LIST_CIPHER_ALGORITHMS) == 0)
|
| + list_type = FUNC_TYPE_CIPHER_ALG;
|
| else /* strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0 */
|
| list_type = FUNC_TYPE_CIPHER;
|
| bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE);
|
| @@ -445,10 +529,23 @@
|
| bio_stdout = BIO_push(tmpbio, bio_stdout);
|
| }
|
| #endif
|
| -
|
| - for (fp=functions; fp->name != NULL; fp++)
|
| - if (fp->type == list_type)
|
| - BIO_printf(bio_stdout, "%s\n", fp->name);
|
| +
|
| + if (!load_config(bio_err, NULL))
|
| + goto end;
|
| +
|
| + if (list_type == FUNC_TYPE_PKEY)
|
| + list_pkey(bio_stdout);
|
| + if (list_type == FUNC_TYPE_MD_ALG)
|
| + list_md(bio_stdout);
|
| + if (list_type == FUNC_TYPE_CIPHER_ALG)
|
| + list_cipher(bio_stdout);
|
| + else
|
| + {
|
| + for (fp=functions; fp->name != NULL; fp++)
|
| + if (fp->type == list_type)
|
| + BIO_printf(bio_stdout, "%s\n",
|
| + fp->name);
|
| + }
|
| BIO_free_all(bio_stdout);
|
| ret=0;
|
| goto end;
|
| @@ -511,9 +608,94 @@
|
| return strcmp(f1->name,f2->name);
|
| }
|
|
|
| -static LHASH *prog_init(void)
|
| +static void list_pkey(BIO *out)
|
| {
|
| - LHASH *ret;
|
| + int i;
|
| + for (i = 0; i < EVP_PKEY_asn1_get_count(); i++)
|
| + {
|
| + const EVP_PKEY_ASN1_METHOD *ameth;
|
| + int pkey_id, pkey_base_id, pkey_flags;
|
| + const char *pinfo, *pem_str;
|
| + ameth = EVP_PKEY_asn1_get0(i);
|
| + EVP_PKEY_asn1_get0_info(&pkey_id, &pkey_base_id, &pkey_flags,
|
| + &pinfo, &pem_str, ameth);
|
| + if (pkey_flags & ASN1_PKEY_ALIAS)
|
| + {
|
| + BIO_printf(out, "Name: %s\n",
|
| + OBJ_nid2ln(pkey_id));
|
| + BIO_printf(out, "\tType: Alias to %s\n",
|
| + OBJ_nid2ln(pkey_base_id));
|
| + }
|
| + else
|
| + {
|
| + BIO_printf(out, "Name: %s\n", pinfo);
|
| + BIO_printf(out, "\tType: %s Algorithm\n",
|
| + pkey_flags & ASN1_PKEY_DYNAMIC ?
|
| + "External" : "Builtin");
|
| + BIO_printf(out, "\tOID: %s\n", OBJ_nid2ln(pkey_id));
|
| + if (pem_str == NULL)
|
| + pem_str = "(none)";
|
| + BIO_printf(out, "\tPEM string: %s\n", pem_str);
|
| + }
|
| +
|
| + }
|
| + }
|
| +
|
| +static void list_cipher_fn(const EVP_CIPHER *c,
|
| + const char *from, const char *to, void *arg)
|
| + {
|
| + if (c)
|
| + BIO_printf(arg, "%s\n", EVP_CIPHER_name(c));
|
| + else
|
| + {
|
| + if (!from)
|
| + from = "<undefined>";
|
| + if (!to)
|
| + to = "<undefined>";
|
| + BIO_printf(arg, "%s => %s\n", from, to);
|
| + }
|
| + }
|
| +
|
| +static void list_cipher(BIO *out)
|
| + {
|
| + EVP_CIPHER_do_all_sorted(list_cipher_fn, out);
|
| + }
|
| +
|
| +static void list_md_fn(const EVP_MD *m,
|
| + const char *from, const char *to, void *arg)
|
| + {
|
| + if (m)
|
| + BIO_printf(arg, "%s\n", EVP_MD_name(m));
|
| + else
|
| + {
|
| + if (!from)
|
| + from = "<undefined>";
|
| + if (!to)
|
| + to = "<undefined>";
|
| + BIO_printf(arg, "%s => %s\n", from, to);
|
| + }
|
| + }
|
| +
|
| +static void list_md(BIO *out)
|
| + {
|
| + EVP_MD_do_all_sorted(list_md_fn, out);
|
| + }
|
| +
|
| +static int MS_CALLBACK function_cmp(const FUNCTION *a, const FUNCTION *b)
|
| + {
|
| + return strncmp(a->name,b->name,8);
|
| + }
|
| +static IMPLEMENT_LHASH_COMP_FN(function, FUNCTION)
|
| +
|
| +static unsigned long MS_CALLBACK function_hash(const FUNCTION *a)
|
| + {
|
| + return lh_strhash(a->name);
|
| + }
|
| +static IMPLEMENT_LHASH_HASH_FN(function, FUNCTION)
|
| +
|
| +static LHASH_OF(FUNCTION) *prog_init(void)
|
| + {
|
| + LHASH_OF(FUNCTION) *ret;
|
| FUNCTION *f;
|
| size_t i;
|
|
|
| @@ -522,23 +704,11 @@
|
| ;
|
| qsort(functions,i,sizeof *functions,SortFnByName);
|
|
|
| - if ((ret=lh_new(hash, cmp)) == NULL)
|
| + if ((ret=lh_FUNCTION_new()) == NULL)
|
| return(NULL);
|
|
|
| for (f=functions; f->name != NULL; f++)
|
| - lh_insert(ret,f);
|
| + (void)lh_FUNCTION_insert(ret,f);
|
| return(ret);
|
| }
|
|
|
| -/* static int MS_CALLBACK cmp(FUNCTION *a, FUNCTION *b) */
|
| -static int MS_CALLBACK cmp(const void *a_void, const void *b_void)
|
| - {
|
| - return(strncmp(((const FUNCTION *)a_void)->name,
|
| - ((const FUNCTION *)b_void)->name,8));
|
| - }
|
| -
|
| -/* static unsigned long MS_CALLBACK hash(FUNCTION *a) */
|
| -static unsigned long MS_CALLBACK hash(const void *a_void)
|
| - {
|
| - return(lh_strhash(((const FUNCTION *)a_void)->name));
|
| - }
|
|
|