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 2048 |
134 |
|
135 |
/*- |
136 |
* -inform arg - input format - default PEM (DER or PEM) |
137 |
* -outform arg - output format - default PEM |
138 |
* -in arg - input file - default stdin |
139 |
* -out arg - output file - default stdout |
140 |
* -dsaparam - read or generate DSA parameters, convert to DH |
141 |
* -check - check the parameters are ok |
142 |
* -noout |
143 |
* -text |
144 |
* -C |
145 |
*/ |
146 |
|
147 |
static int MS_CALLBACK dh_cb(int p, int n, BN_GENCB *cb); |
148 |
|
149 |
int MAIN(int, char **); |
150 |
|
151 |
int MAIN(int argc, char **argv) |
152 |
{ |
153 |
DH *dh = NULL; |
154 |
int i, badops = 0, text = 0; |
155 |
# ifndef OPENSSL_NO_DSA |
156 |
int dsaparam = 0; |
157 |
# endif |
158 |
BIO *in = NULL, *out = NULL; |
159 |
int informat, outformat, check = 0, noout = 0, C = 0, ret = 1; |
160 |
char *infile, *outfile, *prog; |
161 |
char *inrand = NULL; |
162 |
char *engine = NULL; |
163 |
ENGINE *e = NULL; |
164 |
int num = 0, g = 0; |
165 |
|
166 |
apps_startup(); |
167 |
|
168 |
if (bio_err == NULL) |
169 |
if ((bio_err = BIO_new(BIO_s_file())) != NULL) |
170 |
BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT); |
171 |
|
172 |
if (!load_config(bio_err, NULL)) |
173 |
goto end; |
174 |
|
175 |
infile = NULL; |
176 |
outfile = NULL; |
177 |
informat = FORMAT_PEM; |
178 |
outformat = FORMAT_PEM; |
179 |
|
180 |
prog = argv[0]; |
181 |
argc--; |
182 |
argv++; |
183 |
while (argc >= 1) { |
184 |
if (strcmp(*argv, "-inform") == 0) { |
185 |
if (--argc < 1) |
186 |
goto bad; |
187 |
informat = str2fmt(*(++argv)); |
188 |
} else if (strcmp(*argv, "-outform") == 0) { |
189 |
if (--argc < 1) |
190 |
goto bad; |
191 |
outformat = str2fmt(*(++argv)); |
192 |
} else if (strcmp(*argv, "-in") == 0) { |
193 |
if (--argc < 1) |
194 |
goto bad; |
195 |
infile = *(++argv); |
196 |
} else if (strcmp(*argv, "-out") == 0) { |
197 |
if (--argc < 1) |
198 |
goto bad; |
199 |
outfile = *(++argv); |
200 |
} |
201 |
# ifndef OPENSSL_NO_ENGINE |
202 |
else if (strcmp(*argv, "-engine") == 0) { |
203 |
if (--argc < 1) |
204 |
goto bad; |
205 |
engine = *(++argv); |
206 |
} |
207 |
# endif |
208 |
else if (strcmp(*argv, "-check") == 0) |
209 |
check = 1; |
210 |
else if (strcmp(*argv, "-text") == 0) |
211 |
text = 1; |
212 |
# ifndef OPENSSL_NO_DSA |
213 |
else if (strcmp(*argv, "-dsaparam") == 0) |
214 |
dsaparam = 1; |
215 |
# endif |
216 |
else if (strcmp(*argv, "-C") == 0) |
217 |
C = 1; |
218 |
else if (strcmp(*argv, "-noout") == 0) |
219 |
noout = 1; |
220 |
else if (strcmp(*argv, "-2") == 0) |
221 |
g = 2; |
222 |
else if (strcmp(*argv, "-5") == 0) |
223 |
g = 5; |
224 |
else if (strcmp(*argv, "-rand") == 0) { |
225 |
if (--argc < 1) |
226 |
goto bad; |
227 |
inrand = *(++argv); |
228 |
} else if (((sscanf(*argv, "%d", &num) == 0) || (num <= 0))) |
229 |
goto bad; |
230 |
argv++; |
231 |
argc--; |
232 |
} |
233 |
|
234 |
if (badops) { |
235 |
bad: |
236 |
BIO_printf(bio_err, "%s [options] [numbits]\n", prog); |
237 |
BIO_printf(bio_err, "where options are\n"); |
238 |
BIO_printf(bio_err, " -inform arg input format - one of DER PEM\n"); |
239 |
BIO_printf(bio_err, |
240 |
" -outform arg output format - one of DER PEM\n"); |
241 |
BIO_printf(bio_err, " -in arg input file\n"); |
242 |
BIO_printf(bio_err, " -out arg output file\n"); |
243 |
# ifndef OPENSSL_NO_DSA |
244 |
BIO_printf(bio_err, |
245 |
" -dsaparam read or generate DSA parameters, convert to DH\n"); |
246 |
# endif |
247 |
BIO_printf(bio_err, " -check check the DH parameters\n"); |
248 |
BIO_printf(bio_err, |
249 |
" -text print a text form of the DH parameters\n"); |
250 |
BIO_printf(bio_err, " -C Output C code\n"); |
251 |
BIO_printf(bio_err, |
252 |
" -2 generate parameters using 2 as the generator value\n"); |
253 |
BIO_printf(bio_err, |
254 |
" -5 generate parameters using 5 as the generator value\n"); |
255 |
BIO_printf(bio_err, |
256 |
" numbits number of bits in to generate (default 2048)\n"); |
257 |
# ifndef OPENSSL_NO_ENGINE |
258 |
BIO_printf(bio_err, |
259 |
" -engine e use engine e, possibly a hardware device.\n"); |
260 |
# endif |
261 |
BIO_printf(bio_err, " -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, |
262 |
LIST_SEPARATOR_CHAR); |
263 |
BIO_printf(bio_err, |
264 |
" - load the file (or the files in the directory) into\n"); |
265 |
BIO_printf(bio_err, " the random number generator\n"); |
266 |
BIO_printf(bio_err, " -noout no output\n"); |
267 |
goto end; |
268 |
} |
269 |
|
270 |
ERR_load_crypto_strings(); |
271 |
|
272 |
e = setup_engine(bio_err, engine, 0); |
273 |
|
274 |
if (g && !num) |
275 |
num = DEFBITS; |
276 |
|
277 |
# ifndef OPENSSL_NO_DSA |
278 |
if (dsaparam) { |
279 |
if (g) { |
280 |
BIO_printf(bio_err, |
281 |
"generator may not be chosen for DSA parameters\n"); |
282 |
goto end; |
283 |
} |
284 |
} else |
285 |
# endif |
286 |
{ |
287 |
/* DH parameters */ |
288 |
if (num && !g) |
289 |
g = 2; |
290 |
} |
291 |
|
292 |
if (num) { |
293 |
|
294 |
BN_GENCB cb; |
295 |
BN_GENCB_set(&cb, dh_cb, bio_err); |
296 |
if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL) { |
297 |
BIO_printf(bio_err, |
298 |
"warning, not much extra random data, consider using the -rand option\n"); |
299 |
} |
300 |
if (inrand != NULL) |
301 |
BIO_printf(bio_err, "%ld semi-random bytes loaded\n", |
302 |
app_RAND_load_files(inrand)); |
303 |
|
304 |
# ifndef OPENSSL_NO_DSA |
305 |
if (dsaparam) { |
306 |
DSA *dsa = DSA_new(); |
307 |
|
308 |
BIO_printf(bio_err, |
309 |
"Generating DSA parameters, %d bit long prime\n", num); |
310 |
if (!dsa |
311 |
|| !DSA_generate_parameters_ex(dsa, num, NULL, 0, NULL, NULL, |
312 |
&cb)) { |
313 |
if (dsa) |
314 |
DSA_free(dsa); |
315 |
ERR_print_errors(bio_err); |
316 |
goto end; |
317 |
} |
318 |
|
319 |
dh = DSA_dup_DH(dsa); |
320 |
DSA_free(dsa); |
321 |
if (dh == NULL) { |
322 |
ERR_print_errors(bio_err); |
323 |
goto end; |
324 |
} |
325 |
} else |
326 |
# endif |
327 |
{ |
328 |
dh = DH_new(); |
329 |
BIO_printf(bio_err, |
330 |
"Generating DH parameters, %d bit long safe prime, generator %d\n", |
331 |
num, g); |
332 |
BIO_printf(bio_err, "This is going to take a long time\n"); |
333 |
if (!dh || !DH_generate_parameters_ex(dh, num, g, &cb)) { |
334 |
ERR_print_errors(bio_err); |
335 |
goto end; |
336 |
} |
337 |
} |
338 |
|
339 |
app_RAND_write_file(NULL, bio_err); |
340 |
} else { |
341 |
|
342 |
in = BIO_new(BIO_s_file()); |
343 |
if (in == NULL) { |
344 |
ERR_print_errors(bio_err); |
345 |
goto end; |
346 |
} |
347 |
if (infile == NULL) |
348 |
BIO_set_fp(in, stdin, BIO_NOCLOSE); |
349 |
else { |
350 |
if (BIO_read_filename(in, infile) <= 0) { |
351 |
perror(infile); |
352 |
goto end; |
353 |
} |
354 |
} |
355 |
|
356 |
if (informat != FORMAT_ASN1 && informat != FORMAT_PEM) { |
357 |
BIO_printf(bio_err, "bad input format specified\n"); |
358 |
goto end; |
359 |
} |
360 |
# ifndef OPENSSL_NO_DSA |
361 |
if (dsaparam) { |
362 |
DSA *dsa; |
363 |
|
364 |
if (informat == FORMAT_ASN1) |
365 |
dsa = d2i_DSAparams_bio(in, NULL); |
366 |
else /* informat == FORMAT_PEM */ |
367 |
dsa = PEM_read_bio_DSAparams(in, NULL, NULL, NULL); |
368 |
|
369 |
if (dsa == NULL) { |
370 |
BIO_printf(bio_err, "unable to load DSA parameters\n"); |
371 |
ERR_print_errors(bio_err); |
372 |
goto end; |
373 |
} |
374 |
|
375 |
dh = DSA_dup_DH(dsa); |
376 |
DSA_free(dsa); |
377 |
if (dh == NULL) { |
378 |
ERR_print_errors(bio_err); |
379 |
goto end; |
380 |
} |
381 |
} else |
382 |
# endif |
383 |
{ |
384 |
if (informat == FORMAT_ASN1) { |
385 |
/* |
386 |
* We have no PEM header to determine what type of DH params it |
387 |
* is. We'll just try both. |
388 |
*/ |
389 |
dh = d2i_DHparams_bio(in, NULL); |
390 |
/* BIO_reset() returns 0 for success for file BIOs only!!! */ |
391 |
if (dh == NULL && BIO_reset(in) == 0) |
392 |
dh = d2i_DHxparams_bio(in, NULL); |
393 |
} else { |
394 |
/* informat == FORMAT_PEM */ |
395 |
dh = PEM_read_bio_DHparams(in, NULL, NULL, NULL); |
396 |
} |
397 |
|
398 |
if (dh == NULL) { |
399 |
BIO_printf(bio_err, "unable to load DH parameters\n"); |
400 |
ERR_print_errors(bio_err); |
401 |
goto end; |
402 |
} |
403 |
} |
404 |
|
405 |
/* dh != NULL */ |
406 |
} |
407 |
|
408 |
out = BIO_new(BIO_s_file()); |
409 |
if (out == NULL) { |
410 |
ERR_print_errors(bio_err); |
411 |
goto end; |
412 |
} |
413 |
if (outfile == NULL) { |
414 |
BIO_set_fp(out, stdout, BIO_NOCLOSE); |
415 |
# ifdef OPENSSL_SYS_VMS |
416 |
{ |
417 |
BIO *tmpbio = BIO_new(BIO_f_linebuffer()); |
418 |
out = BIO_push(tmpbio, out); |
419 |
} |
420 |
# endif |
421 |
} else { |
422 |
if (BIO_write_filename(out, outfile) <= 0) { |
423 |
perror(outfile); |
424 |
goto end; |
425 |
} |
426 |
} |
427 |
|
428 |
if (text) { |
429 |
DHparams_print(out, dh); |
430 |
} |
431 |
|
432 |
if (check) { |
433 |
if (!DH_check(dh, &i)) { |
434 |
ERR_print_errors(bio_err); |
435 |
goto end; |
436 |
} |
437 |
if (i & DH_CHECK_P_NOT_PRIME) |
438 |
printf("p value is not prime\n"); |
439 |
if (i & DH_CHECK_P_NOT_SAFE_PRIME) |
440 |
printf("p value is not a safe prime\n"); |
441 |
if (i & DH_UNABLE_TO_CHECK_GENERATOR) |
442 |
printf("unable to check the generator value\n"); |
443 |
if (i & DH_NOT_SUITABLE_GENERATOR) |
444 |
printf("the g value is not a generator\n"); |
445 |
if (i == 0) |
446 |
printf("DH parameters appear to be ok.\n"); |
447 |
} |
448 |
if (C) { |
449 |
unsigned char *data; |
450 |
int len, l, bits; |
451 |
|
452 |
len = BN_num_bytes(dh->p); |
453 |
bits = BN_num_bits(dh->p); |
454 |
data = (unsigned char *)OPENSSL_malloc(len); |
455 |
if (data == NULL) { |
456 |
perror("OPENSSL_malloc"); |
457 |
goto end; |
458 |
} |
459 |
printf("#ifndef HEADER_DH_H\n" |
460 |
"#include <openssl/dh.h>\n" "#endif\n"); |
461 |
printf("DH *get_dh%d()\n\t{\n", bits); |
462 |
|
463 |
l = BN_bn2bin(dh->p, data); |
464 |
printf("\tstatic unsigned char dh%d_p[]={", bits); |
465 |
for (i = 0; i < l; i++) { |
466 |
if ((i % 12) == 0) |
467 |
printf("\n\t\t"); |
468 |
printf("0x%02X,", data[i]); |
469 |
} |
470 |
printf("\n\t\t};\n"); |
471 |
|
472 |
l = BN_bn2bin(dh->g, data); |
473 |
printf("\tstatic unsigned char dh%d_g[]={", bits); |
474 |
for (i = 0; i < l; i++) { |
475 |
if ((i % 12) == 0) |
476 |
printf("\n\t\t"); |
477 |
printf("0x%02X,", data[i]); |
478 |
} |
479 |
printf("\n\t\t};\n"); |
480 |
|
481 |
printf("\tDH *dh;\n\n"); |
482 |
printf("\tif ((dh=DH_new()) == NULL) return(NULL);\n"); |
483 |
printf("\tdh->p=BN_bin2bn(dh%d_p,sizeof(dh%d_p),NULL);\n", |
484 |
bits, bits); |
485 |
printf("\tdh->g=BN_bin2bn(dh%d_g,sizeof(dh%d_g),NULL);\n", |
486 |
bits, bits); |
487 |
printf("\tif ((dh->p == NULL) || (dh->g == NULL))\n"); |
488 |
printf("\t\t{ DH_free(dh); return(NULL); }\n"); |
489 |
if (dh->length) |
490 |
printf("\tdh->length = %ld;\n", dh->length); |
491 |
printf("\treturn(dh);\n\t}\n"); |
492 |
OPENSSL_free(data); |
493 |
} |
494 |
|
495 |
if (!noout) { |
496 |
if (outformat == FORMAT_ASN1) { |
497 |
if (dh->q != NULL) |
498 |
i = i2d_DHxparams_bio(out, dh); |
499 |
else |
500 |
i = i2d_DHparams_bio(out, dh); |
501 |
} else if (outformat == FORMAT_PEM) { |
502 |
if (dh->q != NULL) |
503 |
i = PEM_write_bio_DHxparams(out, dh); |
504 |
else |
505 |
i = PEM_write_bio_DHparams(out, dh); |
506 |
} else { |
507 |
BIO_printf(bio_err, "bad output format specified for outfile\n"); |
508 |
goto end; |
509 |
} |
510 |
if (!i) { |
511 |
BIO_printf(bio_err, "unable to write DH parameters\n"); |
512 |
ERR_print_errors(bio_err); |
513 |
goto end; |
514 |
} |
515 |
} |
516 |
ret = 0; |
517 |
end: |
518 |
if (in != NULL) |
519 |
BIO_free(in); |
520 |
if (out != NULL) |
521 |
BIO_free_all(out); |
522 |
if (dh != NULL) |
523 |
DH_free(dh); |
524 |
release_engine(e); |
525 |
apps_shutdown(); |
526 |
OPENSSL_EXIT(ret); |
527 |
} |
528 |
|
529 |
/* dh_cb is identical to dsa_cb in apps/dsaparam.c */ |
530 |
static int MS_CALLBACK dh_cb(int p, int n, BN_GENCB *cb) |
531 |
{ |
532 |
char c = '*'; |
533 |
|
534 |
if (p == 0) |
535 |
c = '.'; |
536 |
if (p == 1) |
537 |
c = '+'; |
538 |
if (p == 2) |
539 |
c = '*'; |
540 |
if (p == 3) |
541 |
c = '\n'; |
542 |
BIO_write(cb->arg, &c, 1); |
543 |
(void)BIO_flush(cb->arg); |
544 |
# ifdef LINT |
545 |
p = n; |
546 |
# endif |
547 |
return 1; |
548 |
} |
549 |
|
550 |
#else /* !OPENSSL_NO_DH */ |
551 |
|
552 |
# if PEDANTIC |
553 |
static void *dummy = &dummy; |
554 |
# endif |
555 |
|
556 |
#endif |