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 <openssl/opensslconf.h>
60: #ifndef OPENSSL_NO_DSA
61: #include <stdio.h>
62: #include <string.h>
63: #include <sys/types.h>
64: #include <sys/stat.h>
65: #include "apps.h"
66: #include <openssl/bio.h>
67: #include <openssl/err.h>
68: #include <openssl/bn.h>
69: #include <openssl/dsa.h>
70: #include <openssl/x509.h>
71: #include <openssl/pem.h>
72:
73: #define DEFBITS 512
74: #undef PROG
75: #define PROG gendsa_main
76:
77: int MAIN(int, char **);
78:
79: int MAIN(int argc, char **argv)
80: {
81: #ifndef OPENSSL_NO_ENGINE
82: ENGINE *e = NULL;
83: #endif
84: DSA *dsa=NULL;
85: int ret=1;
86: char *outfile=NULL;
87: char *inrand=NULL,*dsaparams=NULL;
88: char *passargout = NULL, *passout = NULL;
89: BIO *out=NULL,*in=NULL;
90: const EVP_CIPHER *enc=NULL;
91: #ifndef OPENSSL_NO_ENGINE
92: char *engine=NULL;
93: #endif
94:
95: apps_startup();
96:
97: if (bio_err == NULL)
98: if ((bio_err=BIO_new(BIO_s_file())) != NULL)
99: BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
100:
101: if (!load_config(bio_err, NULL))
102: goto end;
103:
104: argv++;
105: argc--;
106: for (;;)
107: {
108: if (argc <= 0) break;
109: if (strcmp(*argv,"-out") == 0)
110: {
111: if (--argc < 1) goto bad;
112: outfile= *(++argv);
113: }
114: else if (strcmp(*argv,"-passout") == 0)
115: {
116: if (--argc < 1) goto bad;
117: passargout= *(++argv);
118: }
119: #ifndef OPENSSL_NO_ENGINE
120: else if (strcmp(*argv,"-engine") == 0)
121: {
122: if (--argc < 1) goto bad;
123: engine= *(++argv);
124: }
125: #endif
126: else if (strcmp(*argv,"-rand") == 0)
127: {
128: if (--argc < 1) goto bad;
129: inrand= *(++argv);
130: }
131: else if (strcmp(*argv,"-") == 0)
132: goto bad;
133: #ifndef OPENSSL_NO_DES
134: else if (strcmp(*argv,"-des") == 0)
135: enc=EVP_des_cbc();
136: else if (strcmp(*argv,"-des3") == 0)
137: enc=EVP_des_ede3_cbc();
138: #endif
139: #ifndef OPENSSL_NO_IDEA
140: else if (strcmp(*argv,"-idea") == 0)
141: enc=EVP_idea_cbc();
142: #endif
143: #ifndef OPENSSL_NO_SEED
144: else if (strcmp(*argv,"-seed") == 0)
145: enc=EVP_seed_cbc();
146: #endif
147: #ifndef OPENSSL_NO_AES
148: else if (strcmp(*argv,"-aes128") == 0)
149: enc=EVP_aes_128_cbc();
150: else if (strcmp(*argv,"-aes192") == 0)
151: enc=EVP_aes_192_cbc();
152: else if (strcmp(*argv,"-aes256") == 0)
153: enc=EVP_aes_256_cbc();
154: #endif
155: #ifndef OPENSSL_NO_CAMELLIA
156: else if (strcmp(*argv,"-camellia128") == 0)
157: enc=EVP_camellia_128_cbc();
158: else if (strcmp(*argv,"-camellia192") == 0)
159: enc=EVP_camellia_192_cbc();
160: else if (strcmp(*argv,"-camellia256") == 0)
161: enc=EVP_camellia_256_cbc();
162: #endif
163: else if (**argv != '-' && dsaparams == NULL)
164: {
165: dsaparams = *argv;
166: }
167: else
168: goto bad;
169: argv++;
170: argc--;
171: }
172:
173: if (dsaparams == NULL)
174: {
175: bad:
176: BIO_printf(bio_err,"usage: gendsa [args] dsaparam-file\n");
177: BIO_printf(bio_err," -out file - output the key to 'file'\n");
178: #ifndef OPENSSL_NO_DES
179: BIO_printf(bio_err," -des - encrypt the generated key with DES in cbc mode\n");
180: BIO_printf(bio_err," -des3 - encrypt the generated key with DES in ede cbc mode (168 bit key)\n");
181: #endif
182: #ifndef OPENSSL_NO_IDEA
183: BIO_printf(bio_err," -idea - encrypt the generated key with IDEA in cbc mode\n");
184: #endif
185: #ifndef OPENSSL_NO_SEED
186: BIO_printf(bio_err," -seed\n");
187: BIO_printf(bio_err," encrypt PEM output with cbc seed\n");
188: #endif
189: #ifndef OPENSSL_NO_AES
190: BIO_printf(bio_err," -aes128, -aes192, -aes256\n");
191: BIO_printf(bio_err," encrypt PEM output with cbc aes\n");
192: #endif
193: #ifndef OPENSSL_NO_CAMELLIA
194: BIO_printf(bio_err," -camellia128, -camellia192, -camellia256\n");
195: BIO_printf(bio_err," encrypt PEM output with cbc camellia\n");
196: #endif
197: #ifndef OPENSSL_NO_ENGINE
198: BIO_printf(bio_err," -engine e - use engine e, possibly a hardware device.\n");
199: #endif
200: BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
201: BIO_printf(bio_err," - load the file (or the files in the directory) into\n");
202: BIO_printf(bio_err," the random number generator\n");
203: BIO_printf(bio_err," dsaparam-file\n");
204: BIO_printf(bio_err," - a DSA parameter file as generated by the dsaparam command\n");
205: goto end;
206: }
207:
208: #ifndef OPENSSL_NO_ENGINE
209: e = setup_engine(bio_err, engine, 0);
210: #endif
211:
212: if(!app_passwd(bio_err, NULL, passargout, NULL, &passout)) {
213: BIO_printf(bio_err, "Error getting password\n");
214: goto end;
215: }
216:
217:
218: in=BIO_new(BIO_s_file());
219: if (!(BIO_read_filename(in,dsaparams)))
220: {
221: perror(dsaparams);
222: goto end;
223: }
224:
225: if ((dsa=PEM_read_bio_DSAparams(in,NULL,NULL,NULL)) == NULL)
226: {
227: BIO_printf(bio_err,"unable to load DSA parameter file\n");
228: goto end;
229: }
230: BIO_free(in);
231: in = NULL;
232:
233: out=BIO_new(BIO_s_file());
234: if (out == NULL) goto end;
235:
236: if (outfile == NULL)
237: {
238: BIO_set_fp(out,stdout,BIO_NOCLOSE);
239: #ifdef OPENSSL_SYS_VMS
240: {
241: BIO *tmpbio = BIO_new(BIO_f_linebuffer());
242: out = BIO_push(tmpbio, out);
243: }
244: #endif
245: }
246: else
247: {
248: if (BIO_write_filename(out,outfile) <= 0)
249: {
250: perror(outfile);
251: goto end;
252: }
253: }
254:
255: if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL)
256: {
257: BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
258: }
259: if (inrand != NULL)
260: BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
261: app_RAND_load_files(inrand));
262:
263: BIO_printf(bio_err,"Generating DSA key, %d bits\n",
264: BN_num_bits(dsa->p));
265: if (!DSA_generate_key(dsa)) goto end;
266:
267: app_RAND_write_file(NULL, bio_err);
268:
269: if (!PEM_write_bio_DSAPrivateKey(out,dsa,enc,NULL,0,NULL, passout))
270: goto end;
271: ret=0;
272: end:
273: if (ret != 0)
274: ERR_print_errors(bio_err);
275: if (in != NULL) BIO_free(in);
276: if (out != NULL) BIO_free_all(out);
277: if (dsa != NULL) DSA_free(dsa);
278: if(passout) OPENSSL_free(passout);
279: apps_shutdown();
280: OPENSSL_EXIT(ret);
281: }
282: #endif