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

Revision 15530, 6.2 KB checked in by ghudson, 23 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r15529, 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 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        DH *dh=NULL;
85        int ret=1,num=DEFBITS;
86        int g=2;
87        char *outfile=NULL;
88        char *inrand=NULL;
89        BIO *out=NULL;
90
91        apps_startup();
92
93        if (bio_err == NULL)
94                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
95                        BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
96
97        argv++;
98        argc--;
99        for (;;)
100                {
101                if (argc <= 0) break;
102                if (strcmp(*argv,"-out") == 0)
103                        {
104                        if (--argc < 1) goto bad;
105                        outfile= *(++argv);
106                        }
107                else if (strcmp(*argv,"-2") == 0)
108                        g=2;
109        /*      else if (strcmp(*argv,"-3") == 0)
110                        g=3; */
111                else if (strcmp(*argv,"-5") == 0)
112                        g=5;
113                else if (strcmp(*argv,"-rand") == 0)
114                        {
115                        if (--argc < 1) goto bad;
116                        inrand= *(++argv);
117                        }
118                else
119                        break;
120                argv++;
121                argc--;
122                }
123        if ((argc >= 1) && ((sscanf(*argv,"%d",&num) == 0) || (num < 0)))
124                {
125bad:
126                BIO_printf(bio_err,"usage: gendh [args] [numbits]\n");
127                BIO_printf(bio_err," -out file - output the key to 'file\n");
128                BIO_printf(bio_err," -2    use 2 as the generator value\n");
129        /*      BIO_printf(bio_err," -3    use 3 as the generator value\n"); */
130                BIO_printf(bio_err," -5    use 5 as the generator value\n");
131                BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
132                BIO_printf(bio_err,"           - load the file (or the files in the directory) into\n");
133                BIO_printf(bio_err,"             the random number generator\n");
134                goto end;
135                }
136               
137        out=BIO_new(BIO_s_file());
138        if (out == NULL)
139                {
140                ERR_print_errors(bio_err);
141                goto end;
142                }
143
144        if (outfile == NULL)
145                {
146                BIO_set_fp(out,stdout,BIO_NOCLOSE);
147#ifdef VMS
148                {
149                BIO *tmpbio = BIO_new(BIO_f_linebuffer());
150                out = BIO_push(tmpbio, out);
151                }
152#endif
153                }
154        else
155                {
156                if (BIO_write_filename(out,outfile) <= 0)
157                        {
158                        perror(outfile);
159                        goto end;
160                        }
161                }
162
163        if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL)
164                {
165                BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
166                }
167        if (inrand != NULL)
168                BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
169                        app_RAND_load_files(inrand));
170
171        BIO_printf(bio_err,"Generating DH parameters, %d bit long safe prime, generator %d\n",num,g);
172        BIO_printf(bio_err,"This is going to take a long time\n");
173        dh=DH_generate_parameters(num,g,dh_cb,bio_err);
174               
175        if (dh == NULL) goto end;
176
177        app_RAND_write_file(NULL, bio_err);
178
179        if (!PEM_write_bio_DHparams(out,dh))
180                goto end;
181        ret=0;
182end:
183        if (ret != 0)
184                ERR_print_errors(bio_err);
185        if (out != NULL) BIO_free_all(out);
186        if (dh != NULL) DH_free(dh);
187        EXIT(ret);
188        }
189
190static void MS_CALLBACK dh_cb(int p, int n, void *arg)
191        {
192        char c='*';
193
194        if (p == 0) c='.';
195        if (p == 1) c='+';
196        if (p == 2) c='*';
197        if (p == 3) c='\n';
198        BIO_write((BIO *)arg,&c,1);
199        (void)BIO_flush((BIO *)arg);
200#ifdef LINT
201        p=n;
202#endif
203        }
204#endif
Note: See TracBrowser for help on using the repository browser.