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

Revision 18442, 6.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/gendh.c */
2/* obsoleted by dhparam.c */
3/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
4 * All rights reserved.
5 *
6 * This package is an SSL implementation written
7 * by Eric Young (eay@cryptsoft.com).
8 * The implementation was written so as to conform with Netscapes SSL.
9 *
10 * This library is free for commercial and non-commercial use as long as
11 * the following conditions are aheared to.  The following conditions
12 * apply to all code found in this distribution, be it the RC4, RSA,
13 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
14 * included with this distribution is covered by the same copyright terms
15 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
16 *
17 * Copyright remains Eric Young's, and as such any Copyright notices in
18 * the code are not to be removed.
19 * If this package is used in a product, Eric Young should be given attribution
20 * as the author of the parts of the library used.
21 * This can be in the form of a textual message at program startup or
22 * in documentation (online or textual) provided with the package.
23 *
24 * Redistribution and use in source and binary forms, with or without
25 * modification, are permitted provided that the following conditions
26 * are met:
27 * 1. Redistributions of source code must retain the copyright
28 *    notice, this list of conditions and the following disclaimer.
29 * 2. Redistributions in binary form must reproduce the above copyright
30 *    notice, this list of conditions and the following disclaimer in the
31 *    documentation and/or other materials provided with the distribution.
32 * 3. All advertising materials mentioning features or use of this software
33 *    must display the following acknowledgement:
34 *    "This product includes cryptographic software written by
35 *     Eric Young (eay@cryptsoft.com)"
36 *    The word 'cryptographic' can be left out if the rouines from the library
37 *    being used are not cryptographic related :-).
38 * 4. If you include any Windows specific code (or a derivative thereof) from
39 *    the apps directory (application code) you must include an acknowledgement:
40 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
41 *
42 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52 * SUCH DAMAGE.
53 *
54 * The licence and distribution terms for any publically available version or
55 * derivative of this code cannot be changed.  i.e. this code cannot simply be
56 * copied and put under another distribution licence
57 * [including the GNU Public Licence.]
58 */
59
60#ifndef OPENSSL_NO_DH
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/rand.h>
68#include <openssl/err.h>
69#include <openssl/bn.h>
70#include <openssl/dh.h>
71#include <openssl/x509.h>
72#include <openssl/pem.h>
73
74#define DEFBITS 512
75#undef PROG
76#define PROG gendh_main
77
78static void MS_CALLBACK dh_cb(int p, int n, void *arg);
79
80int MAIN(int, char **);
81
82int MAIN(int argc, char **argv)
83        {
84        ENGINE *e = NULL;
85        DH *dh=NULL;
86        int ret=1,num=DEFBITS;
87        int g=2;
88        char *outfile=NULL;
89        char *inrand=NULL;
90        char *engine=NULL;
91        BIO *out=NULL;
92
93        apps_startup();
94
95        if (bio_err == NULL)
96                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
97                        BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
98
99        if (!load_config(bio_err, NULL))
100                goto end;
101
102        argv++;
103        argc--;
104        for (;;)
105                {
106                if (argc <= 0) break;
107                if (strcmp(*argv,"-out") == 0)
108                        {
109                        if (--argc < 1) goto bad;
110                        outfile= *(++argv);
111                        }
112                else if (strcmp(*argv,"-2") == 0)
113                        g=2;
114        /*      else if (strcmp(*argv,"-3") == 0)
115                        g=3; */
116                else if (strcmp(*argv,"-5") == 0)
117                        g=5;
118                else if (strcmp(*argv,"-engine") == 0)
119                        {
120                        if (--argc < 1) goto bad;
121                        engine= *(++argv);
122                        }
123                else if (strcmp(*argv,"-rand") == 0)
124                        {
125                        if (--argc < 1) goto bad;
126                        inrand= *(++argv);
127                        }
128                else
129                        break;
130                argv++;
131                argc--;
132                }
133        if ((argc >= 1) && ((sscanf(*argv,"%d",&num) == 0) || (num < 0)))
134                {
135bad:
136                BIO_printf(bio_err,"usage: gendh [args] [numbits]\n");
137                BIO_printf(bio_err," -out file - output the key to 'file\n");
138                BIO_printf(bio_err," -2        - use 2 as the generator value\n");
139        /*      BIO_printf(bio_err," -3        - use 3 as the generator value\n"); */
140                BIO_printf(bio_err," -5        - use 5 as the generator value\n");
141                BIO_printf(bio_err," -engine e - use engine e, possibly a hardware device.\n");
142                BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
143                BIO_printf(bio_err,"           - load the file (or the files in the directory) into\n");
144                BIO_printf(bio_err,"             the random number generator\n");
145                goto end;
146                }
147               
148        e = setup_engine(bio_err, engine, 0);
149
150        out=BIO_new(BIO_s_file());
151        if (out == NULL)
152                {
153                ERR_print_errors(bio_err);
154                goto end;
155                }
156
157        if (outfile == NULL)
158                {
159                BIO_set_fp(out,stdout,BIO_NOCLOSE);
160#ifdef OPENSSL_SYS_VMS
161                {
162                BIO *tmpbio = BIO_new(BIO_f_linebuffer());
163                out = BIO_push(tmpbio, out);
164                }
165#endif
166                }
167        else
168                {
169                if (BIO_write_filename(out,outfile) <= 0)
170                        {
171                        perror(outfile);
172                        goto end;
173                        }
174                }
175
176        if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL)
177                {
178                BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
179                }
180        if (inrand != NULL)
181                BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
182                        app_RAND_load_files(inrand));
183
184        BIO_printf(bio_err,"Generating DH parameters, %d bit long safe prime, generator %d\n",num,g);
185        BIO_printf(bio_err,"This is going to take a long time\n");
186        dh=DH_generate_parameters(num,g,dh_cb,bio_err);
187               
188        if (dh == NULL) goto end;
189
190        app_RAND_write_file(NULL, bio_err);
191
192        if (!PEM_write_bio_DHparams(out,dh))
193                goto end;
194        ret=0;
195end:
196        if (ret != 0)
197                ERR_print_errors(bio_err);
198        if (out != NULL) BIO_free_all(out);
199        if (dh != NULL) DH_free(dh);
200        apps_shutdown();
201        OPENSSL_EXIT(ret);
202        }
203
204static void MS_CALLBACK dh_cb(int p, int n, void *arg)
205        {
206        char c='*';
207
208        if (p == 0) c='.';
209        if (p == 1) c='+';
210        if (p == 2) c='*';
211        if (p == 3) c='\n';
212        BIO_write((BIO *)arg,&c,1);
213        (void)BIO_flush((BIO *)arg);
214#ifdef LINT
215        p=n;
216#endif
217        }
218#endif
Note: See TracBrowser for help on using the repository browser.