Branch data Line data Source code
1 : : /* apps/dhparam.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 : : * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved.
60 : : *
61 : : * Redistribution and use in source and binary forms, with or without
62 : : * modification, are permitted provided that the following conditions
63 : : * are met:
64 : : *
65 : : * 1. Redistributions of source code must retain the above copyright
66 : : * notice, this list of conditions and the following disclaimer.
67 : : *
68 : : * 2. Redistributions in binary form must reproduce the above copyright
69 : : * notice, this list of conditions and the following disclaimer in
70 : : * the documentation and/or other materials provided with the
71 : : * distribution.
72 : : *
73 : : * 3. All advertising materials mentioning features or use of this
74 : : * software must display the following acknowledgment:
75 : : * "This product includes software developed by the OpenSSL Project
76 : : * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 : : *
78 : : * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 : : * endorse or promote products derived from this software without
80 : : * prior written permission. For written permission, please contact
81 : : * openssl-core@openssl.org.
82 : : *
83 : : * 5. Products derived from this software may not be called "OpenSSL"
84 : : * nor may "OpenSSL" appear in their names without prior written
85 : : * permission of the OpenSSL Project.
86 : : *
87 : : * 6. Redistributions of any form whatsoever must retain the following
88 : : * acknowledgment:
89 : : * "This product includes software developed by the OpenSSL Project
90 : : * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 : : *
92 : : * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 : : * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 : : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 : : * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 : : * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 : : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 : : * OF THE POSSIBILITY OF SUCH DAMAGE.
104 : : * ====================================================================
105 : : *
106 : : * This product includes cryptographic software written by Eric Young
107 : : * (eay@cryptsoft.com). This product includes software written by Tim
108 : : * Hudson (tjh@cryptsoft.com).
109 : : *
110 : : */
111 : :
112 : : #include <openssl/opensslconf.h> /* for OPENSSL_NO_DH */
113 : : #ifndef OPENSSL_NO_DH
114 : : #include <stdio.h>
115 : : #include <stdlib.h>
116 : : #include <time.h>
117 : : #include <string.h>
118 : : #include "apps.h"
119 : : #include <openssl/bio.h>
120 : : #include <openssl/err.h>
121 : : #include <openssl/bn.h>
122 : : #include <openssl/dh.h>
123 : : #include <openssl/x509.h>
124 : : #include <openssl/pem.h>
125 : :
126 : : #ifndef OPENSSL_NO_DSA
127 : : #include <openssl/dsa.h>
128 : : #endif
129 : :
130 : : #undef PROG
131 : : #define PROG dhparam_main
132 : :
133 : : #define DEFBITS 512
134 : :
135 : : /* -inform arg - input format - default PEM (DER or PEM)
136 : : * -outform arg - output format - default PEM
137 : : * -in arg - input file - default stdin
138 : : * -out arg - output file - default stdout
139 : : * -dsaparam - read or generate DSA parameters, convert to DH
140 : : * -check - check the parameters are ok
141 : : * -noout
142 : : * -text
143 : : * -C
144 : : */
145 : :
146 : : static int MS_CALLBACK dh_cb(int p, int n, BN_GENCB *cb);
147 : :
148 : : int MAIN(int, char **);
149 : :
150 : 0 : int MAIN(int argc, char **argv)
151 : : {
152 : 0 : DH *dh=NULL;
153 : 0 : int i,badops=0,text=0;
154 : : #ifndef OPENSSL_NO_DSA
155 : 0 : int dsaparam=0;
156 : : #endif
157 : 0 : BIO *in=NULL,*out=NULL;
158 : 0 : int informat,outformat,check=0,noout=0,C=0,ret=1;
159 : : char *infile,*outfile,*prog;
160 : 0 : char *inrand=NULL;
161 : : #ifndef OPENSSL_NO_ENGINE
162 : 0 : char *engine=NULL;
163 : : #endif
164 : 0 : int num = 0, g = 0;
165 : :
166 : 0 : apps_startup();
167 : :
168 [ # # ]: 0 : if (bio_err == NULL)
169 [ # # ]: 0 : if ((bio_err=BIO_new(BIO_s_file())) != NULL)
170 : 0 : BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
171 : :
172 [ # # ]: 0 : if (!load_config(bio_err, NULL))
173 : : goto end;
174 : :
175 : 0 : infile=NULL;
176 : 0 : outfile=NULL;
177 : 0 : informat=FORMAT_PEM;
178 : 0 : outformat=FORMAT_PEM;
179 : :
180 : 0 : prog=argv[0];
181 : 0 : argc--;
182 : 0 : argv++;
183 [ # # ]: 0 : while (argc >= 1)
184 : : {
185 [ # # ]: 0 : if (strcmp(*argv,"-inform") == 0)
186 : : {
187 [ # # ]: 0 : if (--argc < 1) goto bad;
188 : 0 : informat=str2fmt(*(++argv));
189 : : }
190 [ # # ]: 0 : else if (strcmp(*argv,"-outform") == 0)
191 : : {
192 [ # # ]: 0 : if (--argc < 1) goto bad;
193 : 0 : outformat=str2fmt(*(++argv));
194 : : }
195 [ # # ]: 0 : else if (strcmp(*argv,"-in") == 0)
196 : : {
197 [ # # ]: 0 : if (--argc < 1) goto bad;
198 : 0 : infile= *(++argv);
199 : : }
200 [ # # ]: 0 : else if (strcmp(*argv,"-out") == 0)
201 : : {
202 [ # # ]: 0 : if (--argc < 1) goto bad;
203 : 0 : outfile= *(++argv);
204 : : }
205 : : #ifndef OPENSSL_NO_ENGINE
206 [ # # ]: 0 : else if (strcmp(*argv,"-engine") == 0)
207 : : {
208 [ # # ]: 0 : if (--argc < 1) goto bad;
209 : 0 : engine= *(++argv);
210 : : }
211 : : #endif
212 [ # # ]: 0 : else if (strcmp(*argv,"-check") == 0)
213 : : check=1;
214 [ # # ]: 0 : else if (strcmp(*argv,"-text") == 0)
215 : : text=1;
216 : : #ifndef OPENSSL_NO_DSA
217 [ # # ]: 0 : else if (strcmp(*argv,"-dsaparam") == 0)
218 : : dsaparam=1;
219 : : #endif
220 [ # # ]: 0 : else if (strcmp(*argv,"-C") == 0)
221 : : C=1;
222 [ # # ]: 0 : else if (strcmp(*argv,"-noout") == 0)
223 : : noout=1;
224 [ # # ]: 0 : else if (strcmp(*argv,"-2") == 0)
225 : : g=2;
226 [ # # ]: 0 : else if (strcmp(*argv,"-5") == 0)
227 : : g=5;
228 [ # # ]: 0 : else if (strcmp(*argv,"-rand") == 0)
229 : : {
230 [ # # ]: 0 : if (--argc < 1) goto bad;
231 : 0 : inrand= *(++argv);
232 : : }
233 [ # # ][ # # ]: 0 : else if (((sscanf(*argv,"%d",&num) == 0) || (num <= 0)))
234 : : goto bad;
235 : 0 : argv++;
236 : 0 : argc--;
237 : : }
238 : :
239 : : if (badops)
240 : : {
241 : : bad:
242 : 0 : BIO_printf(bio_err,"%s [options] [numbits]\n",prog);
243 : 0 : BIO_printf(bio_err,"where options are\n");
244 : 0 : BIO_printf(bio_err," -inform arg input format - one of DER PEM\n");
245 : 0 : BIO_printf(bio_err," -outform arg output format - one of DER PEM\n");
246 : 0 : BIO_printf(bio_err," -in arg input file\n");
247 : 0 : BIO_printf(bio_err," -out arg output file\n");
248 : : #ifndef OPENSSL_NO_DSA
249 : 0 : BIO_printf(bio_err," -dsaparam read or generate DSA parameters, convert to DH\n");
250 : : #endif
251 : 0 : BIO_printf(bio_err," -check check the DH parameters\n");
252 : 0 : BIO_printf(bio_err," -text print a text form of the DH parameters\n");
253 : 0 : BIO_printf(bio_err," -C Output C code\n");
254 : 0 : BIO_printf(bio_err," -2 generate parameters using 2 as the generator value\n");
255 : 0 : BIO_printf(bio_err," -5 generate parameters using 5 as the generator value\n");
256 : 0 : BIO_printf(bio_err," numbits number of bits in to generate (default 512)\n");
257 : : #ifndef OPENSSL_NO_ENGINE
258 : 0 : BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n");
259 : : #endif
260 : 0 : BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
261 : 0 : BIO_printf(bio_err," - load the file (or the files in the directory) into\n");
262 : 0 : BIO_printf(bio_err," the random number generator\n");
263 : 0 : BIO_printf(bio_err," -noout no output\n");
264 : 0 : goto end;
265 : : }
266 : :
267 : 0 : ERR_load_crypto_strings();
268 : :
269 : : #ifndef OPENSSL_NO_ENGINE
270 : 0 : setup_engine(bio_err, engine, 0);
271 : : #endif
272 : :
273 [ # # ][ # # ]: 0 : if (g && !num)
274 : 0 : num = DEFBITS;
275 : :
276 : : #ifndef OPENSSL_NO_DSA
277 [ # # ]: 0 : if (dsaparam)
278 : : {
279 [ # # ]: 0 : if (g)
280 : : {
281 : 0 : BIO_printf(bio_err, "generator may not be chosen for DSA parameters\n");
282 : 0 : goto end;
283 : : }
284 : : }
285 : : else
286 : : #endif
287 : : {
288 : : /* DH parameters */
289 [ # # ][ # # ]: 0 : if (num && !g)
290 : 0 : g = 2;
291 : : }
292 : :
293 [ # # ]: 0 : if(num) {
294 : :
295 : : BN_GENCB cb;
296 : 0 : BN_GENCB_set(&cb, dh_cb, bio_err);
297 [ # # ][ # # ]: 0 : if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL)
298 : : {
299 : 0 : BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
300 : : }
301 [ # # ]: 0 : if (inrand != NULL)
302 : 0 : BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
303 : : app_RAND_load_files(inrand));
304 : :
305 : : #ifndef OPENSSL_NO_DSA
306 [ # # ]: 0 : if (dsaparam)
307 : : {
308 : 0 : DSA *dsa = DSA_new();
309 : :
310 : 0 : BIO_printf(bio_err,"Generating DSA parameters, %d bit long prime\n",num);
311 [ # # ][ # # ]: 0 : if(!dsa || !DSA_generate_parameters_ex(dsa, num,
312 : : NULL, 0, NULL, NULL, &cb))
313 : : {
314 [ # # ]: 0 : if(dsa) DSA_free(dsa);
315 : 0 : ERR_print_errors(bio_err);
316 : 0 : goto end;
317 : : }
318 : :
319 : 0 : dh = DSA_dup_DH(dsa);
320 : 0 : DSA_free(dsa);
321 [ # # ]: 0 : if (dh == NULL)
322 : : {
323 : 0 : ERR_print_errors(bio_err);
324 : 0 : goto end;
325 : : }
326 : : }
327 : : else
328 : : #endif
329 : : {
330 : 0 : dh = DH_new();
331 : 0 : BIO_printf(bio_err,"Generating DH parameters, %d bit long safe prime, generator %d\n",num,g);
332 : 0 : BIO_printf(bio_err,"This is going to take a long time\n");
333 [ # # ][ # # ]: 0 : if(!dh || !DH_generate_parameters_ex(dh, num, g, &cb))
334 : : {
335 : 0 : ERR_print_errors(bio_err);
336 : 0 : goto end;
337 : : }
338 : : }
339 : :
340 : 0 : app_RAND_write_file(NULL, bio_err);
341 : : } else {
342 : :
343 : 0 : in=BIO_new(BIO_s_file());
344 [ # # ]: 0 : if (in == NULL)
345 : : {
346 : 0 : ERR_print_errors(bio_err);
347 : 0 : goto end;
348 : : }
349 [ # # ]: 0 : if (infile == NULL)
350 : 0 : BIO_set_fp(in,stdin,BIO_NOCLOSE);
351 : : else
352 : : {
353 [ # # ]: 0 : if (BIO_read_filename(in,infile) <= 0)
354 : : {
355 : 0 : perror(infile);
356 : 0 : goto end;
357 : : }
358 : : }
359 : :
360 [ # # ]: 0 : if (informat != FORMAT_ASN1 && informat != FORMAT_PEM)
361 : : {
362 : 0 : BIO_printf(bio_err,"bad input format specified\n");
363 : 0 : goto end;
364 : : }
365 : :
366 : : #ifndef OPENSSL_NO_DSA
367 [ # # ]: 0 : if (dsaparam)
368 : : {
369 : : DSA *dsa;
370 : :
371 [ # # ]: 0 : if (informat == FORMAT_ASN1)
372 : 0 : dsa=d2i_DSAparams_bio(in,NULL);
373 : : else /* informat == FORMAT_PEM */
374 : 0 : dsa=PEM_read_bio_DSAparams(in,NULL,NULL,NULL);
375 : :
376 [ # # ]: 0 : if (dsa == NULL)
377 : : {
378 : 0 : BIO_printf(bio_err,"unable to load DSA parameters\n");
379 : 0 : ERR_print_errors(bio_err);
380 : 0 : goto end;
381 : : }
382 : :
383 : 0 : dh = DSA_dup_DH(dsa);
384 : 0 : DSA_free(dsa);
385 [ # # ]: 0 : if (dh == NULL)
386 : : {
387 : 0 : ERR_print_errors(bio_err);
388 : 0 : goto end;
389 : : }
390 : : }
391 : : else
392 : : #endif
393 : : {
394 [ # # ]: 0 : if (informat == FORMAT_ASN1)
395 : 0 : dh=d2i_DHparams_bio(in,NULL);
396 : : else /* informat == FORMAT_PEM */
397 : 0 : dh=PEM_read_bio_DHparams(in,NULL,NULL,NULL);
398 : :
399 [ # # ]: 0 : if (dh == NULL)
400 : : {
401 : 0 : BIO_printf(bio_err,"unable to load DH parameters\n");
402 : 0 : ERR_print_errors(bio_err);
403 : 0 : goto end;
404 : : }
405 : : }
406 : :
407 : : /* dh != NULL */
408 : : }
409 : :
410 : 0 : out=BIO_new(BIO_s_file());
411 [ # # ]: 0 : if (out == NULL)
412 : : {
413 : 0 : ERR_print_errors(bio_err);
414 : 0 : goto end;
415 : : }
416 [ # # ]: 0 : if (outfile == NULL)
417 : : {
418 : 0 : BIO_set_fp(out,stdout,BIO_NOCLOSE);
419 : : #ifdef OPENSSL_SYS_VMS
420 : : {
421 : : BIO *tmpbio = BIO_new(BIO_f_linebuffer());
422 : : out = BIO_push(tmpbio, out);
423 : : }
424 : : #endif
425 : : }
426 : : else
427 : : {
428 [ # # ]: 0 : if (BIO_write_filename(out,outfile) <= 0)
429 : : {
430 : 0 : perror(outfile);
431 : 0 : goto end;
432 : : }
433 : : }
434 : :
435 : :
436 [ # # ]: 0 : if (text)
437 : : {
438 : 0 : DHparams_print(out,dh);
439 : : }
440 : :
441 [ # # ]: 0 : if (check)
442 : : {
443 [ # # ]: 0 : if (!DH_check(dh,&i))
444 : : {
445 : 0 : ERR_print_errors(bio_err);
446 : 0 : goto end;
447 : : }
448 [ # # ]: 0 : if (i & DH_CHECK_P_NOT_PRIME)
449 : : printf("p value is not prime\n");
450 [ # # ]: 0 : if (i & DH_CHECK_P_NOT_SAFE_PRIME)
451 : : printf("p value is not a safe prime\n");
452 [ # # ]: 0 : if (i & DH_UNABLE_TO_CHECK_GENERATOR)
453 : : printf("unable to check the generator value\n");
454 [ # # ]: 0 : if (i & DH_NOT_SUITABLE_GENERATOR)
455 : : printf("the g value is not a generator\n");
456 [ # # ]: 0 : if (i == 0)
457 : : printf("DH parameters appear to be ok.\n");
458 : : }
459 [ # # ]: 0 : if (C)
460 : : {
461 : : unsigned char *data;
462 : : int len,l,bits;
463 : :
464 : 0 : len=BN_num_bytes(dh->p);
465 : 0 : bits=BN_num_bits(dh->p);
466 : 0 : data=(unsigned char *)OPENSSL_malloc(len);
467 [ # # ]: 0 : if (data == NULL)
468 : : {
469 : 0 : perror("OPENSSL_malloc");
470 : 0 : goto end;
471 : : }
472 : : printf("#ifndef HEADER_DH_H\n"
473 : : "#include <openssl/dh.h>\n"
474 : : "#endif\n");
475 : : printf("DH *get_dh%d()\n\t{\n",bits);
476 : :
477 : 0 : l=BN_bn2bin(dh->p,data);
478 : : printf("\tstatic unsigned char dh%d_p[]={",bits);
479 [ # # ]: 0 : for (i=0; i<l; i++)
480 : : {
481 [ # # ]: 0 : if ((i%12) == 0) printf("\n\t\t");
482 : 0 : printf("0x%02X,",data[i]);
483 : : }
484 : : printf("\n\t\t};\n");
485 : :
486 : 0 : l=BN_bn2bin(dh->g,data);
487 : : printf("\tstatic unsigned char dh%d_g[]={",bits);
488 [ # # ]: 0 : for (i=0; i<l; i++)
489 : : {
490 [ # # ]: 0 : if ((i%12) == 0) printf("\n\t\t");
491 : 0 : printf("0x%02X,",data[i]);
492 : : }
493 : : printf("\n\t\t};\n");
494 : :
495 : : printf("\tDH *dh;\n\n");
496 : : printf("\tif ((dh=DH_new()) == NULL) return(NULL);\n");
497 : : printf("\tdh->p=BN_bin2bn(dh%d_p,sizeof(dh%d_p),NULL);\n",
498 : : bits,bits);
499 : : printf("\tdh->g=BN_bin2bn(dh%d_g,sizeof(dh%d_g),NULL);\n",
500 : : bits,bits);
501 : : printf("\tif ((dh->p == NULL) || (dh->g == NULL))\n");
502 : : printf("\t\t{ DH_free(dh); return(NULL); }\n");
503 [ # # ]: 0 : if (dh->length)
504 : 0 : printf("\tdh->length = %ld;\n", dh->length);
505 : : printf("\treturn(dh);\n\t}\n");
506 : 0 : OPENSSL_free(data);
507 : : }
508 : :
509 : :
510 [ # # ]: 0 : if (!noout)
511 : : {
512 [ # # ]: 0 : if (outformat == FORMAT_ASN1)
513 : 0 : i=i2d_DHparams_bio(out,dh);
514 [ # # ]: 0 : else if (outformat == FORMAT_PEM)
515 : : {
516 [ # # ]: 0 : if (dh->q)
517 : 0 : i=PEM_write_bio_DHxparams(out,dh);
518 : : else
519 : 0 : i=PEM_write_bio_DHparams(out,dh);
520 : : }
521 : : else {
522 : 0 : BIO_printf(bio_err,"bad output format specified for outfile\n");
523 : 0 : goto end;
524 : : }
525 [ # # ]: 0 : if (!i)
526 : : {
527 : 0 : BIO_printf(bio_err,"unable to write DH parameters\n");
528 : 0 : ERR_print_errors(bio_err);
529 : 0 : goto end;
530 : : }
531 : : }
532 : : ret=0;
533 : : end:
534 [ # # ]: 0 : if (in != NULL) BIO_free(in);
535 [ # # ]: 0 : if (out != NULL) BIO_free_all(out);
536 [ # # ]: 0 : if (dh != NULL) DH_free(dh);
537 : : apps_shutdown();
538 : 0 : OPENSSL_EXIT(ret);
539 : : }
540 : :
541 : : /* dh_cb is identical to dsa_cb in apps/dsaparam.c */
542 : 0 : static int MS_CALLBACK dh_cb(int p, int n, BN_GENCB *cb)
543 : : {
544 : 0 : char c='*';
545 : :
546 [ # # ]: 0 : if (p == 0) c='.';
547 [ # # ]: 0 : if (p == 1) c='+';
548 [ # # ]: 0 : if (p == 2) c='*';
549 [ # # ]: 0 : if (p == 3) c='\n';
550 : 0 : BIO_write(cb->arg,&c,1);
551 : 0 : (void)BIO_flush(cb->arg);
552 : : #ifdef LINT
553 : : p=n;
554 : : #endif
555 : 0 : return 1;
556 : : }
557 : :
558 : : #else /* !OPENSSL_NO_DH */
559 : :
560 : : # if PEDANTIC
561 : : static void *dummy=&dummy;
562 : : # endif
563 : :
564 : : #endif
|