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

Revision 18442, 9.0 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/dh.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 <stdlib.h>
63#include <time.h>
64#include <string.h>
65#include "apps.h"
66#include <openssl/bio.h>
67#include <openssl/err.h>
68#include <openssl/bn.h>
69#include <openssl/dh.h>
70#include <openssl/x509.h>
71#include <openssl/pem.h>
72
73#undef PROG
74#define PROG    dh_main
75
76/* -inform arg  - input format - default PEM (DER or PEM)
77 * -outform arg - output format - default PEM
78 * -in arg      - input file - default stdin
79 * -out arg     - output file - default stdout
80 * -check       - check the parameters are ok
81 * -noout
82 * -text
83 * -C
84 */
85
86int MAIN(int, char **);
87
88int MAIN(int argc, char **argv)
89        {
90        ENGINE *e = NULL;
91        DH *dh=NULL;
92        int i,badops=0,text=0;
93        BIO *in=NULL,*out=NULL;
94        int informat,outformat,check=0,noout=0,C=0,ret=1;
95        char *infile,*outfile,*prog,*engine;
96
97        apps_startup();
98
99        if (bio_err == NULL)
100                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
101                        BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
102
103        if (!load_config(bio_err, NULL))
104                goto end;
105
106        engine=NULL;
107        infile=NULL;
108        outfile=NULL;
109        informat=FORMAT_PEM;
110        outformat=FORMAT_PEM;
111
112        prog=argv[0];
113        argc--;
114        argv++;
115        while (argc >= 1)
116                {
117                if      (strcmp(*argv,"-inform") == 0)
118                        {
119                        if (--argc < 1) goto bad;
120                        informat=str2fmt(*(++argv));
121                        }
122                else if (strcmp(*argv,"-outform") == 0)
123                        {
124                        if (--argc < 1) goto bad;
125                        outformat=str2fmt(*(++argv));
126                        }
127                else if (strcmp(*argv,"-in") == 0)
128                        {
129                        if (--argc < 1) goto bad;
130                        infile= *(++argv);
131                        }
132                else if (strcmp(*argv,"-out") == 0)
133                        {
134                        if (--argc < 1) goto bad;
135                        outfile= *(++argv);
136                        }
137                else if (strcmp(*argv,"-engine") == 0)
138                        {
139                        if (--argc < 1) goto bad;
140                        engine= *(++argv);
141                        }
142                else if (strcmp(*argv,"-check") == 0)
143                        check=1;
144                else if (strcmp(*argv,"-text") == 0)
145                        text=1;
146                else if (strcmp(*argv,"-C") == 0)
147                        C=1;
148                else if (strcmp(*argv,"-noout") == 0)
149                        noout=1;
150                else
151                        {
152                        BIO_printf(bio_err,"unknown option %s\n",*argv);
153                        badops=1;
154                        break;
155                        }
156                argc--;
157                argv++;
158                }
159
160        if (badops)
161                {
162bad:
163                BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
164                BIO_printf(bio_err,"where options are\n");
165                BIO_printf(bio_err," -inform arg   input format - one of DER PEM\n");
166                BIO_printf(bio_err," -outform arg  output format - one of DER PEM\n");
167                BIO_printf(bio_err," -in arg       input file\n");
168                BIO_printf(bio_err," -out arg      output file\n");
169                BIO_printf(bio_err," -check        check the DH parameters\n");
170                BIO_printf(bio_err," -text         print a text form of the DH parameters\n");
171                BIO_printf(bio_err," -C            Output C code\n");
172                BIO_printf(bio_err," -noout        no output\n");
173                BIO_printf(bio_err," -engine e     use engine e, possibly a hardware device.\n");
174                goto end;
175                }
176
177        ERR_load_crypto_strings();
178
179        e = setup_engine(bio_err, engine, 0);
180
181        in=BIO_new(BIO_s_file());
182        out=BIO_new(BIO_s_file());
183        if ((in == NULL) || (out == NULL))
184                {
185                ERR_print_errors(bio_err);
186                goto end;
187                }
188
189        if (infile == NULL)
190                BIO_set_fp(in,stdin,BIO_NOCLOSE);
191        else
192                {
193                if (BIO_read_filename(in,infile) <= 0)
194                        {
195                        perror(infile);
196                        goto end;
197                        }
198                }
199        if (outfile == NULL)
200                {
201                BIO_set_fp(out,stdout,BIO_NOCLOSE);
202#ifdef OPENSSL_SYS_VMS
203                {
204                BIO *tmpbio = BIO_new(BIO_f_linebuffer());
205                out = BIO_push(tmpbio, out);
206                }
207#endif
208                }
209        else
210                {
211                if (BIO_write_filename(out,outfile) <= 0)
212                        {
213                        perror(outfile);
214                        goto end;
215                        }
216                }
217
218        if      (informat == FORMAT_ASN1)
219                dh=d2i_DHparams_bio(in,NULL);
220        else if (informat == FORMAT_PEM)
221                dh=PEM_read_bio_DHparams(in,NULL,NULL,NULL);
222        else
223                {
224                BIO_printf(bio_err,"bad input format specified\n");
225                goto end;
226                }
227        if (dh == NULL)
228                {
229                BIO_printf(bio_err,"unable to load DH parameters\n");
230                ERR_print_errors(bio_err);
231                goto end;
232                }
233
234       
235
236        if (text)
237                {
238                DHparams_print(out,dh);
239#ifdef undef
240                printf("p=");
241                BN_print(stdout,dh->p);
242                printf("\ng=");
243                BN_print(stdout,dh->g);
244                printf("\n");
245                if (dh->length != 0)
246                        printf("recommended private length=%ld\n",dh->length);
247#endif
248                }
249       
250        if (check)
251                {
252                if (!DH_check(dh,&i))
253                        {
254                        ERR_print_errors(bio_err);
255                        goto end;
256                        }
257                if (i & DH_CHECK_P_NOT_PRIME)
258                        printf("p value is not prime\n");
259                if (i & DH_CHECK_P_NOT_SAFE_PRIME)
260                        printf("p value is not a safe prime\n");
261                if (i & DH_UNABLE_TO_CHECK_GENERATOR)
262                        printf("unable to check the generator value\n");
263                if (i & DH_NOT_SUITABLE_GENERATOR)
264                        printf("the g value is not a generator\n");
265                if (i == 0)
266                        printf("DH parameters appear to be ok.\n");
267                }
268        if (C)
269                {
270                unsigned char *data;
271                int len,l,bits;
272
273                len=BN_num_bytes(dh->p);
274                bits=BN_num_bits(dh->p);
275                data=(unsigned char *)OPENSSL_malloc(len);
276                if (data == NULL)
277                        {
278                        perror("OPENSSL_malloc");
279                        goto end;
280                        }
281                l=BN_bn2bin(dh->p,data);
282                printf("static unsigned char dh%d_p[]={",bits);
283                for (i=0; i<l; i++)
284                        {
285                        if ((i%12) == 0) printf("\n\t");
286                        printf("0x%02X,",data[i]);
287                        }
288                printf("\n\t};\n");
289
290                l=BN_bn2bin(dh->g,data);
291                printf("static unsigned char dh%d_g[]={",bits);
292                for (i=0; i<l; i++)
293                        {
294                        if ((i%12) == 0) printf("\n\t");
295                        printf("0x%02X,",data[i]);
296                        }
297                printf("\n\t};\n\n");
298
299                printf("DH *get_dh%d()\n\t{\n",bits);
300                printf("\tDH *dh;\n\n");
301                printf("\tif ((dh=DH_new()) == NULL) return(NULL);\n");
302                printf("\tdh->p=BN_bin2bn(dh%d_p,sizeof(dh%d_p),NULL);\n",
303                        bits,bits);
304                printf("\tdh->g=BN_bin2bn(dh%d_g,sizeof(dh%d_g),NULL);\n",
305                        bits,bits);
306                printf("\tif ((dh->p == NULL) || (dh->g == NULL))\n");
307                printf("\t\treturn(NULL);\n");
308                printf("\treturn(dh);\n\t}\n");
309                OPENSSL_free(data);
310                }
311
312
313        if (!noout)
314                {
315                if      (outformat == FORMAT_ASN1)
316                        i=i2d_DHparams_bio(out,dh);
317                else if (outformat == FORMAT_PEM)
318                        i=PEM_write_bio_DHparams(out,dh);
319                else    {
320                        BIO_printf(bio_err,"bad output format specified for outfile\n");
321                        goto end;
322                        }
323                if (!i)
324                        {
325                        BIO_printf(bio_err,"unable to write DH parameters\n");
326                        ERR_print_errors(bio_err);
327                        goto end;
328                        }
329                }
330        ret=0;
331end:
332        if (in != NULL) BIO_free(in);
333        if (out != NULL) BIO_free_all(out);
334        if (dh != NULL) DH_free(dh);
335        apps_shutdown();
336        OPENSSL_EXIT(ret);
337        }
338#endif
Note: See TracBrowser for help on using the repository browser.