Deleted Added
full compact
enc.c (205128) enc.c (215697)
1/* apps/enc.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <stdlib.h>
61#include <string.h>
62#include "apps.h"
63#include <openssl/bio.h>
64#include <openssl/err.h>
65#include <openssl/evp.h>
66#include <openssl/objects.h>
67#include <openssl/x509.h>
68#include <openssl/rand.h>
69#include <openssl/pem.h>
70#include <ctype.h>
71
72int set_hex(char *in,unsigned char *out,int size);
73#undef SIZE
74#undef BSIZE
75#undef PROG
76
77#define SIZE (512)
78#define BSIZE (8*1024)
79#define PROG enc_main
80
81static void show_ciphers(const OBJ_NAME *name,void *bio_)
82 {
83 BIO *bio=bio_;
84 static int n;
85
86 if(!islower((unsigned char)*name->name))
87 return;
88
89 BIO_printf(bio,"-%-25s",name->name);
90 if(++n == 3)
91 {
92 BIO_printf(bio,"\n");
93 n=0;
94 }
95 else
96 BIO_printf(bio," ");
97 }
98
99int MAIN(int, char **);
100
101int MAIN(int argc, char **argv)
102 {
1/* apps/enc.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <stdlib.h>
61#include <string.h>
62#include "apps.h"
63#include <openssl/bio.h>
64#include <openssl/err.h>
65#include <openssl/evp.h>
66#include <openssl/objects.h>
67#include <openssl/x509.h>
68#include <openssl/rand.h>
69#include <openssl/pem.h>
70#include <ctype.h>
71
72int set_hex(char *in,unsigned char *out,int size);
73#undef SIZE
74#undef BSIZE
75#undef PROG
76
77#define SIZE (512)
78#define BSIZE (8*1024)
79#define PROG enc_main
80
81static void show_ciphers(const OBJ_NAME *name,void *bio_)
82 {
83 BIO *bio=bio_;
84 static int n;
85
86 if(!islower((unsigned char)*name->name))
87 return;
88
89 BIO_printf(bio,"-%-25s",name->name);
90 if(++n == 3)
91 {
92 BIO_printf(bio,"\n");
93 n=0;
94 }
95 else
96 BIO_printf(bio," ");
97 }
98
99int MAIN(int, char **);
100
101int MAIN(int argc, char **argv)
102 {
103#ifndef OPENSSL_NO_ENGINE
104 ENGINE *e = NULL;
105#endif
106 static const char magic[]="Salted__";
107 char mbuf[sizeof magic-1];
108 char *strbuf=NULL;
109 unsigned char *buff=NULL,*bufsize=NULL;
110 int bsize=BSIZE,verbose=0;
111 int ret=1,inl;
112 int nopad = 0;
113 unsigned char key[EVP_MAX_KEY_LENGTH],iv[EVP_MAX_IV_LENGTH];
114 unsigned char salt[PKCS5_SALT_LEN];
115 char *str=NULL, *passarg = NULL, *pass = NULL;
116 char *hkey=NULL,*hiv=NULL,*hsalt = NULL;
117 char *md=NULL;
118 int enc=1,printkey=0,i,base64=0;
119 int debug=0,olb64=0,nosalt=0;
120 const EVP_CIPHER *cipher=NULL,*c;
121 EVP_CIPHER_CTX *ctx = NULL;
122 char *inf=NULL,*outf=NULL;
123 BIO *in=NULL,*out=NULL,*b64=NULL,*benc=NULL,*rbio=NULL,*wbio=NULL;
124#define PROG_NAME_SIZE 39
125 char pname[PROG_NAME_SIZE+1];
126#ifndef OPENSSL_NO_ENGINE
127 char *engine = NULL;
128#endif
129 const EVP_MD *dgst=NULL;
130 int non_fips_allow = 0;
131
132 apps_startup();
133
134 if (bio_err == NULL)
135 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
136 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
137
138 if (!load_config(bio_err, NULL))
139 goto end;
140
141 /* first check the program name */
142 program_name(argv[0],pname,sizeof pname);
143 if (strcmp(pname,"base64") == 0)
144 base64=1;
145
146 cipher=EVP_get_cipherbyname(pname);
147 if (!base64 && (cipher == NULL) && (strcmp(pname,"enc") != 0))
148 {
149 BIO_printf(bio_err,"%s is an unknown cipher\n",pname);
150 goto bad;
151 }
152
153 argc--;
154 argv++;
155 while (argc >= 1)
156 {
157 if (strcmp(*argv,"-e") == 0)
158 enc=1;
159 else if (strcmp(*argv,"-in") == 0)
160 {
161 if (--argc < 1) goto bad;
162 inf= *(++argv);
163 }
164 else if (strcmp(*argv,"-out") == 0)
165 {
166 if (--argc < 1) goto bad;
167 outf= *(++argv);
168 }
169 else if (strcmp(*argv,"-pass") == 0)
170 {
171 if (--argc < 1) goto bad;
172 passarg= *(++argv);
173 }
174#ifndef OPENSSL_NO_ENGINE
175 else if (strcmp(*argv,"-engine") == 0)
176 {
177 if (--argc < 1) goto bad;
178 engine= *(++argv);
179 }
180#endif
181 else if (strcmp(*argv,"-d") == 0)
182 enc=0;
183 else if (strcmp(*argv,"-p") == 0)
184 printkey=1;
185 else if (strcmp(*argv,"-v") == 0)
186 verbose=1;
187 else if (strcmp(*argv,"-nopad") == 0)
188 nopad=1;
189 else if (strcmp(*argv,"-salt") == 0)
190 nosalt=0;
191 else if (strcmp(*argv,"-nosalt") == 0)
192 nosalt=1;
193 else if (strcmp(*argv,"-debug") == 0)
194 debug=1;
195 else if (strcmp(*argv,"-P") == 0)
196 printkey=2;
197 else if (strcmp(*argv,"-A") == 0)
198 olb64=1;
199 else if (strcmp(*argv,"-a") == 0)
200 base64=1;
201 else if (strcmp(*argv,"-base64") == 0)
202 base64=1;
203 else if (strcmp(*argv,"-bufsize") == 0)
204 {
205 if (--argc < 1) goto bad;
206 bufsize=(unsigned char *)*(++argv);
207 }
208 else if (strcmp(*argv,"-k") == 0)
209 {
210 if (--argc < 1) goto bad;
211 str= *(++argv);
212 }
213 else if (strcmp(*argv,"-kfile") == 0)
214 {
215 static char buf[128];
216 FILE *infile;
217 char *file;
218
219 if (--argc < 1) goto bad;
220 file= *(++argv);
221 infile=fopen(file,"r");
222 if (infile == NULL)
223 {
224 BIO_printf(bio_err,"unable to read key from '%s'\n",
225 file);
226 goto bad;
227 }
228 buf[0]='\0';
229 if (!fgets(buf,sizeof buf,infile))
230 {
231 BIO_printf(bio_err,"unable to read key from '%s'\n",
232 file);
233 goto bad;
234 }
235 fclose(infile);
236 i=strlen(buf);
237 if ((i > 0) &&
238 ((buf[i-1] == '\n') || (buf[i-1] == '\r')))
239 buf[--i]='\0';
240 if ((i > 0) &&
241 ((buf[i-1] == '\n') || (buf[i-1] == '\r')))
242 buf[--i]='\0';
243 if (i < 1)
244 {
245 BIO_printf(bio_err,"zero length password\n");
246 goto bad;
247 }
248 str=buf;
249 }
250 else if (strcmp(*argv,"-K") == 0)
251 {
252 if (--argc < 1) goto bad;
253 hkey= *(++argv);
254 }
255 else if (strcmp(*argv,"-S") == 0)
256 {
257 if (--argc < 1) goto bad;
258 hsalt= *(++argv);
259 }
260 else if (strcmp(*argv,"-iv") == 0)
261 {
262 if (--argc < 1) goto bad;
263 hiv= *(++argv);
264 }
265 else if (strcmp(*argv,"-md") == 0)
266 {
267 if (--argc < 1) goto bad;
268 md= *(++argv);
269 }
270 else if (strcmp(*argv,"-non-fips-allow") == 0)
271 non_fips_allow = 1;
272 else if ((argv[0][0] == '-') &&
273 ((c=EVP_get_cipherbyname(&(argv[0][1]))) != NULL))
274 {
275 cipher=c;
276 }
277 else if (strcmp(*argv,"-none") == 0)
278 cipher=NULL;
279 else
280 {
281 BIO_printf(bio_err,"unknown option '%s'\n",*argv);
282bad:
283 BIO_printf(bio_err,"options are\n");
284 BIO_printf(bio_err,"%-14s input file\n","-in <file>");
285 BIO_printf(bio_err,"%-14s output file\n","-out <file>");
286 BIO_printf(bio_err,"%-14s pass phrase source\n","-pass <arg>");
287 BIO_printf(bio_err,"%-14s encrypt\n","-e");
288 BIO_printf(bio_err,"%-14s decrypt\n","-d");
289 BIO_printf(bio_err,"%-14s base64 encode/decode, depending on encryption flag\n","-a/-base64");
290 BIO_printf(bio_err,"%-14s passphrase is the next argument\n","-k");
291 BIO_printf(bio_err,"%-14s passphrase is the first line of the file argument\n","-kfile");
292 BIO_printf(bio_err,"%-14s the next argument is the md to use to create a key\n","-md");
293 BIO_printf(bio_err,"%-14s from a passphrase. One of md2, md5, sha or sha1\n","");
294 BIO_printf(bio_err,"%-14s key/iv in hex is the next argument\n","-K/-iv");
295 BIO_printf(bio_err,"%-14s print the iv/key (then exit if -P)\n","-[pP]");
296 BIO_printf(bio_err,"%-14s buffer size\n","-bufsize <n>");
297#ifndef OPENSSL_NO_ENGINE
298 BIO_printf(bio_err,"%-14s use engine e, possibly a hardware device.\n","-engine e");
299#endif
300
301 BIO_printf(bio_err,"Cipher Types\n");
302 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH,
303 show_ciphers,
304 bio_err);
305 BIO_printf(bio_err,"\n");
306
307 goto end;
308 }
309 argc--;
310 argv++;
311 }
312
313#ifndef OPENSSL_NO_ENGINE
103 static const char magic[]="Salted__";
104 char mbuf[sizeof magic-1];
105 char *strbuf=NULL;
106 unsigned char *buff=NULL,*bufsize=NULL;
107 int bsize=BSIZE,verbose=0;
108 int ret=1,inl;
109 int nopad = 0;
110 unsigned char key[EVP_MAX_KEY_LENGTH],iv[EVP_MAX_IV_LENGTH];
111 unsigned char salt[PKCS5_SALT_LEN];
112 char *str=NULL, *passarg = NULL, *pass = NULL;
113 char *hkey=NULL,*hiv=NULL,*hsalt = NULL;
114 char *md=NULL;
115 int enc=1,printkey=0,i,base64=0;
116 int debug=0,olb64=0,nosalt=0;
117 const EVP_CIPHER *cipher=NULL,*c;
118 EVP_CIPHER_CTX *ctx = NULL;
119 char *inf=NULL,*outf=NULL;
120 BIO *in=NULL,*out=NULL,*b64=NULL,*benc=NULL,*rbio=NULL,*wbio=NULL;
121#define PROG_NAME_SIZE 39
122 char pname[PROG_NAME_SIZE+1];
123#ifndef OPENSSL_NO_ENGINE
124 char *engine = NULL;
125#endif
126 const EVP_MD *dgst=NULL;
127 int non_fips_allow = 0;
128
129 apps_startup();
130
131 if (bio_err == NULL)
132 if ((bio_err=BIO_new(BIO_s_file())) != NULL)
133 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
134
135 if (!load_config(bio_err, NULL))
136 goto end;
137
138 /* first check the program name */
139 program_name(argv[0],pname,sizeof pname);
140 if (strcmp(pname,"base64") == 0)
141 base64=1;
142
143 cipher=EVP_get_cipherbyname(pname);
144 if (!base64 && (cipher == NULL) && (strcmp(pname,"enc") != 0))
145 {
146 BIO_printf(bio_err,"%s is an unknown cipher\n",pname);
147 goto bad;
148 }
149
150 argc--;
151 argv++;
152 while (argc >= 1)
153 {
154 if (strcmp(*argv,"-e") == 0)
155 enc=1;
156 else if (strcmp(*argv,"-in") == 0)
157 {
158 if (--argc < 1) goto bad;
159 inf= *(++argv);
160 }
161 else if (strcmp(*argv,"-out") == 0)
162 {
163 if (--argc < 1) goto bad;
164 outf= *(++argv);
165 }
166 else if (strcmp(*argv,"-pass") == 0)
167 {
168 if (--argc < 1) goto bad;
169 passarg= *(++argv);
170 }
171#ifndef OPENSSL_NO_ENGINE
172 else if (strcmp(*argv,"-engine") == 0)
173 {
174 if (--argc < 1) goto bad;
175 engine= *(++argv);
176 }
177#endif
178 else if (strcmp(*argv,"-d") == 0)
179 enc=0;
180 else if (strcmp(*argv,"-p") == 0)
181 printkey=1;
182 else if (strcmp(*argv,"-v") == 0)
183 verbose=1;
184 else if (strcmp(*argv,"-nopad") == 0)
185 nopad=1;
186 else if (strcmp(*argv,"-salt") == 0)
187 nosalt=0;
188 else if (strcmp(*argv,"-nosalt") == 0)
189 nosalt=1;
190 else if (strcmp(*argv,"-debug") == 0)
191 debug=1;
192 else if (strcmp(*argv,"-P") == 0)
193 printkey=2;
194 else if (strcmp(*argv,"-A") == 0)
195 olb64=1;
196 else if (strcmp(*argv,"-a") == 0)
197 base64=1;
198 else if (strcmp(*argv,"-base64") == 0)
199 base64=1;
200 else if (strcmp(*argv,"-bufsize") == 0)
201 {
202 if (--argc < 1) goto bad;
203 bufsize=(unsigned char *)*(++argv);
204 }
205 else if (strcmp(*argv,"-k") == 0)
206 {
207 if (--argc < 1) goto bad;
208 str= *(++argv);
209 }
210 else if (strcmp(*argv,"-kfile") == 0)
211 {
212 static char buf[128];
213 FILE *infile;
214 char *file;
215
216 if (--argc < 1) goto bad;
217 file= *(++argv);
218 infile=fopen(file,"r");
219 if (infile == NULL)
220 {
221 BIO_printf(bio_err,"unable to read key from '%s'\n",
222 file);
223 goto bad;
224 }
225 buf[0]='\0';
226 if (!fgets(buf,sizeof buf,infile))
227 {
228 BIO_printf(bio_err,"unable to read key from '%s'\n",
229 file);
230 goto bad;
231 }
232 fclose(infile);
233 i=strlen(buf);
234 if ((i > 0) &&
235 ((buf[i-1] == '\n') || (buf[i-1] == '\r')))
236 buf[--i]='\0';
237 if ((i > 0) &&
238 ((buf[i-1] == '\n') || (buf[i-1] == '\r')))
239 buf[--i]='\0';
240 if (i < 1)
241 {
242 BIO_printf(bio_err,"zero length password\n");
243 goto bad;
244 }
245 str=buf;
246 }
247 else if (strcmp(*argv,"-K") == 0)
248 {
249 if (--argc < 1) goto bad;
250 hkey= *(++argv);
251 }
252 else if (strcmp(*argv,"-S") == 0)
253 {
254 if (--argc < 1) goto bad;
255 hsalt= *(++argv);
256 }
257 else if (strcmp(*argv,"-iv") == 0)
258 {
259 if (--argc < 1) goto bad;
260 hiv= *(++argv);
261 }
262 else if (strcmp(*argv,"-md") == 0)
263 {
264 if (--argc < 1) goto bad;
265 md= *(++argv);
266 }
267 else if (strcmp(*argv,"-non-fips-allow") == 0)
268 non_fips_allow = 1;
269 else if ((argv[0][0] == '-') &&
270 ((c=EVP_get_cipherbyname(&(argv[0][1]))) != NULL))
271 {
272 cipher=c;
273 }
274 else if (strcmp(*argv,"-none") == 0)
275 cipher=NULL;
276 else
277 {
278 BIO_printf(bio_err,"unknown option '%s'\n",*argv);
279bad:
280 BIO_printf(bio_err,"options are\n");
281 BIO_printf(bio_err,"%-14s input file\n","-in <file>");
282 BIO_printf(bio_err,"%-14s output file\n","-out <file>");
283 BIO_printf(bio_err,"%-14s pass phrase source\n","-pass <arg>");
284 BIO_printf(bio_err,"%-14s encrypt\n","-e");
285 BIO_printf(bio_err,"%-14s decrypt\n","-d");
286 BIO_printf(bio_err,"%-14s base64 encode/decode, depending on encryption flag\n","-a/-base64");
287 BIO_printf(bio_err,"%-14s passphrase is the next argument\n","-k");
288 BIO_printf(bio_err,"%-14s passphrase is the first line of the file argument\n","-kfile");
289 BIO_printf(bio_err,"%-14s the next argument is the md to use to create a key\n","-md");
290 BIO_printf(bio_err,"%-14s from a passphrase. One of md2, md5, sha or sha1\n","");
291 BIO_printf(bio_err,"%-14s key/iv in hex is the next argument\n","-K/-iv");
292 BIO_printf(bio_err,"%-14s print the iv/key (then exit if -P)\n","-[pP]");
293 BIO_printf(bio_err,"%-14s buffer size\n","-bufsize <n>");
294#ifndef OPENSSL_NO_ENGINE
295 BIO_printf(bio_err,"%-14s use engine e, possibly a hardware device.\n","-engine e");
296#endif
297
298 BIO_printf(bio_err,"Cipher Types\n");
299 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH,
300 show_ciphers,
301 bio_err);
302 BIO_printf(bio_err,"\n");
303
304 goto end;
305 }
306 argc--;
307 argv++;
308 }
309
310#ifndef OPENSSL_NO_ENGINE
314 e = setup_engine(bio_err, engine, 0);
311 setup_engine(bio_err, engine, 0);
315#endif
316
317 if (md && (dgst=EVP_get_digestbyname(md)) == NULL)
318 {
319 BIO_printf(bio_err,"%s is an unsupported message digest type\n",md);
320 goto end;
321 }
322
323 if (dgst == NULL)
324 {
325 if (in_FIPS_mode)
326 dgst = EVP_sha1();
327 else
328 dgst = EVP_md5();
329 }
330
331 if (bufsize != NULL)
332 {
333 unsigned long n;
334
335 for (n=0; *bufsize; bufsize++)
336 {
337 i= *bufsize;
338 if ((i <= '9') && (i >= '0'))
339 n=n*10+i-'0';
340 else if (i == 'k')
341 {
342 n*=1024;
343 bufsize++;
344 break;
345 }
346 }
347 if (*bufsize != '\0')
348 {
349 BIO_printf(bio_err,"invalid 'bufsize' specified.\n");
350 goto end;
351 }
352
353 /* It must be large enough for a base64 encoded line */
354 if (base64 && n < 80) n=80;
355
356 bsize=(int)n;
357 if (verbose) BIO_printf(bio_err,"bufsize=%d\n",bsize);
358 }
359
360 strbuf=OPENSSL_malloc(SIZE);
361 buff=(unsigned char *)OPENSSL_malloc(EVP_ENCODE_LENGTH(bsize));
362 if ((buff == NULL) || (strbuf == NULL))
363 {
364 BIO_printf(bio_err,"OPENSSL_malloc failure %ld\n",(long)EVP_ENCODE_LENGTH(bsize));
365 goto end;
366 }
367
368 in=BIO_new(BIO_s_file());
369 out=BIO_new(BIO_s_file());
370 if ((in == NULL) || (out == NULL))
371 {
372 ERR_print_errors(bio_err);
373 goto end;
374 }
375 if (debug)
376 {
377 BIO_set_callback(in,BIO_debug_callback);
378 BIO_set_callback(out,BIO_debug_callback);
379 BIO_set_callback_arg(in,(char *)bio_err);
380 BIO_set_callback_arg(out,(char *)bio_err);
381 }
382
383 if (inf == NULL)
384 {
385 if (bufsize != NULL)
386 setvbuf(stdin, (char *)NULL, _IONBF, 0);
387 BIO_set_fp(in,stdin,BIO_NOCLOSE);
388 }
389 else
390 {
391 if (BIO_read_filename(in,inf) <= 0)
392 {
393 perror(inf);
394 goto end;
395 }
396 }
397
398 if(!str && passarg) {
399 if(!app_passwd(bio_err, passarg, NULL, &pass, NULL)) {
400 BIO_printf(bio_err, "Error getting password\n");
401 goto end;
402 }
403 str = pass;
404 }
405
406 if ((str == NULL) && (cipher != NULL) && (hkey == NULL))
407 {
408 for (;;)
409 {
410 char buf[200];
411
412 BIO_snprintf(buf,sizeof buf,"enter %s %s password:",
413 OBJ_nid2ln(EVP_CIPHER_nid(cipher)),
414 (enc)?"encryption":"decryption");
415 strbuf[0]='\0';
416 i=EVP_read_pw_string((char *)strbuf,SIZE,buf,enc);
417 if (i == 0)
418 {
419 if (strbuf[0] == '\0')
420 {
421 ret=1;
422 goto end;
423 }
424 str=strbuf;
425 break;
426 }
427 if (i < 0)
428 {
429 BIO_printf(bio_err,"bad password read\n");
430 goto end;
431 }
432 }
433 }
434
435
436 if (outf == NULL)
437 {
438 BIO_set_fp(out,stdout,BIO_NOCLOSE);
439 if (bufsize != NULL)
440 setvbuf(stdout, (char *)NULL, _IONBF, 0);
441#ifdef OPENSSL_SYS_VMS
442 {
443 BIO *tmpbio = BIO_new(BIO_f_linebuffer());
444 out = BIO_push(tmpbio, out);
445 }
446#endif
447 }
448 else
449 {
450 if (BIO_write_filename(out,outf) <= 0)
451 {
452 perror(outf);
453 goto end;
454 }
455 }
456
457 rbio=in;
458 wbio=out;
459
460 if (base64)
461 {
462 if ((b64=BIO_new(BIO_f_base64())) == NULL)
463 goto end;
464 if (debug)
465 {
466 BIO_set_callback(b64,BIO_debug_callback);
467 BIO_set_callback_arg(b64,(char *)bio_err);
468 }
469 if (olb64)
470 BIO_set_flags(b64,BIO_FLAGS_BASE64_NO_NL);
471 if (enc)
472 wbio=BIO_push(b64,wbio);
473 else
474 rbio=BIO_push(b64,rbio);
475 }
476
477 if (cipher != NULL)
478 {
479 /* Note that str is NULL if a key was passed on the command
480 * line, so we get no salt in that case. Is this a bug?
481 */
482 if (str != NULL)
483 {
484 /* Salt handling: if encrypting generate a salt and
485 * write to output BIO. If decrypting read salt from
486 * input BIO.
487 */
488 unsigned char *sptr;
489 if(nosalt) sptr = NULL;
490 else {
491 if(enc) {
492 if(hsalt) {
493 if(!set_hex(hsalt,salt,sizeof salt)) {
494 BIO_printf(bio_err,
495 "invalid hex salt value\n");
496 goto end;
497 }
498 } else if (RAND_pseudo_bytes(salt, sizeof salt) < 0)
499 goto end;
500 /* If -P option then don't bother writing */
501 if((printkey != 2)
502 && (BIO_write(wbio,magic,
503 sizeof magic-1) != sizeof magic-1
504 || BIO_write(wbio,
505 (char *)salt,
506 sizeof salt) != sizeof salt)) {
507 BIO_printf(bio_err,"error writing output file\n");
508 goto end;
509 }
510 } else if(BIO_read(rbio,mbuf,sizeof mbuf) != sizeof mbuf
511 || BIO_read(rbio,
512 (unsigned char *)salt,
513 sizeof salt) != sizeof salt) {
514 BIO_printf(bio_err,"error reading input file\n");
515 goto end;
516 } else if(memcmp(mbuf,magic,sizeof magic-1)) {
517 BIO_printf(bio_err,"bad magic number\n");
518 goto end;
519 }
520
521 sptr = salt;
522 }
523
524 EVP_BytesToKey(cipher,dgst,sptr,
525 (unsigned char *)str,
526 strlen(str),1,key,iv);
527 /* zero the complete buffer or the string
528 * passed from the command line
529 * bug picked up by
530 * Larry J. Hughes Jr. <hughes@indiana.edu> */
531 if (str == strbuf)
532 OPENSSL_cleanse(str,SIZE);
533 else
534 OPENSSL_cleanse(str,strlen(str));
535 }
536 if ((hiv != NULL) && !set_hex(hiv,iv,sizeof iv))
537 {
538 BIO_printf(bio_err,"invalid hex iv value\n");
539 goto end;
540 }
541 if ((hiv == NULL) && (str == NULL)
542 && EVP_CIPHER_iv_length(cipher) != 0)
543 {
544 /* No IV was explicitly set and no IV was generated
545 * during EVP_BytesToKey. Hence the IV is undefined,
546 * making correct decryption impossible. */
547 BIO_printf(bio_err, "iv undefined\n");
548 goto end;
549 }
550 if ((hkey != NULL) && !set_hex(hkey,key,sizeof key))
551 {
552 BIO_printf(bio_err,"invalid hex key value\n");
553 goto end;
554 }
555
556 if ((benc=BIO_new(BIO_f_cipher())) == NULL)
557 goto end;
558
559 /* Since we may be changing parameters work on the encryption
560 * context rather than calling BIO_set_cipher().
561 */
562
563 BIO_get_cipher_ctx(benc, &ctx);
564
565 if (non_fips_allow)
566 EVP_CIPHER_CTX_set_flags(ctx,
567 EVP_CIPH_FLAG_NON_FIPS_ALLOW);
568
569 if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc))
570 {
571 BIO_printf(bio_err, "Error setting cipher %s\n",
572 EVP_CIPHER_name(cipher));
573 ERR_print_errors(bio_err);
574 goto end;
575 }
576
577 if (nopad)
578 EVP_CIPHER_CTX_set_padding(ctx, 0);
579
580 if (!EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc))
581 {
582 BIO_printf(bio_err, "Error setting cipher %s\n",
583 EVP_CIPHER_name(cipher));
584 ERR_print_errors(bio_err);
585 goto end;
586 }
587
588 if (debug)
589 {
590 BIO_set_callback(benc,BIO_debug_callback);
591 BIO_set_callback_arg(benc,(char *)bio_err);
592 }
593
594 if (printkey)
595 {
596 if (!nosalt)
597 {
598 printf("salt=");
599 for (i=0; i<(int)sizeof(salt); i++)
600 printf("%02X",salt[i]);
601 printf("\n");
602 }
603 if (cipher->key_len > 0)
604 {
605 printf("key=");
606 for (i=0; i<cipher->key_len; i++)
607 printf("%02X",key[i]);
608 printf("\n");
609 }
610 if (cipher->iv_len > 0)
611 {
612 printf("iv =");
613 for (i=0; i<cipher->iv_len; i++)
614 printf("%02X",iv[i]);
615 printf("\n");
616 }
617 if (printkey == 2)
618 {
619 ret=0;
620 goto end;
621 }
622 }
623 }
624
625 /* Only encrypt/decrypt as we write the file */
626 if (benc != NULL)
627 wbio=BIO_push(benc,wbio);
628
629 for (;;)
630 {
631 inl=BIO_read(rbio,(char *)buff,bsize);
632 if (inl <= 0) break;
633 if (BIO_write(wbio,(char *)buff,inl) != inl)
634 {
635 BIO_printf(bio_err,"error writing output file\n");
636 goto end;
637 }
638 }
639 if (!BIO_flush(wbio))
640 {
641 BIO_printf(bio_err,"bad decrypt\n");
642 goto end;
643 }
644
645 ret=0;
646 if (verbose)
647 {
648 BIO_printf(bio_err,"bytes read :%8ld\n",BIO_number_read(in));
649 BIO_printf(bio_err,"bytes written:%8ld\n",BIO_number_written(out));
650 }
651end:
652 ERR_print_errors(bio_err);
653 if (strbuf != NULL) OPENSSL_free(strbuf);
654 if (buff != NULL) OPENSSL_free(buff);
655 if (in != NULL) BIO_free(in);
656 if (out != NULL) BIO_free_all(out);
657 if (benc != NULL) BIO_free(benc);
658 if (b64 != NULL) BIO_free(b64);
659 if(pass) OPENSSL_free(pass);
660 apps_shutdown();
661 OPENSSL_EXIT(ret);
662 }
663
664int set_hex(char *in, unsigned char *out, int size)
665 {
666 int i,n;
667 unsigned char j;
668
669 n=strlen(in);
670 if (n > (size*2))
671 {
672 BIO_printf(bio_err,"hex string is too long\n");
673 return(0);
674 }
675 memset(out,0,size);
676 for (i=0; i<n; i++)
677 {
678 j=(unsigned char)*in;
679 *(in++)='\0';
680 if (j == 0) break;
681 if ((j >= '0') && (j <= '9'))
682 j-='0';
683 else if ((j >= 'A') && (j <= 'F'))
684 j=j-'A'+10;
685 else if ((j >= 'a') && (j <= 'f'))
686 j=j-'a'+10;
687 else
688 {
689 BIO_printf(bio_err,"non-hex digit\n");
690 return(0);
691 }
692 if (i&1)
693 out[i/2]|=j;
694 else
695 out[i/2]=(j<<4);
696 }
697 return(1);
698 }
312#endif
313
314 if (md && (dgst=EVP_get_digestbyname(md)) == NULL)
315 {
316 BIO_printf(bio_err,"%s is an unsupported message digest type\n",md);
317 goto end;
318 }
319
320 if (dgst == NULL)
321 {
322 if (in_FIPS_mode)
323 dgst = EVP_sha1();
324 else
325 dgst = EVP_md5();
326 }
327
328 if (bufsize != NULL)
329 {
330 unsigned long n;
331
332 for (n=0; *bufsize; bufsize++)
333 {
334 i= *bufsize;
335 if ((i <= '9') && (i >= '0'))
336 n=n*10+i-'0';
337 else if (i == 'k')
338 {
339 n*=1024;
340 bufsize++;
341 break;
342 }
343 }
344 if (*bufsize != '\0')
345 {
346 BIO_printf(bio_err,"invalid 'bufsize' specified.\n");
347 goto end;
348 }
349
350 /* It must be large enough for a base64 encoded line */
351 if (base64 && n < 80) n=80;
352
353 bsize=(int)n;
354 if (verbose) BIO_printf(bio_err,"bufsize=%d\n",bsize);
355 }
356
357 strbuf=OPENSSL_malloc(SIZE);
358 buff=(unsigned char *)OPENSSL_malloc(EVP_ENCODE_LENGTH(bsize));
359 if ((buff == NULL) || (strbuf == NULL))
360 {
361 BIO_printf(bio_err,"OPENSSL_malloc failure %ld\n",(long)EVP_ENCODE_LENGTH(bsize));
362 goto end;
363 }
364
365 in=BIO_new(BIO_s_file());
366 out=BIO_new(BIO_s_file());
367 if ((in == NULL) || (out == NULL))
368 {
369 ERR_print_errors(bio_err);
370 goto end;
371 }
372 if (debug)
373 {
374 BIO_set_callback(in,BIO_debug_callback);
375 BIO_set_callback(out,BIO_debug_callback);
376 BIO_set_callback_arg(in,(char *)bio_err);
377 BIO_set_callback_arg(out,(char *)bio_err);
378 }
379
380 if (inf == NULL)
381 {
382 if (bufsize != NULL)
383 setvbuf(stdin, (char *)NULL, _IONBF, 0);
384 BIO_set_fp(in,stdin,BIO_NOCLOSE);
385 }
386 else
387 {
388 if (BIO_read_filename(in,inf) <= 0)
389 {
390 perror(inf);
391 goto end;
392 }
393 }
394
395 if(!str && passarg) {
396 if(!app_passwd(bio_err, passarg, NULL, &pass, NULL)) {
397 BIO_printf(bio_err, "Error getting password\n");
398 goto end;
399 }
400 str = pass;
401 }
402
403 if ((str == NULL) && (cipher != NULL) && (hkey == NULL))
404 {
405 for (;;)
406 {
407 char buf[200];
408
409 BIO_snprintf(buf,sizeof buf,"enter %s %s password:",
410 OBJ_nid2ln(EVP_CIPHER_nid(cipher)),
411 (enc)?"encryption":"decryption");
412 strbuf[0]='\0';
413 i=EVP_read_pw_string((char *)strbuf,SIZE,buf,enc);
414 if (i == 0)
415 {
416 if (strbuf[0] == '\0')
417 {
418 ret=1;
419 goto end;
420 }
421 str=strbuf;
422 break;
423 }
424 if (i < 0)
425 {
426 BIO_printf(bio_err,"bad password read\n");
427 goto end;
428 }
429 }
430 }
431
432
433 if (outf == NULL)
434 {
435 BIO_set_fp(out,stdout,BIO_NOCLOSE);
436 if (bufsize != NULL)
437 setvbuf(stdout, (char *)NULL, _IONBF, 0);
438#ifdef OPENSSL_SYS_VMS
439 {
440 BIO *tmpbio = BIO_new(BIO_f_linebuffer());
441 out = BIO_push(tmpbio, out);
442 }
443#endif
444 }
445 else
446 {
447 if (BIO_write_filename(out,outf) <= 0)
448 {
449 perror(outf);
450 goto end;
451 }
452 }
453
454 rbio=in;
455 wbio=out;
456
457 if (base64)
458 {
459 if ((b64=BIO_new(BIO_f_base64())) == NULL)
460 goto end;
461 if (debug)
462 {
463 BIO_set_callback(b64,BIO_debug_callback);
464 BIO_set_callback_arg(b64,(char *)bio_err);
465 }
466 if (olb64)
467 BIO_set_flags(b64,BIO_FLAGS_BASE64_NO_NL);
468 if (enc)
469 wbio=BIO_push(b64,wbio);
470 else
471 rbio=BIO_push(b64,rbio);
472 }
473
474 if (cipher != NULL)
475 {
476 /* Note that str is NULL if a key was passed on the command
477 * line, so we get no salt in that case. Is this a bug?
478 */
479 if (str != NULL)
480 {
481 /* Salt handling: if encrypting generate a salt and
482 * write to output BIO. If decrypting read salt from
483 * input BIO.
484 */
485 unsigned char *sptr;
486 if(nosalt) sptr = NULL;
487 else {
488 if(enc) {
489 if(hsalt) {
490 if(!set_hex(hsalt,salt,sizeof salt)) {
491 BIO_printf(bio_err,
492 "invalid hex salt value\n");
493 goto end;
494 }
495 } else if (RAND_pseudo_bytes(salt, sizeof salt) < 0)
496 goto end;
497 /* If -P option then don't bother writing */
498 if((printkey != 2)
499 && (BIO_write(wbio,magic,
500 sizeof magic-1) != sizeof magic-1
501 || BIO_write(wbio,
502 (char *)salt,
503 sizeof salt) != sizeof salt)) {
504 BIO_printf(bio_err,"error writing output file\n");
505 goto end;
506 }
507 } else if(BIO_read(rbio,mbuf,sizeof mbuf) != sizeof mbuf
508 || BIO_read(rbio,
509 (unsigned char *)salt,
510 sizeof salt) != sizeof salt) {
511 BIO_printf(bio_err,"error reading input file\n");
512 goto end;
513 } else if(memcmp(mbuf,magic,sizeof magic-1)) {
514 BIO_printf(bio_err,"bad magic number\n");
515 goto end;
516 }
517
518 sptr = salt;
519 }
520
521 EVP_BytesToKey(cipher,dgst,sptr,
522 (unsigned char *)str,
523 strlen(str),1,key,iv);
524 /* zero the complete buffer or the string
525 * passed from the command line
526 * bug picked up by
527 * Larry J. Hughes Jr. <hughes@indiana.edu> */
528 if (str == strbuf)
529 OPENSSL_cleanse(str,SIZE);
530 else
531 OPENSSL_cleanse(str,strlen(str));
532 }
533 if ((hiv != NULL) && !set_hex(hiv,iv,sizeof iv))
534 {
535 BIO_printf(bio_err,"invalid hex iv value\n");
536 goto end;
537 }
538 if ((hiv == NULL) && (str == NULL)
539 && EVP_CIPHER_iv_length(cipher) != 0)
540 {
541 /* No IV was explicitly set and no IV was generated
542 * during EVP_BytesToKey. Hence the IV is undefined,
543 * making correct decryption impossible. */
544 BIO_printf(bio_err, "iv undefined\n");
545 goto end;
546 }
547 if ((hkey != NULL) && !set_hex(hkey,key,sizeof key))
548 {
549 BIO_printf(bio_err,"invalid hex key value\n");
550 goto end;
551 }
552
553 if ((benc=BIO_new(BIO_f_cipher())) == NULL)
554 goto end;
555
556 /* Since we may be changing parameters work on the encryption
557 * context rather than calling BIO_set_cipher().
558 */
559
560 BIO_get_cipher_ctx(benc, &ctx);
561
562 if (non_fips_allow)
563 EVP_CIPHER_CTX_set_flags(ctx,
564 EVP_CIPH_FLAG_NON_FIPS_ALLOW);
565
566 if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc))
567 {
568 BIO_printf(bio_err, "Error setting cipher %s\n",
569 EVP_CIPHER_name(cipher));
570 ERR_print_errors(bio_err);
571 goto end;
572 }
573
574 if (nopad)
575 EVP_CIPHER_CTX_set_padding(ctx, 0);
576
577 if (!EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc))
578 {
579 BIO_printf(bio_err, "Error setting cipher %s\n",
580 EVP_CIPHER_name(cipher));
581 ERR_print_errors(bio_err);
582 goto end;
583 }
584
585 if (debug)
586 {
587 BIO_set_callback(benc,BIO_debug_callback);
588 BIO_set_callback_arg(benc,(char *)bio_err);
589 }
590
591 if (printkey)
592 {
593 if (!nosalt)
594 {
595 printf("salt=");
596 for (i=0; i<(int)sizeof(salt); i++)
597 printf("%02X",salt[i]);
598 printf("\n");
599 }
600 if (cipher->key_len > 0)
601 {
602 printf("key=");
603 for (i=0; i<cipher->key_len; i++)
604 printf("%02X",key[i]);
605 printf("\n");
606 }
607 if (cipher->iv_len > 0)
608 {
609 printf("iv =");
610 for (i=0; i<cipher->iv_len; i++)
611 printf("%02X",iv[i]);
612 printf("\n");
613 }
614 if (printkey == 2)
615 {
616 ret=0;
617 goto end;
618 }
619 }
620 }
621
622 /* Only encrypt/decrypt as we write the file */
623 if (benc != NULL)
624 wbio=BIO_push(benc,wbio);
625
626 for (;;)
627 {
628 inl=BIO_read(rbio,(char *)buff,bsize);
629 if (inl <= 0) break;
630 if (BIO_write(wbio,(char *)buff,inl) != inl)
631 {
632 BIO_printf(bio_err,"error writing output file\n");
633 goto end;
634 }
635 }
636 if (!BIO_flush(wbio))
637 {
638 BIO_printf(bio_err,"bad decrypt\n");
639 goto end;
640 }
641
642 ret=0;
643 if (verbose)
644 {
645 BIO_printf(bio_err,"bytes read :%8ld\n",BIO_number_read(in));
646 BIO_printf(bio_err,"bytes written:%8ld\n",BIO_number_written(out));
647 }
648end:
649 ERR_print_errors(bio_err);
650 if (strbuf != NULL) OPENSSL_free(strbuf);
651 if (buff != NULL) OPENSSL_free(buff);
652 if (in != NULL) BIO_free(in);
653 if (out != NULL) BIO_free_all(out);
654 if (benc != NULL) BIO_free(benc);
655 if (b64 != NULL) BIO_free(b64);
656 if(pass) OPENSSL_free(pass);
657 apps_shutdown();
658 OPENSSL_EXIT(ret);
659 }
660
661int set_hex(char *in, unsigned char *out, int size)
662 {
663 int i,n;
664 unsigned char j;
665
666 n=strlen(in);
667 if (n > (size*2))
668 {
669 BIO_printf(bio_err,"hex string is too long\n");
670 return(0);
671 }
672 memset(out,0,size);
673 for (i=0; i<n; i++)
674 {
675 j=(unsigned char)*in;
676 *(in++)='\0';
677 if (j == 0) break;
678 if ((j >= '0') && (j <= '9'))
679 j-='0';
680 else if ((j >= 'A') && (j <= 'F'))
681 j=j-'A'+10;
682 else if ((j >= 'a') && (j <= 'f'))
683 j=j-'a'+10;
684 else
685 {
686 BIO_printf(bio_err,"non-hex digit\n");
687 return(0);
688 }
689 if (i&1)
690 out[i/2]|=j;
691 else
692 out[i/2]=(j<<4);
693 }
694 return(1);
695 }