1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59: #include <stdio.h>
60: #include <stdlib.h>
61: #include <string.h>
62: #include "../apps/apps.h"
63: #include <openssl/buffer.h>
64: #include <openssl/err.h>
65: #include <openssl/evp.h>
66: #include <openssl/objects.h>
67: #include <openssl/x509.h>
68: #include <openssl/pem.h>
69:
70: #undef SIZE
71: #undef BSIZE
72: #undef PROG
73:
74: #define SIZE (512)
75: #define BSIZE (8*1024)
76: #define PROG enc_main
77:
78: int main(argc,argv)
79: int argc;
80: char **argv;
81: {
82: char *strbuf=NULL;
83: unsigned char *buff=NULL,*bufsize=NULL;
84: int bsize=BSIZE,verbose=0;
85: int ret=1,inl;
86: char *str=NULL;
87: char *hkey=NULL,*hiv=NULL;
88: int enc=1,printkey=0,i,base64=0;
89: int debug=0;
90: EVP_CIPHER *cipher=NULL,*c;
91: char *inf=NULL,*outf=NULL;
92: BIO *in=NULL,*out=NULL,*b64=NULL,*benc=NULL,*rbio=NULL,*wbio=NULL;
93: #define PROG_NAME_SIZE 39
94:
95:
96: apps_startup();
97:
98: if (bio_err == NULL)
99: if ((bio_err=BIO_new(BIO_s_file())) != NULL)
100: BIO_set_fp(bio_err,stderr,BIO_NOCLOSE);
101:
102: base64=1;
103:
104: argc--;
105: argv++;
106: while (argc >= 1)
107: {
108: if (strcmp(*argv,"-e") == 0)
109: enc=1;
110: if (strcmp(*argv,"-in") == 0)
111: {
112: if (--argc < 1) goto bad;
113: inf= *(++argv);
114: }
115: else if (strcmp(*argv,"-out") == 0)
116: {
117: if (--argc < 1) goto bad;
118: outf= *(++argv);
119: }
120: else if (strcmp(*argv,"-d") == 0)
121: enc=0;
122: else if (strcmp(*argv,"-v") == 0)
123: verbose=1;
124: else if (strcmp(*argv,"-debug") == 0)
125: debug=1;
126: else if (strcmp(*argv,"-bufsize") == 0)
127: {
128: if (--argc < 1) goto bad;
129: bufsize=(unsigned char *)*(++argv);
130: }
131: else
132: {
133: BIO_printf(bio_err,"unknown option '%s'\n",*argv);
134: bad:
135: BIO_printf(bio_err,"options are\n");
136: BIO_printf(bio_err,"%-14s input file\n","-in <file>");
137: BIO_printf(bio_err,"%-14s output file\n","-out <file>");
138: BIO_printf(bio_err,"%-14s encode\n","-e");
139: BIO_printf(bio_err,"%-14s decode\n","-d");
140: BIO_printf(bio_err,"%-14s buffer size\n","-bufsize <n>");
141:
142: goto end;
143: }
144: argc--;
145: argv++;
146: }
147:
148: if (bufsize != NULL)
149: {
150: int i;
151: unsigned long n;
152:
153: for (n=0; *bufsize; bufsize++)
154: {
155: i= *bufsize;
156: if ((i <= '9') && (i >= '0'))
157: n=n*10+i-'0';
158: else if (i == 'k')
159: {
160: n*=1024;
161: bufsize++;
162: break;
163: }
164: }
165: if (*bufsize != '\0')
166: {
167: BIO_printf(bio_err,"invalid 'bufsize' specified.\n");
168: goto end;
169: }
170:
171:
172: if (n < 80) n=80;
173:
174: bsize=(int)n;
175: if (verbose) BIO_printf(bio_err,"bufsize=%d\n",bsize);
176: }
177:
178: strbuf=OPENSSL_malloc(SIZE);
179: buff=(unsigned char *)OPENSSL_malloc(EVP_ENCODE_LENGTH(bsize));
180: if ((buff == NULL) || (strbuf == NULL))
181: {
182: BIO_printf(bio_err,"OPENSSL_malloc failure\n");
183: goto end;
184: }
185:
186: in=BIO_new(BIO_s_file());
187: out=BIO_new(BIO_s_file());
188: if ((in == NULL) || (out == NULL))
189: {
190: ERR_print_errors(bio_err);
191: goto end;
192: }
193: if (debug)
194: {
195: BIO_set_callback(in,BIO_debug_callback);
196: BIO_set_callback(out,BIO_debug_callback);
197: BIO_set_callback_arg(in,bio_err);
198: BIO_set_callback_arg(out,bio_err);
199: }
200:
201: if (inf == NULL)
202: BIO_set_fp(in,stdin,BIO_NOCLOSE);
203: else
204: {
205: if (BIO_read_filename(in,inf) <= 0)
206: {
207: perror(inf);
208: goto end;
209: }
210: }
211:
212: if (outf == NULL)
213: BIO_set_fp(out,stdout,BIO_NOCLOSE);
214: else
215: {
216: if (BIO_write_filename(out,outf) <= 0)
217: {
218: perror(outf);
219: goto end;
220: }
221: }
222:
223: rbio=in;
224: wbio=out;
225:
226: if (base64)
227: {
228: if ((b64=BIO_new(BIO_f_base64())) == NULL)
229: goto end;
230: if (debug)
231: {
232: BIO_set_callback(b64,BIO_debug_callback);
233: BIO_set_callback_arg(b64,bio_err);
234: }
235: if (enc)
236: wbio=BIO_push(b64,wbio);
237: else
238: rbio=BIO_push(b64,rbio);
239: }
240:
241: for (;;)
242: {
243: inl=BIO_read(rbio,(char *)buff,bsize);
244: if (inl <= 0) break;
245: if (BIO_write(wbio,(char *)buff,inl) != inl)
246: {
247: BIO_printf(bio_err,"error writing output file\n");
248: goto end;
249: }
250: }
251: BIO_flush(wbio);
252:
253: ret=0;
254: if (verbose)
255: {
256: BIO_printf(bio_err,"bytes read :%8ld\n",BIO_number_read(in));
257: BIO_printf(bio_err,"bytes written:%8ld\n",BIO_number_written(out));
258: }
259: end:
260: if (strbuf != NULL) OPENSSL_free(strbuf);
261: if (buff != NULL) OPENSSL_free(buff);
262: if (in != NULL) BIO_free(in);
263: if (out != NULL) BIO_free(out);
264: if (benc != NULL) BIO_free(benc);
265: if (b64 != NULL) BIO_free(b64);
266: EXIT(ret);
267: }
268: