| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | /* apps/enc.c */ | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This package is an SSL implementation written | 
					
						
							|  |  |  |  * by Eric Young (eay@cryptsoft.com). | 
					
						
							|  |  |  |  * The implementation was written so as to conform with Netscapes SSL. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * This library is free for commercial and non-commercial use as long as | 
					
						
							|  |  |  |  * the following conditions are aheared to.  The following conditions | 
					
						
							|  |  |  |  * apply to all code found in this distribution, be it the RC4, RSA, | 
					
						
							|  |  |  |  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation | 
					
						
							|  |  |  |  * included with this distribution is covered by the same copyright terms | 
					
						
							|  |  |  |  * except that the holder is Tim Hudson (tjh@cryptsoft.com). | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Copyright remains Eric Young's, and as such any Copyright notices in | 
					
						
							|  |  |  |  * the code are not to be removed. | 
					
						
							|  |  |  |  * If this package is used in a product, Eric Young should be given attribution | 
					
						
							|  |  |  |  * as the author of the parts of the library used. | 
					
						
							|  |  |  |  * This can be in the form of a textual message at program startup or | 
					
						
							|  |  |  |  * in documentation (online or textual) provided with the package. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * 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 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 acknowledgement: | 
					
						
							|  |  |  |  *    "This product includes cryptographic software written by | 
					
						
							|  |  |  |  *     Eric Young (eay@cryptsoft.com)" | 
					
						
							|  |  |  |  *    The word 'cryptographic' can be left out if the rouines from the library | 
					
						
							|  |  |  |  *    being used are not cryptographic related :-). | 
					
						
							|  |  |  |  * 4. If you include any Windows specific code (or a derivative thereof) from  | 
					
						
							|  |  |  |  *    the apps directory (application code) you must include an acknowledgement: | 
					
						
							|  |  |  |  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | 
					
						
							|  |  |  |  * ANY EXPRESS 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 AUTHOR OR 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. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * The licence and distribution terms for any publically available version or | 
					
						
							|  |  |  |  * derivative of this code cannot be changed.  i.e. this code cannot simply be | 
					
						
							|  |  |  |  * copied and put under another distribution licence | 
					
						
							|  |  |  |  * [including the GNU Public Licence.] | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include "apps.h"
 | 
					
						
							| 
									
										
										
										
											1999-04-24 06:13:45 +08:00
										 |  |  | #include <openssl/bio.h>
 | 
					
						
							|  |  |  | #include <openssl/err.h>
 | 
					
						
							|  |  |  | #include <openssl/evp.h>
 | 
					
						
							|  |  |  | #include <openssl/objects.h>
 | 
					
						
							|  |  |  | #include <openssl/x509.h>
 | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | #include <openssl/rand.h>
 | 
					
						
							| 
									
										
										
										
											1999-04-24 06:13:45 +08:00
										 |  |  | #include <openssl/pem.h>
 | 
					
						
							| 
									
										
										
										
											2000-11-20 12:14:19 +08:00
										 |  |  | #include <ctype.h>
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | int set_hex(char *in,unsigned char *out,int size); | 
					
						
							|  |  |  | #undef SIZE
 | 
					
						
							|  |  |  | #undef BSIZE
 | 
					
						
							|  |  |  | #undef PROG
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SIZE	(512)
 | 
					
						
							|  |  |  | #define BSIZE	(8*1024)
 | 
					
						
							|  |  |  | #define	PROG	enc_main
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-14 01:40:27 +08:00
										 |  |  | static void show_ciphers(const OBJ_NAME *name,void *bio_) | 
					
						
							| 
									
										
										
										
											2000-11-20 12:14:19 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	BIO *bio=bio_; | 
					
						
							|  |  |  | 	static int n; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-10 22:58:22 +08:00
										 |  |  | 	if(!islower((unsigned char)*name->name)) | 
					
						
							| 
									
										
										
										
											2000-11-20 12:14:19 +08:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BIO_printf(bio,"-%-25s",name->name); | 
					
						
							|  |  |  | 	if(++n == 3) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		BIO_printf(bio,"\n"); | 
					
						
							|  |  |  | 		n=0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		BIO_printf(bio," "); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-11 17:47:18 +08:00
										 |  |  | int MAIN(int, char **); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | int MAIN(int argc, char **argv) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2003-01-31 01:39:26 +08:00
										 |  |  | #ifndef OPENSSL_NO_ENGINE
 | 
					
						
							| 
									
										
										
										
											2000-10-27 05:07:28 +08:00
										 |  |  | 	ENGINE *e = NULL; | 
					
						
							| 
									
										
										
										
											2003-01-31 01:39:26 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1999-12-01 04:15:19 +08:00
										 |  |  | 	static const char magic[]="Salted__"; | 
					
						
							| 
									
										
										
										
											2002-11-13 23:43:43 +08:00
										 |  |  | 	char mbuf[sizeof magic-1]; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	char *strbuf=NULL; | 
					
						
							|  |  |  | 	unsigned char *buff=NULL,*bufsize=NULL; | 
					
						
							|  |  |  | 	int bsize=BSIZE,verbose=0; | 
					
						
							|  |  |  | 	int ret=1,inl; | 
					
						
							| 
									
										
										
										
											2001-02-14 10:11:52 +08:00
										 |  |  | 	int nopad = 0; | 
					
						
							| 
									
										
										
										
											2000-11-12 10:13:38 +08:00
										 |  |  | 	unsigned char key[EVP_MAX_KEY_LENGTH],iv[EVP_MAX_IV_LENGTH]; | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 	unsigned char salt[PKCS5_SALT_LEN]; | 
					
						
							| 
									
										
										
										
											2000-02-17 08:41:43 +08:00
										 |  |  | 	char *str=NULL, *passarg = NULL, *pass = NULL; | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 	char *hkey=NULL,*hiv=NULL,*hsalt = NULL; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	int enc=1,printkey=0,i,base64=0; | 
					
						
							| 
									
										
										
										
											1999-12-01 04:15:19 +08:00
										 |  |  | 	int debug=0,olb64=0,nosalt=0; | 
					
						
							| 
									
										
										
										
											1999-04-18 05:25:43 +08:00
										 |  |  | 	const EVP_CIPHER *cipher=NULL,*c; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	char *inf=NULL,*outf=NULL; | 
					
						
							|  |  |  | 	BIO *in=NULL,*out=NULL,*b64=NULL,*benc=NULL,*rbio=NULL,*wbio=NULL; | 
					
						
							| 
									
										
										
										
											2002-04-07 03:00:50 +08:00
										 |  |  | #define PROG_NAME_SIZE  39
 | 
					
						
							|  |  |  | 	char pname[PROG_NAME_SIZE+1]; | 
					
						
							| 
									
										
										
										
											2003-01-31 01:39:26 +08:00
										 |  |  | #ifndef OPENSSL_NO_ENGINE
 | 
					
						
							| 
									
										
										
										
											2000-10-27 05:07:28 +08:00
										 |  |  | 	char *engine = NULL; | 
					
						
							| 
									
										
										
										
											2003-01-31 01:39:26 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	apps_startup(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (bio_err == NULL) | 
					
						
							|  |  |  | 		if ((bio_err=BIO_new(BIO_s_file())) != NULL) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 			BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-02-22 22:01:21 +08:00
										 |  |  | 	if (!load_config(bio_err, NULL)) | 
					
						
							|  |  |  | 		goto end; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	/* first check the program name */ | 
					
						
							| 
									
										
										
										
											2002-11-13 23:43:43 +08:00
										 |  |  | 	program_name(argv[0],pname,sizeof pname); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	if (strcmp(pname,"base64") == 0) | 
					
						
							|  |  |  | 		base64=1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cipher=EVP_get_cipherbyname(pname); | 
					
						
							|  |  |  | 	if (!base64 && (cipher == NULL) && (strcmp(pname,"enc") != 0)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		BIO_printf(bio_err,"%s is an unknown cipher\n",pname); | 
					
						
							|  |  |  | 		goto bad; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	argc--; | 
					
						
							|  |  |  | 	argv++; | 
					
						
							|  |  |  | 	while (argc >= 1) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		if	(strcmp(*argv,"-e") == 0) | 
					
						
							|  |  |  | 			enc=1; | 
					
						
							|  |  |  | 		else if (strcmp(*argv,"-in") == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			if (--argc < 1) goto bad; | 
					
						
							|  |  |  | 			inf= *(++argv); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		else if (strcmp(*argv,"-out") == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			if (--argc < 1) goto bad; | 
					
						
							|  |  |  | 			outf= *(++argv); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2000-02-17 08:41:43 +08:00
										 |  |  | 		else if (strcmp(*argv,"-pass") == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			if (--argc < 1) goto bad; | 
					
						
							|  |  |  | 			passarg= *(++argv); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2003-01-31 01:39:26 +08:00
										 |  |  | #ifndef OPENSSL_NO_ENGINE
 | 
					
						
							| 
									
										
										
										
											2000-10-27 05:07:28 +08:00
										 |  |  | 		else if (strcmp(*argv,"-engine") == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			if (--argc < 1) goto bad; | 
					
						
							|  |  |  | 			engine= *(++argv); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2003-01-31 01:39:26 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 		else if	(strcmp(*argv,"-d") == 0) | 
					
						
							|  |  |  | 			enc=0; | 
					
						
							|  |  |  | 		else if	(strcmp(*argv,"-p") == 0) | 
					
						
							|  |  |  | 			printkey=1; | 
					
						
							|  |  |  | 		else if	(strcmp(*argv,"-v") == 0) | 
					
						
							|  |  |  | 			verbose=1; | 
					
						
							| 
									
										
										
										
											2001-02-14 10:11:52 +08:00
										 |  |  | 		else if	(strcmp(*argv,"-nopad") == 0) | 
					
						
							|  |  |  | 			nopad=1; | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 		else if	(strcmp(*argv,"-salt") == 0) | 
					
						
							|  |  |  | 			nosalt=0; | 
					
						
							|  |  |  | 		else if	(strcmp(*argv,"-nosalt") == 0) | 
					
						
							|  |  |  | 			nosalt=1; | 
					
						
							|  |  |  | 		else if	(strcmp(*argv,"-debug") == 0) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 			debug=1; | 
					
						
							|  |  |  | 		else if	(strcmp(*argv,"-P") == 0) | 
					
						
							|  |  |  | 			printkey=2; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 		else if	(strcmp(*argv,"-A") == 0) | 
					
						
							|  |  |  | 			olb64=1; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 		else if	(strcmp(*argv,"-a") == 0) | 
					
						
							|  |  |  | 			base64=1; | 
					
						
							|  |  |  | 		else if	(strcmp(*argv,"-base64") == 0) | 
					
						
							|  |  |  | 			base64=1; | 
					
						
							|  |  |  | 		else if (strcmp(*argv,"-bufsize") == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			if (--argc < 1) goto bad; | 
					
						
							|  |  |  | 			bufsize=(unsigned char *)*(++argv); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		else if (strcmp(*argv,"-k") == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			if (--argc < 1) goto bad; | 
					
						
							|  |  |  | 			str= *(++argv); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		else if (strcmp(*argv,"-kfile") == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			static char buf[128]; | 
					
						
							|  |  |  | 			FILE *infile; | 
					
						
							|  |  |  | 			char *file; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (--argc < 1) goto bad; | 
					
						
							|  |  |  | 			file= *(++argv); | 
					
						
							|  |  |  | 			infile=fopen(file,"r"); | 
					
						
							|  |  |  | 			if (infile == NULL) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 				BIO_printf(bio_err,"unable to read key from '%s'\n", | 
					
						
							|  |  |  | 					file); | 
					
						
							|  |  |  | 				goto bad; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			buf[0]='\0'; | 
					
						
							| 
									
										
										
										
											2002-11-13 23:43:43 +08:00
										 |  |  | 			fgets(buf,sizeof buf,infile); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 			fclose(infile); | 
					
						
							|  |  |  | 			i=strlen(buf); | 
					
						
							|  |  |  | 			if ((i > 0) && | 
					
						
							|  |  |  | 				((buf[i-1] == '\n') || (buf[i-1] == '\r'))) | 
					
						
							|  |  |  | 				buf[--i]='\0'; | 
					
						
							|  |  |  | 			if ((i > 0) && | 
					
						
							|  |  |  | 				((buf[i-1] == '\n') || (buf[i-1] == '\r'))) | 
					
						
							|  |  |  | 				buf[--i]='\0'; | 
					
						
							|  |  |  | 			if (i < 1) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 				BIO_printf(bio_err,"zero length password\n"); | 
					
						
							|  |  |  | 				goto bad; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			str=buf; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		else if (strcmp(*argv,"-K") == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			if (--argc < 1) goto bad; | 
					
						
							|  |  |  | 			hkey= *(++argv); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 		else if (strcmp(*argv,"-S") == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			if (--argc < 1) goto bad; | 
					
						
							|  |  |  | 			hsalt= *(++argv); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 		else if (strcmp(*argv,"-iv") == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			if (--argc < 1) goto bad; | 
					
						
							|  |  |  | 			hiv= *(++argv); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		else if	((argv[0][0] == '-') && | 
					
						
							|  |  |  | 			((c=EVP_get_cipherbyname(&(argv[0][1]))) != NULL)) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			cipher=c; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		else if (strcmp(*argv,"-none") == 0) | 
					
						
							|  |  |  | 			cipher=NULL; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"unknown option '%s'\n",*argv); | 
					
						
							|  |  |  | bad: | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"options are\n"); | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"%-14s input file\n","-in <file>"); | 
					
						
							| 
									
										
										
										
											2000-02-17 08:41:43 +08:00
										 |  |  | 			BIO_printf(bio_err,"%-14s output file\n","-out <file>"); | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"%-14s pass phrase source\n","-pass <arg>"); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 			BIO_printf(bio_err,"%-14s encrypt\n","-e"); | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"%-14s decrypt\n","-d"); | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"%-14s base64 encode/decode, depending on encryption flag\n","-a/-base64"); | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"%-14s key is the next argument\n","-k"); | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"%-14s key is the first line of the file argument\n","-kfile"); | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"%-14s key/iv in hex is the next argument\n","-K/-iv"); | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"%-14s print the iv/key (then exit if -P)\n","-[pP]"); | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"%-14s buffer size\n","-bufsize <n>"); | 
					
						
							| 
									
										
										
										
											2003-01-31 01:39:26 +08:00
										 |  |  | #ifndef OPENSSL_NO_ENGINE
 | 
					
						
							| 
									
										
										
										
											2000-10-27 05:07:28 +08:00
										 |  |  | 			BIO_printf(bio_err,"%-14s use engine e, possibly a hardware device.\n","-engine e"); | 
					
						
							| 
									
										
										
										
											2003-01-31 01:39:26 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"Cipher Types\n"); | 
					
						
							| 
									
										
										
										
											2000-11-20 12:14:19 +08:00
										 |  |  | 			OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, | 
					
						
							|  |  |  | 					       show_ciphers, | 
					
						
							|  |  |  | 					       bio_err); | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"\n"); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		argc--; | 
					
						
							|  |  |  | 		argv++; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-31 01:39:26 +08:00
										 |  |  | #ifndef OPENSSL_NO_ENGINE
 | 
					
						
							| 
									
										
										
										
											2001-06-18 14:22:33 +08:00
										 |  |  |         e = setup_engine(bio_err, engine, 0); | 
					
						
							| 
									
										
										
										
											2003-01-31 01:39:26 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-10-27 05:07:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	if (bufsize != NULL) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		unsigned long n; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for (n=0; *bufsize; bufsize++) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			i= *bufsize; | 
					
						
							|  |  |  | 			if ((i <= '9') && (i >= '0')) | 
					
						
							|  |  |  | 				n=n*10+i-'0'; | 
					
						
							|  |  |  | 			else if (i == 'k') | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 				n*=1024; | 
					
						
							|  |  |  | 				bufsize++; | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		if (*bufsize != '\0') | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"invalid 'bufsize' specified.\n"); | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* It must be large enough for a base64 encoded line */ | 
					
						
							|  |  |  | 		if (n < 80) n=80; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		bsize=(int)n; | 
					
						
							|  |  |  | 		if (verbose) BIO_printf(bio_err,"bufsize=%d\n",bsize); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-02 06:19:21 +08:00
										 |  |  | 	strbuf=OPENSSL_malloc(SIZE); | 
					
						
							|  |  |  | 	buff=(unsigned char *)OPENSSL_malloc(EVP_ENCODE_LENGTH(bsize)); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	if ((buff == NULL) || (strbuf == NULL)) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2000-06-02 06:19:21 +08:00
										 |  |  | 		BIO_printf(bio_err,"OPENSSL_malloc failure %ld\n",(long)EVP_ENCODE_LENGTH(bsize)); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 		goto end; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	in=BIO_new(BIO_s_file()); | 
					
						
							|  |  |  | 	out=BIO_new(BIO_s_file()); | 
					
						
							|  |  |  | 	if ((in == NULL) || (out == NULL)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		ERR_print_errors(bio_err); | 
					
						
							|  |  |  | 		goto end; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	if (debug) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		BIO_set_callback(in,BIO_debug_callback); | 
					
						
							|  |  |  | 		BIO_set_callback(out,BIO_debug_callback); | 
					
						
							|  |  |  | 		BIO_set_callback_arg(in,bio_err); | 
					
						
							|  |  |  | 		BIO_set_callback_arg(out,bio_err); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (inf == NULL) | 
					
						
							|  |  |  | 		BIO_set_fp(in,stdin,BIO_NOCLOSE); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		if (BIO_read_filename(in,inf) <= 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			perror(inf); | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-17 08:41:43 +08:00
										 |  |  | 	if(!str && passarg) { | 
					
						
							|  |  |  | 		if(!app_passwd(bio_err, passarg, NULL, &pass, NULL)) { | 
					
						
							|  |  |  | 			BIO_printf(bio_err, "Error getting password\n"); | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		str = pass; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	if ((str == NULL) && (cipher != NULL) && (hkey == NULL)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		for (;;) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			char buf[200]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			sprintf(buf,"enter %s %s password:", | 
					
						
							|  |  |  | 				OBJ_nid2ln(EVP_CIPHER_nid(cipher)), | 
					
						
							|  |  |  | 				(enc)?"encryption":"decryption"); | 
					
						
							|  |  |  | 			strbuf[0]='\0'; | 
					
						
							|  |  |  | 			i=EVP_read_pw_string((char *)strbuf,SIZE,buf,enc); | 
					
						
							|  |  |  | 			if (i == 0) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 				if (strbuf[0] == '\0') | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 					ret=1; | 
					
						
							|  |  |  | 					goto end; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				str=strbuf; | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			if (i < 0) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 				BIO_printf(bio_err,"bad password read\n"); | 
					
						
							|  |  |  | 				goto end; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (outf == NULL) | 
					
						
							| 
									
										
										
											
												On VMS, stdout may very well lead to a file that is written to in a
record-oriented fashion.  That means that every write() will write a
separate record, which will be read separately by the programs trying
to read from it.  This can be very confusing.
The solution is to put a BIO filter in the way that will buffer text
until a linefeed is reached, and then write everything a line at a
time, so every record written will be an actual line, not chunks of
lines and not (usually doesn't happen, but I've seen it once) several
lines in one record.  Voila, BIO_f_linebuffer() is born.
Since we're so close to release time, I'm making this VMS-only for
now, just to make sure no code is needlessly broken by this.  After
the release, this BIO method will be enabled on all other platforms as
well.
											
										 
											2000-09-20 21:55:50 +08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 		BIO_set_fp(out,stdout,BIO_NOCLOSE); | 
					
						
							| 
									
										
										
										
											2001-02-20 16:13:47 +08:00
										 |  |  | #ifdef OPENSSL_SYS_VMS
 | 
					
						
							| 
									
										
										
											
												On VMS, stdout may very well lead to a file that is written to in a
record-oriented fashion.  That means that every write() will write a
separate record, which will be read separately by the programs trying
to read from it.  This can be very confusing.
The solution is to put a BIO filter in the way that will buffer text
until a linefeed is reached, and then write everything a line at a
time, so every record written will be an actual line, not chunks of
lines and not (usually doesn't happen, but I've seen it once) several
lines in one record.  Voila, BIO_f_linebuffer() is born.
Since we're so close to release time, I'm making this VMS-only for
now, just to make sure no code is needlessly broken by this.  After
the release, this BIO method will be enabled on all other platforms as
well.
											
										 
											2000-09-20 21:55:50 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 		BIO *tmpbio = BIO_new(BIO_f_linebuffer()); | 
					
						
							|  |  |  | 		out = BIO_push(tmpbio, out); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		if (BIO_write_filename(out,outf) <= 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			perror(outf); | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rbio=in; | 
					
						
							|  |  |  | 	wbio=out; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (base64) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		if ((b64=BIO_new(BIO_f_base64())) == NULL) | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 		if (debug) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			BIO_set_callback(b64,BIO_debug_callback); | 
					
						
							|  |  |  | 			BIO_set_callback_arg(b64,bio_err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		if (olb64) | 
					
						
							|  |  |  | 			BIO_set_flags(b64,BIO_FLAGS_BASE64_NO_NL); | 
					
						
							|  |  |  | 		if (enc) | 
					
						
							|  |  |  | 			wbio=BIO_push(b64,wbio); | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			rbio=BIO_push(b64,rbio); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	if (cipher != NULL) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2001-02-06 22:09:13 +08:00
										 |  |  | 		/* Note that str is NULL if a key was passed on the command
 | 
					
						
							|  |  |  | 		 * line, so we get no salt in that case. Is this a bug? | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 		if (str != NULL) | 
					
						
							|  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 			/* Salt handling: if encrypting generate a salt and
 | 
					
						
							|  |  |  | 			 * write to output BIO. If decrypting read salt from | 
					
						
							|  |  |  | 			 * input BIO. | 
					
						
							|  |  |  | 			 */ | 
					
						
							|  |  |  | 			unsigned char *sptr; | 
					
						
							|  |  |  | 			if(nosalt) sptr = NULL; | 
					
						
							|  |  |  | 			else { | 
					
						
							|  |  |  | 				if(enc) { | 
					
						
							|  |  |  | 					if(hsalt) { | 
					
						
							| 
									
										
										
										
											2002-11-13 23:43:43 +08:00
										 |  |  | 						if(!set_hex(hsalt,salt,sizeof salt)) { | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 							BIO_printf(bio_err, | 
					
						
							|  |  |  | 								"invalid hex salt value\n"); | 
					
						
							|  |  |  | 							goto end; | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2002-11-13 23:43:43 +08:00
										 |  |  | 					} else if (RAND_pseudo_bytes(salt, sizeof salt) < 0) | 
					
						
							| 
									
										
										
										
											2000-01-21 09:15:56 +08:00
										 |  |  | 						goto end; | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 					/* If -P option then don't bother writing */ | 
					
						
							| 
									
										
										
										
											1999-12-01 04:15:19 +08:00
										 |  |  | 					if((printkey != 2) | 
					
						
							|  |  |  | 					   && (BIO_write(wbio,magic, | 
					
						
							|  |  |  | 							 sizeof magic-1) != sizeof magic-1 | 
					
						
							|  |  |  | 					       || BIO_write(wbio, | 
					
						
							|  |  |  | 							    (char *)salt, | 
					
						
							| 
									
										
										
										
											2002-11-13 23:43:43 +08:00
										 |  |  | 							    sizeof salt) != sizeof salt)) { | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 						BIO_printf(bio_err,"error writing output file\n"); | 
					
						
							|  |  |  | 						goto end; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											1999-12-01 04:15:19 +08:00
										 |  |  | 				} else if(BIO_read(rbio,mbuf,sizeof mbuf) != sizeof mbuf | 
					
						
							|  |  |  | 					  || BIO_read(rbio, | 
					
						
							|  |  |  | 						      (unsigned char *)salt, | 
					
						
							| 
									
										
										
										
											2002-11-13 23:43:43 +08:00
										 |  |  | 				    sizeof salt) != sizeof salt) { | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 					BIO_printf(bio_err,"error reading input file\n"); | 
					
						
							|  |  |  | 					goto end; | 
					
						
							| 
									
										
										
										
											1999-12-01 04:15:19 +08:00
										 |  |  | 				} else if(memcmp(mbuf,magic,sizeof magic-1)) { | 
					
						
							|  |  |  | 				    BIO_printf(bio_err,"bad magic number\n"); | 
					
						
							|  |  |  | 				    goto end; | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											1999-12-01 04:15:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 				sptr = salt; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			EVP_BytesToKey(cipher,EVP_md5(),sptr, | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 				(unsigned char *)str, | 
					
						
							|  |  |  | 				strlen(str),1,key,iv); | 
					
						
							|  |  |  | 			/* zero the complete buffer or the string
 | 
					
						
							|  |  |  | 			 * passed from the command line | 
					
						
							|  |  |  | 			 * bug picked up by | 
					
						
							|  |  |  | 			 * Larry J. Hughes Jr. <hughes@indiana.edu> */ | 
					
						
							|  |  |  | 			if (str == strbuf) | 
					
						
							| 
									
										
										
										
											2002-11-28 16:04:36 +08:00
										 |  |  | 				OPENSSL_cleanse(str,SIZE); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 			else | 
					
						
							| 
									
										
										
										
											2002-11-28 16:04:36 +08:00
										 |  |  | 				OPENSSL_cleanse(str,strlen(str)); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2000-11-12 10:13:38 +08:00
										 |  |  | 		if ((hiv != NULL) && !set_hex(hiv,iv,sizeof iv)) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 			{ | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"invalid hex iv value\n"); | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2001-07-03 18:31:11 +08:00
										 |  |  | 		if ((hiv == NULL) && (str == NULL)) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			/* No IV was explicitly set and no IV was generated
 | 
					
						
							|  |  |  | 			 * during EVP_BytesToKey. Hence the IV is undefined, | 
					
						
							|  |  |  | 			 * making correct decryption impossible. */ | 
					
						
							|  |  |  | 			BIO_printf(bio_err, "iv undefined\n"); | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2000-11-12 10:13:38 +08:00
										 |  |  | 		if ((hkey != NULL) && !set_hex(hkey,key,sizeof key)) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 			{ | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"invalid hex key value\n"); | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ((benc=BIO_new(BIO_f_cipher())) == NULL) | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 		BIO_set_cipher(benc,cipher,key,iv,enc); | 
					
						
							| 
									
										
										
										
											2001-02-14 10:11:52 +08:00
										 |  |  | 		if (nopad) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			EVP_CIPHER_CTX *ctx; | 
					
						
							|  |  |  | 			BIO_get_cipher_ctx(benc, &ctx); | 
					
						
							|  |  |  | 			EVP_CIPHER_CTX_set_padding(ctx, 0); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 		if (debug) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			BIO_set_callback(benc,BIO_debug_callback); | 
					
						
							|  |  |  | 			BIO_set_callback_arg(benc,bio_err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (printkey) | 
					
						
							|  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 			if (!nosalt) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 				printf("salt="); | 
					
						
							| 
									
										
										
										
											2002-11-13 23:43:43 +08:00
										 |  |  | 				for (i=0; i<sizeof salt; i++) | 
					
						
							| 
									
										
										
										
											1999-11-16 10:49:25 +08:00
										 |  |  | 					printf("%02X",salt[i]); | 
					
						
							|  |  |  | 				printf("\n"); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 			if (cipher->key_len > 0) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 				printf("key="); | 
					
						
							|  |  |  | 				for (i=0; i<cipher->key_len; i++) | 
					
						
							|  |  |  | 					printf("%02X",key[i]); | 
					
						
							|  |  |  | 				printf("\n"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			if (cipher->iv_len > 0) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 				printf("iv ="); | 
					
						
							|  |  |  | 				for (i=0; i<cipher->iv_len; i++) | 
					
						
							|  |  |  | 					printf("%02X",iv[i]); | 
					
						
							|  |  |  | 				printf("\n"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			if (printkey == 2) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 				ret=0; | 
					
						
							|  |  |  | 				goto end; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Only encrypt/decrypt as we write the file */ | 
					
						
							|  |  |  | 	if (benc != NULL) | 
					
						
							|  |  |  | 		wbio=BIO_push(benc,wbio); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (;;) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		inl=BIO_read(rbio,(char *)buff,bsize); | 
					
						
							|  |  |  | 		if (inl <= 0) break; | 
					
						
							|  |  |  | 		if (BIO_write(wbio,(char *)buff,inl) != inl) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"error writing output file\n"); | 
					
						
							|  |  |  | 			goto end; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	if (!BIO_flush(wbio)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		BIO_printf(bio_err,"bad decrypt\n"); | 
					
						
							|  |  |  | 		goto end; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ret=0; | 
					
						
							|  |  |  | 	if (verbose) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		BIO_printf(bio_err,"bytes read   :%8ld\n",BIO_number_read(in)); | 
					
						
							|  |  |  | 		BIO_printf(bio_err,"bytes written:%8ld\n",BIO_number_written(out)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | end: | 
					
						
							| 
									
										
										
										
											2000-01-21 19:30:52 +08:00
										 |  |  | 	ERR_print_errors(bio_err); | 
					
						
							| 
									
										
										
										
											2000-06-02 06:19:21 +08:00
										 |  |  | 	if (strbuf != NULL) OPENSSL_free(strbuf); | 
					
						
							|  |  |  | 	if (buff != NULL) OPENSSL_free(buff); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	if (in != NULL) BIO_free(in); | 
					
						
							| 
									
										
										
											
												On VMS, stdout may very well lead to a file that is written to in a
record-oriented fashion.  That means that every write() will write a
separate record, which will be read separately by the programs trying
to read from it.  This can be very confusing.
The solution is to put a BIO filter in the way that will buffer text
until a linefeed is reached, and then write everything a line at a
time, so every record written will be an actual line, not chunks of
lines and not (usually doesn't happen, but I've seen it once) several
lines in one record.  Voila, BIO_f_linebuffer() is born.
Since we're so close to release time, I'm making this VMS-only for
now, just to make sure no code is needlessly broken by this.  After
the release, this BIO method will be enabled on all other platforms as
well.
											
										 
											2000-09-20 21:55:50 +08:00
										 |  |  | 	if (out != NULL) BIO_free_all(out); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	if (benc != NULL) BIO_free(benc); | 
					
						
							|  |  |  | 	if (b64 != NULL) BIO_free(b64); | 
					
						
							| 
									
										
										
										
											2000-06-02 06:19:21 +08:00
										 |  |  | 	if(pass) OPENSSL_free(pass); | 
					
						
							| 
									
										
										
										
											2001-06-24 00:37:32 +08:00
										 |  |  | 	apps_shutdown(); | 
					
						
							| 
									
										
										
										
											2002-12-04 00:33:03 +08:00
										 |  |  | 	OPENSSL_EXIT(ret); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | int set_hex(char *in, unsigned char *out, int size) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	int i,n; | 
					
						
							|  |  |  | 	unsigned char j; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	n=strlen(in); | 
					
						
							|  |  |  | 	if (n > (size*2)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		BIO_printf(bio_err,"hex string is too long\n"); | 
					
						
							|  |  |  | 		return(0); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	memset(out,0,size); | 
					
						
							|  |  |  | 	for (i=0; i<n; i++) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		j=(unsigned char)*in; | 
					
						
							|  |  |  | 		*(in++)='\0'; | 
					
						
							|  |  |  | 		if (j == 0) break; | 
					
						
							|  |  |  | 		if ((j >= '0') && (j <= '9')) | 
					
						
							|  |  |  | 			j-='0'; | 
					
						
							|  |  |  | 		else if ((j >= 'A') && (j <= 'F')) | 
					
						
							|  |  |  | 			j=j-'A'+10; | 
					
						
							|  |  |  | 		else if ((j >= 'a') && (j <= 'f')) | 
					
						
							|  |  |  | 			j=j-'a'+10; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			BIO_printf(bio_err,"non-hex digit\n"); | 
					
						
							|  |  |  | 			return(0); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		if (i&1) | 
					
						
							|  |  |  | 			out[i/2]|=j; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			out[i/2]=(j<<4); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	return(1); | 
					
						
							|  |  |  | 	} |