diff options
Diffstat (limited to 'crypto/openssl/apps/openssl.c')
| -rw-r--r-- | crypto/openssl/apps/openssl.c | 221 | 
1 files changed, 184 insertions, 37 deletions
| diff --git a/crypto/openssl/apps/openssl.c b/crypto/openssl/apps/openssl.c index 24450ddb71f4..47896472e8fd 100644 --- a/crypto/openssl/apps/openssl.c +++ b/crypto/openssl/apps/openssl.c @@ -55,11 +55,66 @@   * copied and put under another distribution licence   * [including the GNU Public Licence.]   */ +/* ==================================================================== + * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer.  + * + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in + *    the documentation and/or other materials provided with the + *    distribution. + * + * 3. All advertising materials mentioning features or use of this + *    software must display the following acknowledgment: + *    "This product includes software developed by the OpenSSL Project + *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + *    endorse or promote products derived from this software without + *    prior written permission. For written permission, please contact + *    openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + *    nor may "OpenSSL" appear in their names without prior written + *    permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + *    acknowledgment: + *    "This product includes software developed by the OpenSSL Project + *    for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com).  This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +  #include <stdio.h>  #include <string.h>  #include <stdlib.h>  #define OPENSSL_C /* tells apps.h to use complete apps_startup() */ +#include "apps.h"  #include <openssl/bio.h>  #include <openssl/crypto.h>  #include <openssl/lhash.h> @@ -67,31 +122,104 @@  #include <openssl/x509.h>  #include <openssl/pem.h>  #include <openssl/ssl.h> +#include <openssl/engine.h>  #define USE_SOCKETS /* needed for the _O_BINARY defs in the MS world */ -#include "apps.h"  #include "progs.h"  #include "s_apps.h"  #include <openssl/err.h> -static unsigned long MS_CALLBACK hash(FUNCTION *a); -static int MS_CALLBACK cmp(FUNCTION *a,FUNCTION *b); +/* The LHASH callbacks ("hash" & "cmp") have been replaced by functions with the + * base prototypes (we cast each variable inside the function to the required + * 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[]); -LHASH *config=NULL;  char *default_config_file=NULL;  /* Make sure there is only one when MONOLITH is defined */  #ifdef MONOLITH +CONF *config=NULL;  BIO *bio_err=NULL;  #endif + +static void lock_dbg_cb(int mode, int type, const char *file, int line) +	{ +	static int modes[CRYPTO_NUM_LOCKS]; /* = {0, 0, ... } */ +	const char *errstr = NULL; +	int rw; +	 +	rw = mode & (CRYPTO_READ|CRYPTO_WRITE); +	if (!((rw == CRYPTO_READ) || (rw == CRYPTO_WRITE))) +		{ +		errstr = "invalid mode"; +		goto err; +		} + +	if (type < 0 || type > CRYPTO_NUM_LOCKS) +		{ +		errstr = "type out of bounds"; +		goto err; +		} + +	if (mode & CRYPTO_LOCK) +		{ +		if (modes[type]) +			{ +			errstr = "already locked"; +			/* must not happen in a single-threaded program +			 * (would deadlock) */ +			goto err; +			} + +		modes[type] = rw; +		} +	else if (mode & CRYPTO_UNLOCK) +		{ +		if (!modes[type]) +			{ +			errstr = "not locked"; +			goto err; +			} +		 +		if (modes[type] != rw) +			{ +			errstr = (rw == CRYPTO_READ) ? +				"CRYPTO_r_unlock on write lock" : +				"CRYPTO_w_unlock on read lock"; +			} + +		modes[type] = 0; +		} +	else +		{ +		errstr = "invalid mode"; +		goto err; +		} + + err: +	if (errstr) +		{ +		/* we cannot use bio_err here */ +		fprintf(stderr, "openssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d\n", +			errstr, mode, type, file, line); +		} +	} + +  int main(int Argc, char *Argv[])  	{  	ARGS arg;  #define PROG_NAME_SIZE	39  	char pname[PROG_NAME_SIZE+1];  	FUNCTION f,*fp; -	MS_STATIC char *prompt,buf[1024],config_name[256]; +	MS_STATIC char *prompt,buf[1024]; +	char *to_free=NULL;  	int n,i,ret=0;  	int argc;  	char **argv,*p; @@ -101,41 +229,56 @@ int main(int Argc, char *Argv[])  	arg.data=NULL;  	arg.count=0; -	if (getenv("OPENSSL_DEBUG_MEMORY") != NULL) -		CRYPTO_malloc_debug_init(); -	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); - -	apps_startup(); -  	if (bio_err == NULL)  		if ((bio_err=BIO_new(BIO_s_file())) != NULL)  			BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); -	ERR_load_crypto_strings(); +	if (getenv("OPENSSL_DEBUG_MEMORY") != NULL) /* if not defined, use compiled-in library defaults */ +		{ +		if (!(0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off"))) +			{ +			CRYPTO_malloc_debug_init(); +			CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL); +			} +		else +			{ +			/* OPENSSL_DEBUG_MEMORY=off */ +			CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0); +			} +		} +	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); + +#if 0 +	if (getenv("OPENSSL_DEBUG_LOCKING") != NULL) +#endif +		{ +		CRYPTO_set_locking_callback(lock_dbg_cb); +		} + +	apps_startup();  	/* Lets load up our environment a little */  	p=getenv("OPENSSL_CONF");  	if (p == NULL)  		p=getenv("SSLEAY_CONF");  	if (p == NULL) -		{ -		strcpy(config_name,X509_get_default_cert_area()); -#ifndef VMS -		strcat(config_name,"/"); -#endif -		strcat(config_name,OPENSSL_CONF); -		p=config_name; -		} +		p=to_free=make_config_name();  	default_config_file=p; -	config=CONF_load(config,p,&errline); -	if (config == NULL) ERR_clear_error(); +	config=NCONF_new(NULL); +	i=NCONF_load(config,p,&errline); +	if (i == 0) +		{ +		NCONF_free(config); +		config = NULL; +		ERR_clear_error(); +		}  	prog=prog_init();  	/* first check the program name */ -	program_name(Argv[0],pname,PROG_NAME_SIZE); +	program_name(Argv[0],pname,sizeof pname);  	f.name=pname;  	fp=(FUNCTION *)lh_retrieve(prog,&f); @@ -163,7 +306,7 @@ int main(int Argc, char *Argv[])  		{  		ret=0;  		p=buf; -		n=1024; +		n=sizeof buf;  		i=0;  		for (;;)  			{ @@ -197,25 +340,25 @@ int main(int Argc, char *Argv[])  	BIO_printf(bio_err,"bad exit\n");  	ret=1;  end: +	if (to_free) +		OPENSSL_free(to_free);  	if (config != NULL)  		{ -		CONF_free(config); +		NCONF_free(config);  		config=NULL;  		}  	if (prog != NULL) lh_free(prog);  	if (arg.data != NULL) OPENSSL_free(arg.data); -	ERR_remove_state(0); -	EVP_cleanup(); -	ERR_free_strings(); -	 +	apps_shutdown(); +  	CRYPTO_mem_leaks(bio_err);  	if (bio_err != NULL)  		{  		BIO_free(bio_err);  		bio_err=NULL;  		} -	EXIT(ret); +	OPENSSL_EXIT(ret);  	}  #define LIST_STANDARD_COMMANDS "list-standard-commands" @@ -238,7 +381,7 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])  	else if ((strncmp(argv[0],"no-",3)) == 0)  		{  		BIO *bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE); -#ifdef VMS +#ifdef OPENSSL_SYS_VMS  		{  		BIO *tmpbio = BIO_new(BIO_f_linebuffer());  		bio_stdout = BIO_push(tmpbio, bio_stdout); @@ -275,7 +418,7 @@ static int do_cmd(LHASH *prog, int argc, char *argv[])  		else /* strcmp(argv[0],LIST_CIPHER_COMMANDS) == 0 */  			list_type = FUNC_TYPE_CIPHER;  		bio_stdout = BIO_new_fp(stdout,BIO_NOCLOSE); -#ifdef VMS +#ifdef OPENSSL_SYS_VMS  		{  		BIO *tmpbio = BIO_new(BIO_f_linebuffer());  		bio_stdout = BIO_push(tmpbio, bio_stdout); @@ -350,19 +493,23 @@ static LHASH *prog_init(void)  	    ;  	qsort(functions,i,sizeof *functions,SortFnByName); -	if ((ret=lh_new(hash,cmp)) == NULL) return(NULL); +	if ((ret=lh_new(hash, cmp)) == NULL) +		return(NULL);  	for (f=functions; f->name != NULL; f++)  		lh_insert(ret,f);  	return(ret);  	} -static int MS_CALLBACK cmp(FUNCTION *a, FUNCTION *b) +/* static int MS_CALLBACK cmp(FUNCTION *a, FUNCTION *b) */ +static int MS_CALLBACK cmp(const void *a_void, const void *b_void)  	{ -	return(strncmp(a->name,b->name,8)); +	return(strncmp(((FUNCTION *)a_void)->name, +			((FUNCTION *)b_void)->name,8));  	} -static unsigned long MS_CALLBACK hash(FUNCTION *a) +/* static unsigned long MS_CALLBACK hash(FUNCTION *a) */ +static unsigned long MS_CALLBACK hash(const void *a_void)  	{ -	return(lh_strhash(a->name)); +	return(lh_strhash(((FUNCTION *)a_void)->name));  	} | 
