source: trunk/third/openssl/apps/gendsa.c @ 18442

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