diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/t_pkey.c')
-rw-r--r-- | src/lib/libcrypto/asn1/t_pkey.c | 548 |
1 files changed, 500 insertions, 48 deletions
diff --git a/src/lib/libcrypto/asn1/t_pkey.c b/src/lib/libcrypto/asn1/t_pkey.c index d15006e654..afb95d6712 100644 --- a/src/lib/libcrypto/asn1/t_pkey.c +++ b/src/lib/libcrypto/asn1/t_pkey.c | |||
@@ -55,9 +55,15 @@ | |||
55 | * copied and put under another distribution licence | 55 | * copied and put under another distribution licence |
56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
57 | */ | 57 | */ |
58 | /* ==================================================================== | ||
59 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | ||
60 | * Binary polynomial ECC support in OpenSSL originally developed by | ||
61 | * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. | ||
62 | */ | ||
58 | 63 | ||
59 | #include <stdio.h> | 64 | #include <stdio.h> |
60 | #include "cryptlib.h" | 65 | #include "cryptlib.h" |
66 | #include <openssl/objects.h> | ||
61 | #include <openssl/buffer.h> | 67 | #include <openssl/buffer.h> |
62 | #include <openssl/bn.h> | 68 | #include <openssl/bn.h> |
63 | #ifndef OPENSSL_NO_RSA | 69 | #ifndef OPENSSL_NO_RSA |
@@ -69,26 +75,33 @@ | |||
69 | #ifndef OPENSSL_NO_DSA | 75 | #ifndef OPENSSL_NO_DSA |
70 | #include <openssl/dsa.h> | 76 | #include <openssl/dsa.h> |
71 | #endif | 77 | #endif |
78 | #ifndef OPENSSL_NO_EC | ||
79 | #include <openssl/ec.h> | ||
80 | #endif | ||
72 | 81 | ||
73 | static int print(BIO *fp,const char *str,BIGNUM *num, | 82 | static int print(BIO *fp,const char *str, const BIGNUM *num, |
74 | unsigned char *buf,int off); | 83 | unsigned char *buf,int off); |
84 | #ifndef OPENSSL_NO_EC | ||
85 | static int print_bin(BIO *fp, const char *str, const unsigned char *num, | ||
86 | size_t len, int off); | ||
87 | #endif | ||
75 | #ifndef OPENSSL_NO_RSA | 88 | #ifndef OPENSSL_NO_RSA |
76 | #ifndef OPENSSL_NO_FP_API | 89 | #ifndef OPENSSL_NO_FP_API |
77 | int RSA_print_fp(FILE *fp, const RSA *x, int off) | 90 | int RSA_print_fp(FILE *fp, const RSA *x, int off) |
78 | { | 91 | { |
79 | BIO *b; | 92 | BIO *b; |
80 | int ret; | 93 | int ret; |
81 | 94 | ||
82 | if ((b=BIO_new(BIO_s_file())) == NULL) | 95 | if ((b=BIO_new(BIO_s_file())) == NULL) |
83 | { | 96 | { |
84 | RSAerr(RSA_F_RSA_PRINT_FP,ERR_R_BUF_LIB); | 97 | RSAerr(RSA_F_RSA_PRINT_FP,ERR_R_BUF_LIB); |
85 | return(0); | 98 | return(0); |
86 | } | 99 | } |
87 | BIO_set_fp(b,fp,BIO_NOCLOSE); | 100 | BIO_set_fp(b,fp,BIO_NOCLOSE); |
88 | ret=RSA_print(b,x,off); | 101 | ret=RSA_print(b,x,off); |
89 | BIO_free(b); | 102 | BIO_free(b); |
90 | return(ret); | 103 | return(ret); |
91 | } | 104 | } |
92 | #endif | 105 | #endif |
93 | 106 | ||
94 | int RSA_print(BIO *bp, const RSA *x, int off) | 107 | int RSA_print(BIO *bp, const RSA *x, int off) |
@@ -96,7 +109,7 @@ int RSA_print(BIO *bp, const RSA *x, int off) | |||
96 | char str[128]; | 109 | char str[128]; |
97 | const char *s; | 110 | const char *s; |
98 | unsigned char *m=NULL; | 111 | unsigned char *m=NULL; |
99 | int ret=0; | 112 | int ret=0, mod_len = 0; |
100 | size_t buf_len=0, i; | 113 | size_t buf_len=0, i; |
101 | 114 | ||
102 | if (x->n) | 115 | if (x->n) |
@@ -130,27 +143,37 @@ int RSA_print(BIO *bp, const RSA *x, int off) | |||
130 | goto err; | 143 | goto err; |
131 | } | 144 | } |
132 | 145 | ||
146 | if (x->n != NULL) | ||
147 | mod_len = BN_num_bits(x->n); | ||
148 | |||
133 | if (x->d != NULL) | 149 | if (x->d != NULL) |
134 | { | 150 | { |
135 | if(!BIO_indent(bp,off,128)) | 151 | if(!BIO_indent(bp,off,128)) |
136 | goto err; | 152 | goto err; |
137 | if (BIO_printf(bp,"Private-Key: (%d bit)\n",BN_num_bits(x->n)) | 153 | if (BIO_printf(bp,"Private-Key: (%d bit)\n", mod_len) |
138 | <= 0) goto err; | 154 | <= 0) goto err; |
139 | } | 155 | } |
140 | 156 | ||
141 | if (x->d == NULL) | 157 | if (x->d == NULL) |
142 | BIO_snprintf(str,sizeof str,"Modulus (%d bit):",BN_num_bits(x->n)); | 158 | BIO_snprintf(str,sizeof str,"Modulus (%d bit):", mod_len); |
143 | else | 159 | else |
144 | BUF_strlcpy(str,"modulus:",sizeof str); | 160 | BUF_strlcpy(str,"modulus:",sizeof str); |
145 | if (!print(bp,str,x->n,m,off)) goto err; | 161 | if (!print(bp,str,x->n,m,off)) goto err; |
146 | s=(x->d == NULL)?"Exponent:":"publicExponent:"; | 162 | s=(x->d == NULL)?"Exponent:":"publicExponent:"; |
147 | if (!print(bp,s,x->e,m,off)) goto err; | 163 | if ((x->e != NULL) && !print(bp,s,x->e,m,off)) |
148 | if (!print(bp,"privateExponent:",x->d,m,off)) goto err; | 164 | goto err; |
149 | if (!print(bp,"prime1:",x->p,m,off)) goto err; | 165 | if ((x->d != NULL) && !print(bp,"privateExponent:",x->d,m,off)) |
150 | if (!print(bp,"prime2:",x->q,m,off)) goto err; | 166 | goto err; |
151 | if (!print(bp,"exponent1:",x->dmp1,m,off)) goto err; | 167 | if ((x->p != NULL) && !print(bp,"prime1:",x->p,m,off)) |
152 | if (!print(bp,"exponent2:",x->dmq1,m,off)) goto err; | 168 | goto err; |
153 | if (!print(bp,"coefficient:",x->iqmp,m,off)) goto err; | 169 | if ((x->q != NULL) && !print(bp,"prime2:",x->q,m,off)) |
170 | goto err; | ||
171 | if ((x->dmp1 != NULL) && !print(bp,"exponent1:",x->dmp1,m,off)) | ||
172 | goto err; | ||
173 | if ((x->dmq1 != NULL) && !print(bp,"exponent2:",x->dmq1,m,off)) | ||
174 | goto err; | ||
175 | if ((x->iqmp != NULL) && !print(bp,"coefficient:",x->iqmp,m,off)) | ||
176 | goto err; | ||
154 | ret=1; | 177 | ret=1; |
155 | err: | 178 | err: |
156 | if (m != NULL) OPENSSL_free(m); | 179 | if (m != NULL) OPENSSL_free(m); |
@@ -185,6 +208,11 @@ int DSA_print(BIO *bp, const DSA *x, int off) | |||
185 | 208 | ||
186 | if (x->p) | 209 | if (x->p) |
187 | buf_len = (size_t)BN_num_bytes(x->p); | 210 | buf_len = (size_t)BN_num_bytes(x->p); |
211 | else | ||
212 | { | ||
213 | DSAerr(DSA_F_DSA_PRINT,DSA_R_MISSING_PARAMETERS); | ||
214 | goto err; | ||
215 | } | ||
188 | if (x->q) | 216 | if (x->q) |
189 | if (buf_len < (i = (size_t)BN_num_bytes(x->q))) | 217 | if (buf_len < (i = (size_t)BN_num_bytes(x->q))) |
190 | buf_len = i; | 218 | buf_len = i; |
@@ -227,16 +255,334 @@ err: | |||
227 | } | 255 | } |
228 | #endif /* !OPENSSL_NO_DSA */ | 256 | #endif /* !OPENSSL_NO_DSA */ |
229 | 257 | ||
230 | static int print(BIO *bp, const char *number, BIGNUM *num, unsigned char *buf, | 258 | #ifndef OPENSSL_NO_EC |
259 | #ifndef OPENSSL_NO_FP_API | ||
260 | int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off) | ||
261 | { | ||
262 | BIO *b; | ||
263 | int ret; | ||
264 | |||
265 | if ((b=BIO_new(BIO_s_file())) == NULL) | ||
266 | { | ||
267 | ECerr(EC_F_ECPKPARAMETERS_PRINT_FP,ERR_R_BUF_LIB); | ||
268 | return(0); | ||
269 | } | ||
270 | BIO_set_fp(b, fp, BIO_NOCLOSE); | ||
271 | ret = ECPKParameters_print(b, x, off); | ||
272 | BIO_free(b); | ||
273 | return(ret); | ||
274 | } | ||
275 | |||
276 | int EC_KEY_print_fp(FILE *fp, const EC_KEY *x, int off) | ||
277 | { | ||
278 | BIO *b; | ||
279 | int ret; | ||
280 | |||
281 | if ((b=BIO_new(BIO_s_file())) == NULL) | ||
282 | { | ||
283 | ECerr(EC_F_EC_KEY_PRINT_FP, ERR_R_BIO_LIB); | ||
284 | return(0); | ||
285 | } | ||
286 | BIO_set_fp(b, fp, BIO_NOCLOSE); | ||
287 | ret = EC_KEY_print(b, x, off); | ||
288 | BIO_free(b); | ||
289 | return(ret); | ||
290 | } | ||
291 | #endif | ||
292 | |||
293 | int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off) | ||
294 | { | ||
295 | unsigned char *buffer=NULL; | ||
296 | size_t buf_len=0, i; | ||
297 | int ret=0, reason=ERR_R_BIO_LIB; | ||
298 | BN_CTX *ctx=NULL; | ||
299 | const EC_POINT *point=NULL; | ||
300 | BIGNUM *p=NULL, *a=NULL, *b=NULL, *gen=NULL, | ||
301 | *order=NULL, *cofactor=NULL; | ||
302 | const unsigned char *seed; | ||
303 | size_t seed_len=0; | ||
304 | |||
305 | static const char *gen_compressed = "Generator (compressed):"; | ||
306 | static const char *gen_uncompressed = "Generator (uncompressed):"; | ||
307 | static const char *gen_hybrid = "Generator (hybrid):"; | ||
308 | |||
309 | if (!x) | ||
310 | { | ||
311 | reason = ERR_R_PASSED_NULL_PARAMETER; | ||
312 | goto err; | ||
313 | } | ||
314 | |||
315 | if (EC_GROUP_get_asn1_flag(x)) | ||
316 | { | ||
317 | /* the curve parameter are given by an asn1 OID */ | ||
318 | int nid; | ||
319 | |||
320 | if (!BIO_indent(bp, off, 128)) | ||
321 | goto err; | ||
322 | |||
323 | nid = EC_GROUP_get_curve_name(x); | ||
324 | if (nid == 0) | ||
325 | goto err; | ||
326 | |||
327 | if (BIO_printf(bp, "ASN1 OID: %s", OBJ_nid2sn(nid)) <= 0) | ||
328 | goto err; | ||
329 | if (BIO_printf(bp, "\n") <= 0) | ||
330 | goto err; | ||
331 | } | ||
332 | else | ||
333 | { | ||
334 | /* explicit parameters */ | ||
335 | int is_char_two = 0; | ||
336 | point_conversion_form_t form; | ||
337 | int tmp_nid = EC_METHOD_get_field_type(EC_GROUP_method_of(x)); | ||
338 | |||
339 | if (tmp_nid == NID_X9_62_characteristic_two_field) | ||
340 | is_char_two = 1; | ||
341 | |||
342 | if ((p = BN_new()) == NULL || (a = BN_new()) == NULL || | ||
343 | (b = BN_new()) == NULL || (order = BN_new()) == NULL || | ||
344 | (cofactor = BN_new()) == NULL) | ||
345 | { | ||
346 | reason = ERR_R_MALLOC_FAILURE; | ||
347 | goto err; | ||
348 | } | ||
349 | |||
350 | if (is_char_two) | ||
351 | { | ||
352 | if (!EC_GROUP_get_curve_GF2m(x, p, a, b, ctx)) | ||
353 | { | ||
354 | reason = ERR_R_EC_LIB; | ||
355 | goto err; | ||
356 | } | ||
357 | } | ||
358 | else /* prime field */ | ||
359 | { | ||
360 | if (!EC_GROUP_get_curve_GFp(x, p, a, b, ctx)) | ||
361 | { | ||
362 | reason = ERR_R_EC_LIB; | ||
363 | goto err; | ||
364 | } | ||
365 | } | ||
366 | |||
367 | if ((point = EC_GROUP_get0_generator(x)) == NULL) | ||
368 | { | ||
369 | reason = ERR_R_EC_LIB; | ||
370 | goto err; | ||
371 | } | ||
372 | if (!EC_GROUP_get_order(x, order, NULL) || | ||
373 | !EC_GROUP_get_cofactor(x, cofactor, NULL)) | ||
374 | { | ||
375 | reason = ERR_R_EC_LIB; | ||
376 | goto err; | ||
377 | } | ||
378 | |||
379 | form = EC_GROUP_get_point_conversion_form(x); | ||
380 | |||
381 | if ((gen = EC_POINT_point2bn(x, point, | ||
382 | form, NULL, ctx)) == NULL) | ||
383 | { | ||
384 | reason = ERR_R_EC_LIB; | ||
385 | goto err; | ||
386 | } | ||
387 | |||
388 | buf_len = (size_t)BN_num_bytes(p); | ||
389 | if (buf_len < (i = (size_t)BN_num_bytes(a))) | ||
390 | buf_len = i; | ||
391 | if (buf_len < (i = (size_t)BN_num_bytes(b))) | ||
392 | buf_len = i; | ||
393 | if (buf_len < (i = (size_t)BN_num_bytes(gen))) | ||
394 | buf_len = i; | ||
395 | if (buf_len < (i = (size_t)BN_num_bytes(order))) | ||
396 | buf_len = i; | ||
397 | if (buf_len < (i = (size_t)BN_num_bytes(cofactor))) | ||
398 | buf_len = i; | ||
399 | |||
400 | if ((seed = EC_GROUP_get0_seed(x)) != NULL) | ||
401 | seed_len = EC_GROUP_get_seed_len(x); | ||
402 | |||
403 | buf_len += 10; | ||
404 | if ((buffer = OPENSSL_malloc(buf_len)) == NULL) | ||
405 | { | ||
406 | reason = ERR_R_MALLOC_FAILURE; | ||
407 | goto err; | ||
408 | } | ||
409 | |||
410 | if (!BIO_indent(bp, off, 128)) | ||
411 | goto err; | ||
412 | |||
413 | /* print the 'short name' of the field type */ | ||
414 | if (BIO_printf(bp, "Field Type: %s\n", OBJ_nid2sn(tmp_nid)) | ||
415 | <= 0) | ||
416 | goto err; | ||
417 | |||
418 | if (is_char_two) | ||
419 | { | ||
420 | /* print the 'short name' of the base type OID */ | ||
421 | int basis_type = EC_GROUP_get_basis_type(x); | ||
422 | if (basis_type == 0) | ||
423 | goto err; | ||
424 | |||
425 | if (!BIO_indent(bp, off, 128)) | ||
426 | goto err; | ||
427 | |||
428 | if (BIO_printf(bp, "Basis Type: %s\n", | ||
429 | OBJ_nid2sn(basis_type)) <= 0) | ||
430 | goto err; | ||
431 | |||
432 | /* print the polynomial */ | ||
433 | if ((p != NULL) && !print(bp, "Polynomial:", p, buffer, | ||
434 | off)) | ||
435 | goto err; | ||
436 | } | ||
437 | else | ||
438 | { | ||
439 | if ((p != NULL) && !print(bp, "Prime:", p, buffer,off)) | ||
440 | goto err; | ||
441 | } | ||
442 | if ((a != NULL) && !print(bp, "A: ", a, buffer, off)) | ||
443 | goto err; | ||
444 | if ((b != NULL) && !print(bp, "B: ", b, buffer, off)) | ||
445 | goto err; | ||
446 | if (form == POINT_CONVERSION_COMPRESSED) | ||
447 | { | ||
448 | if ((gen != NULL) && !print(bp, gen_compressed, gen, | ||
449 | buffer, off)) | ||
450 | goto err; | ||
451 | } | ||
452 | else if (form == POINT_CONVERSION_UNCOMPRESSED) | ||
453 | { | ||
454 | if ((gen != NULL) && !print(bp, gen_uncompressed, gen, | ||
455 | buffer, off)) | ||
456 | goto err; | ||
457 | } | ||
458 | else /* form == POINT_CONVERSION_HYBRID */ | ||
459 | { | ||
460 | if ((gen != NULL) && !print(bp, gen_hybrid, gen, | ||
461 | buffer, off)) | ||
462 | goto err; | ||
463 | } | ||
464 | if ((order != NULL) && !print(bp, "Order: ", order, | ||
465 | buffer, off)) goto err; | ||
466 | if ((cofactor != NULL) && !print(bp, "Cofactor: ", cofactor, | ||
467 | buffer, off)) goto err; | ||
468 | if (seed && !print_bin(bp, "Seed:", seed, seed_len, off)) | ||
469 | goto err; | ||
470 | } | ||
471 | ret=1; | ||
472 | err: | ||
473 | if (!ret) | ||
474 | ECerr(EC_F_ECPKPARAMETERS_PRINT, reason); | ||
475 | if (p) | ||
476 | BN_free(p); | ||
477 | if (a) | ||
478 | BN_free(a); | ||
479 | if (b) | ||
480 | BN_free(b); | ||
481 | if (gen) | ||
482 | BN_free(gen); | ||
483 | if (order) | ||
484 | BN_free(order); | ||
485 | if (cofactor) | ||
486 | BN_free(cofactor); | ||
487 | if (ctx) | ||
488 | BN_CTX_free(ctx); | ||
489 | if (buffer != NULL) | ||
490 | OPENSSL_free(buffer); | ||
491 | return(ret); | ||
492 | } | ||
493 | |||
494 | int EC_KEY_print(BIO *bp, const EC_KEY *x, int off) | ||
495 | { | ||
496 | unsigned char *buffer=NULL; | ||
497 | size_t buf_len=0, i; | ||
498 | int ret=0, reason=ERR_R_BIO_LIB; | ||
499 | BIGNUM *pub_key=NULL, *order=NULL; | ||
500 | BN_CTX *ctx=NULL; | ||
501 | const EC_GROUP *group; | ||
502 | const EC_POINT *public_key; | ||
503 | const BIGNUM *priv_key; | ||
504 | |||
505 | if (x == NULL || (group = EC_KEY_get0_group(x)) == NULL) | ||
506 | { | ||
507 | reason = ERR_R_PASSED_NULL_PARAMETER; | ||
508 | goto err; | ||
509 | } | ||
510 | |||
511 | public_key = EC_KEY_get0_public_key(x); | ||
512 | if ((pub_key = EC_POINT_point2bn(group, public_key, | ||
513 | EC_KEY_get_conv_form(x), NULL, ctx)) == NULL) | ||
514 | { | ||
515 | reason = ERR_R_EC_LIB; | ||
516 | goto err; | ||
517 | } | ||
518 | |||
519 | buf_len = (size_t)BN_num_bytes(pub_key); | ||
520 | priv_key = EC_KEY_get0_private_key(x); | ||
521 | if (priv_key != NULL) | ||
522 | { | ||
523 | if ((i = (size_t)BN_num_bytes(priv_key)) > buf_len) | ||
524 | buf_len = i; | ||
525 | } | ||
526 | |||
527 | buf_len += 10; | ||
528 | if ((buffer = OPENSSL_malloc(buf_len)) == NULL) | ||
529 | { | ||
530 | reason = ERR_R_MALLOC_FAILURE; | ||
531 | goto err; | ||
532 | } | ||
533 | |||
534 | if (priv_key != NULL) | ||
535 | { | ||
536 | if (!BIO_indent(bp, off, 128)) | ||
537 | goto err; | ||
538 | if ((order = BN_new()) == NULL) | ||
539 | goto err; | ||
540 | if (!EC_GROUP_get_order(group, order, NULL)) | ||
541 | goto err; | ||
542 | if (BIO_printf(bp, "Private-Key: (%d bit)\n", | ||
543 | BN_num_bits(order)) <= 0) goto err; | ||
544 | } | ||
545 | |||
546 | if ((priv_key != NULL) && !print(bp, "priv:", priv_key, | ||
547 | buffer, off)) | ||
548 | goto err; | ||
549 | if ((pub_key != NULL) && !print(bp, "pub: ", pub_key, | ||
550 | buffer, off)) | ||
551 | goto err; | ||
552 | if (!ECPKParameters_print(bp, group, off)) | ||
553 | goto err; | ||
554 | ret=1; | ||
555 | err: | ||
556 | if (!ret) | ||
557 | ECerr(EC_F_EC_KEY_PRINT, reason); | ||
558 | if (pub_key) | ||
559 | BN_free(pub_key); | ||
560 | if (order) | ||
561 | BN_free(order); | ||
562 | if (ctx) | ||
563 | BN_CTX_free(ctx); | ||
564 | if (buffer != NULL) | ||
565 | OPENSSL_free(buffer); | ||
566 | return(ret); | ||
567 | } | ||
568 | #endif /* OPENSSL_NO_EC */ | ||
569 | |||
570 | static int print(BIO *bp, const char *number, const BIGNUM *num, unsigned char *buf, | ||
231 | int off) | 571 | int off) |
232 | { | 572 | { |
233 | int n,i; | 573 | int n,i; |
234 | const char *neg; | 574 | const char *neg; |
235 | 575 | ||
236 | if (num == NULL) return(1); | 576 | if (num == NULL) return(1); |
237 | neg=(num->neg)?"-":""; | 577 | neg = (BN_is_negative(num))?"-":""; |
238 | if(!BIO_indent(bp,off,128)) | 578 | if(!BIO_indent(bp,off,128)) |
239 | return 0; | 579 | return 0; |
580 | if (BN_is_zero(num)) | ||
581 | { | ||
582 | if (BIO_printf(bp, "%s 0\n", number) <= 0) | ||
583 | return 0; | ||
584 | return 1; | ||
585 | } | ||
240 | 586 | ||
241 | if (BN_num_bytes(num) <= BN_BYTES) | 587 | if (BN_num_bytes(num) <= BN_BYTES) |
242 | { | 588 | { |
@@ -272,23 +618,63 @@ static int print(BIO *bp, const char *number, BIGNUM *num, unsigned char *buf, | |||
272 | return(1); | 618 | return(1); |
273 | } | 619 | } |
274 | 620 | ||
621 | #ifndef OPENSSL_NO_EC | ||
622 | static int print_bin(BIO *fp, const char *name, const unsigned char *buf, | ||
623 | size_t len, int off) | ||
624 | { | ||
625 | size_t i; | ||
626 | char str[128]; | ||
627 | |||
628 | if (buf == NULL) | ||
629 | return 1; | ||
630 | if (off) | ||
631 | { | ||
632 | if (off > 128) | ||
633 | off=128; | ||
634 | memset(str,' ',off); | ||
635 | if (BIO_write(fp, str, off) <= 0) | ||
636 | return 0; | ||
637 | } | ||
638 | |||
639 | if (BIO_printf(fp,"%s", name) <= 0) | ||
640 | return 0; | ||
641 | |||
642 | for (i=0; i<len; i++) | ||
643 | { | ||
644 | if ((i%15) == 0) | ||
645 | { | ||
646 | str[0]='\n'; | ||
647 | memset(&(str[1]),' ',off+4); | ||
648 | if (BIO_write(fp, str, off+1+4) <= 0) | ||
649 | return 0; | ||
650 | } | ||
651 | if (BIO_printf(fp,"%02x%s",buf[i],((i+1) == len)?"":":") <= 0) | ||
652 | return 0; | ||
653 | } | ||
654 | if (BIO_write(fp,"\n",1) <= 0) | ||
655 | return 0; | ||
656 | |||
657 | return 1; | ||
658 | } | ||
659 | #endif | ||
660 | |||
275 | #ifndef OPENSSL_NO_DH | 661 | #ifndef OPENSSL_NO_DH |
276 | #ifndef OPENSSL_NO_FP_API | 662 | #ifndef OPENSSL_NO_FP_API |
277 | int DHparams_print_fp(FILE *fp, const DH *x) | 663 | int DHparams_print_fp(FILE *fp, const DH *x) |
278 | { | 664 | { |
279 | BIO *b; | 665 | BIO *b; |
280 | int ret; | 666 | int ret; |
281 | 667 | ||
282 | if ((b=BIO_new(BIO_s_file())) == NULL) | 668 | if ((b=BIO_new(BIO_s_file())) == NULL) |
283 | { | 669 | { |
284 | DHerr(DH_F_DHPARAMS_PRINT_FP,ERR_R_BUF_LIB); | 670 | DHerr(DH_F_DHPARAMS_PRINT_FP,ERR_R_BUF_LIB); |
285 | return(0); | 671 | return(0); |
286 | } | 672 | } |
287 | BIO_set_fp(b,fp,BIO_NOCLOSE); | 673 | BIO_set_fp(b,fp,BIO_NOCLOSE); |
288 | ret=DHparams_print(b, x); | 674 | ret=DHparams_print(b, x); |
289 | BIO_free(b); | 675 | BIO_free(b); |
290 | return(ret); | 676 | return(ret); |
291 | } | 677 | } |
292 | #endif | 678 | #endif |
293 | 679 | ||
294 | int DHparams_print(BIO *bp, const DH *x) | 680 | int DHparams_print(BIO *bp, const DH *x) |
@@ -299,6 +685,11 @@ int DHparams_print(BIO *bp, const DH *x) | |||
299 | 685 | ||
300 | if (x->p) | 686 | if (x->p) |
301 | buf_len = (size_t)BN_num_bytes(x->p); | 687 | buf_len = (size_t)BN_num_bytes(x->p); |
688 | else | ||
689 | { | ||
690 | reason = ERR_R_PASSED_NULL_PARAMETER; | ||
691 | goto err; | ||
692 | } | ||
302 | if (x->g) | 693 | if (x->g) |
303 | if (buf_len < (i = (size_t)BN_num_bytes(x->g))) | 694 | if (buf_len < (i = (size_t)BN_num_bytes(x->g))) |
304 | buf_len = i; | 695 | buf_len = i; |
@@ -333,30 +724,35 @@ err: | |||
333 | #ifndef OPENSSL_NO_DSA | 724 | #ifndef OPENSSL_NO_DSA |
334 | #ifndef OPENSSL_NO_FP_API | 725 | #ifndef OPENSSL_NO_FP_API |
335 | int DSAparams_print_fp(FILE *fp, const DSA *x) | 726 | int DSAparams_print_fp(FILE *fp, const DSA *x) |
336 | { | 727 | { |
337 | BIO *b; | 728 | BIO *b; |
338 | int ret; | 729 | int ret; |
339 | 730 | ||
340 | if ((b=BIO_new(BIO_s_file())) == NULL) | 731 | if ((b=BIO_new(BIO_s_file())) == NULL) |
341 | { | 732 | { |
342 | DSAerr(DSA_F_DSAPARAMS_PRINT_FP,ERR_R_BUF_LIB); | 733 | DSAerr(DSA_F_DSAPARAMS_PRINT_FP,ERR_R_BUF_LIB); |
343 | return(0); | 734 | return(0); |
344 | } | 735 | } |
345 | BIO_set_fp(b,fp,BIO_NOCLOSE); | 736 | BIO_set_fp(b,fp,BIO_NOCLOSE); |
346 | ret=DSAparams_print(b, x); | 737 | ret=DSAparams_print(b, x); |
347 | BIO_free(b); | 738 | BIO_free(b); |
348 | return(ret); | 739 | return(ret); |
349 | } | 740 | } |
350 | #endif | 741 | #endif |
351 | 742 | ||
352 | int DSAparams_print(BIO *bp, const DSA *x) | 743 | int DSAparams_print(BIO *bp, const DSA *x) |
353 | { | 744 | { |
354 | unsigned char *m=NULL; | 745 | unsigned char *m=NULL; |
355 | int reason=ERR_R_BUF_LIB,ret=0; | 746 | int ret=0; |
356 | size_t buf_len=0,i; | 747 | size_t buf_len=0,i; |
357 | 748 | ||
358 | if (x->p) | 749 | if (x->p) |
359 | buf_len = (size_t)BN_num_bytes(x->p); | 750 | buf_len = (size_t)BN_num_bytes(x->p); |
751 | else | ||
752 | { | ||
753 | DSAerr(DSA_F_DSAPARAMS_PRINT,DSA_R_MISSING_PARAMETERS); | ||
754 | goto err; | ||
755 | } | ||
360 | if (x->q) | 756 | if (x->q) |
361 | if (buf_len < (i = (size_t)BN_num_bytes(x->q))) | 757 | if (buf_len < (i = (size_t)BN_num_bytes(x->q))) |
362 | buf_len = i; | 758 | buf_len = i; |
@@ -366,7 +762,7 @@ int DSAparams_print(BIO *bp, const DSA *x) | |||
366 | m=(unsigned char *)OPENSSL_malloc(buf_len+10); | 762 | m=(unsigned char *)OPENSSL_malloc(buf_len+10); |
367 | if (m == NULL) | 763 | if (m == NULL) |
368 | { | 764 | { |
369 | reason=ERR_R_MALLOC_FAILURE; | 765 | DSAerr(DSA_F_DSAPARAMS_PRINT,ERR_R_MALLOC_FAILURE); |
370 | goto err; | 766 | goto err; |
371 | } | 767 | } |
372 | 768 | ||
@@ -374,14 +770,70 @@ int DSAparams_print(BIO *bp, const DSA *x) | |||
374 | BN_num_bits(x->p)) <= 0) | 770 | BN_num_bits(x->p)) <= 0) |
375 | goto err; | 771 | goto err; |
376 | if (!print(bp,"p:",x->p,m,4)) goto err; | 772 | if (!print(bp,"p:",x->p,m,4)) goto err; |
377 | if (!print(bp,"q:",x->q,m,4)) goto err; | 773 | if ((x->q != NULL) && !print(bp,"q:",x->q,m,4)) goto err; |
378 | if (!print(bp,"g:",x->g,m,4)) goto err; | 774 | if ((x->g != NULL) && !print(bp,"g:",x->g,m,4)) goto err; |
379 | ret=1; | 775 | ret=1; |
380 | err: | 776 | err: |
381 | if (m != NULL) OPENSSL_free(m); | 777 | if (m != NULL) OPENSSL_free(m); |
382 | DSAerr(DSA_F_DSAPARAMS_PRINT,reason); | ||
383 | return(ret); | 778 | return(ret); |
384 | } | 779 | } |
385 | 780 | ||
386 | #endif /* !OPENSSL_NO_DSA */ | 781 | #endif /* !OPENSSL_NO_DSA */ |
387 | 782 | ||
783 | #ifndef OPENSSL_NO_EC | ||
784 | #ifndef OPENSSL_NO_FP_API | ||
785 | int ECParameters_print_fp(FILE *fp, const EC_KEY *x) | ||
786 | { | ||
787 | BIO *b; | ||
788 | int ret; | ||
789 | |||
790 | if ((b=BIO_new(BIO_s_file())) == NULL) | ||
791 | { | ||
792 | ECerr(EC_F_ECPARAMETERS_PRINT_FP, ERR_R_BIO_LIB); | ||
793 | return(0); | ||
794 | } | ||
795 | BIO_set_fp(b, fp, BIO_NOCLOSE); | ||
796 | ret = ECParameters_print(b, x); | ||
797 | BIO_free(b); | ||
798 | return(ret); | ||
799 | } | ||
800 | #endif | ||
801 | |||
802 | int ECParameters_print(BIO *bp, const EC_KEY *x) | ||
803 | { | ||
804 | int reason=ERR_R_EC_LIB, ret=0; | ||
805 | BIGNUM *order=NULL; | ||
806 | const EC_GROUP *group; | ||
807 | |||
808 | if (x == NULL || (group = EC_KEY_get0_group(x)) == NULL) | ||
809 | { | ||
810 | reason = ERR_R_PASSED_NULL_PARAMETER;; | ||
811 | goto err; | ||
812 | } | ||
813 | |||
814 | if ((order = BN_new()) == NULL) | ||
815 | { | ||
816 | reason = ERR_R_MALLOC_FAILURE; | ||
817 | goto err; | ||
818 | } | ||
819 | |||
820 | if (!EC_GROUP_get_order(group, order, NULL)) | ||
821 | { | ||
822 | reason = ERR_R_EC_LIB; | ||
823 | goto err; | ||
824 | } | ||
825 | |||
826 | if (BIO_printf(bp, "ECDSA-Parameters: (%d bit)\n", | ||
827 | BN_num_bits(order)) <= 0) | ||
828 | goto err; | ||
829 | if (!ECPKParameters_print(bp, group, 4)) | ||
830 | goto err; | ||
831 | ret=1; | ||
832 | err: | ||
833 | if (order) | ||
834 | BN_free(order); | ||
835 | ECerr(EC_F_ECPARAMETERS_PRINT, reason); | ||
836 | return(ret); | ||
837 | } | ||
838 | |||
839 | #endif | ||