ssl/libcrypto/src/crypto/asn1/t_pkey.c
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 /* crypto/asn1/t_pkey.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 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  */
       
    63 /*
       
    64  © Portions copyright (c) 2006 Nokia Corporation.  All rights reserved.
       
    65  */
       
    66 #include <stdio.h>
       
    67 #include "cryptlib.h"
       
    68 #include <openssl/objects.h>
       
    69 #include <openssl/buffer.h>
       
    70 #include <openssl/bn.h>
       
    71 #ifndef OPENSSL_NO_RSA
       
    72 #include <openssl/rsa.h>
       
    73 #endif
       
    74 #ifndef OPENSSL_NO_DH
       
    75 #include <openssl/dh.h>
       
    76 #endif
       
    77 #ifndef OPENSSL_NO_DSA
       
    78 #include <openssl/dsa.h>
       
    79 #endif
       
    80 #ifndef OPENSSL_NO_EC
       
    81 #include <openssl/ec.h>
       
    82 #endif
       
    83 
       
    84 static int print(BIO *fp,const char *str, const BIGNUM *num,
       
    85 		unsigned char *buf,int off);
       
    86 #ifndef OPENSSL_NO_EC
       
    87 static int print_bin(BIO *fp, const char *str, const unsigned char *num,
       
    88 		size_t len, int off);
       
    89 #endif
       
    90 #ifndef OPENSSL_NO_RSA
       
    91 #ifndef OPENSSL_NO_FP_API
       
    92 EXPORT_C int RSA_print_fp(FILE *fp, const RSA *x, int off)
       
    93 	{
       
    94 	BIO *b;
       
    95 	int ret;
       
    96 
       
    97 	if ((b=BIO_new(BIO_s_file())) == NULL)
       
    98 		{
       
    99 		RSAerr(RSA_F_RSA_PRINT_FP,ERR_R_BUF_LIB);
       
   100 		return(0);
       
   101 		}
       
   102 	BIO_set_fp(b,fp,BIO_NOCLOSE);
       
   103 	ret=RSA_print(b,x,off);
       
   104 	BIO_free(b);
       
   105 	return(ret);
       
   106 	}
       
   107 #endif
       
   108 
       
   109 EXPORT_C int RSA_print(BIO *bp, const RSA *x, int off)
       
   110 	{
       
   111 #ifndef SYMBAIN		
       
   112 	char str[128];
       
   113 #else
       
   114   char str[50];
       
   115 #endif	
       
   116 		const char *s;
       
   117 	unsigned char *m=NULL;
       
   118 	int ret=0, mod_len = 0;
       
   119 	size_t buf_len=0, i;
       
   120 
       
   121 	if (x->n)
       
   122 		buf_len = (size_t)BN_num_bytes(x->n);
       
   123 	if (x->e)
       
   124 		if (buf_len < (i = (size_t)BN_num_bytes(x->e)))
       
   125 			buf_len = i;
       
   126 	if (x->d)
       
   127 		if (buf_len < (i = (size_t)BN_num_bytes(x->d)))
       
   128 			buf_len = i;
       
   129 	if (x->p)
       
   130 		if (buf_len < (i = (size_t)BN_num_bytes(x->p)))
       
   131 			buf_len = i;
       
   132 	if (x->q)
       
   133 		if (buf_len < (i = (size_t)BN_num_bytes(x->q)))
       
   134 			buf_len = i;
       
   135 	if (x->dmp1)
       
   136 		if (buf_len < (i = (size_t)BN_num_bytes(x->dmp1)))
       
   137 			buf_len = i;
       
   138 	if (x->dmq1)
       
   139 		if (buf_len < (i = (size_t)BN_num_bytes(x->dmq1)))
       
   140 			buf_len = i;
       
   141 	if (x->iqmp)
       
   142 		if (buf_len < (i = (size_t)BN_num_bytes(x->iqmp)))
       
   143 			buf_len = i;
       
   144 
       
   145 	m=(unsigned char *)OPENSSL_malloc(buf_len+10);
       
   146 	if (m == NULL)
       
   147 		{
       
   148 		RSAerr(RSA_F_RSA_PRINT,ERR_R_MALLOC_FAILURE);
       
   149 		goto err;
       
   150 		}
       
   151 
       
   152 	if (x->n != NULL)
       
   153 		mod_len = BN_num_bits(x->n);
       
   154 
       
   155 	if (x->d != NULL)
       
   156 		{
       
   157 		if(!BIO_indent(bp,off,128))
       
   158 		   goto err;
       
   159 		if (BIO_printf(bp,"Private-Key: (%d bit)\n", mod_len)
       
   160 			<= 0) goto err;
       
   161 		}
       
   162 
       
   163 	if (x->d == NULL)
       
   164 		BIO_snprintf(str,sizeof str,"Modulus (%d bit):", mod_len);
       
   165 	else
       
   166 		BUF_strlcpy(str,"modulus:",sizeof str);
       
   167 	if (!print(bp,str,x->n,m,off)) goto err;
       
   168 	s=(x->d == NULL)?"Exponent:":"publicExponent:";
       
   169 	if ((x->e != NULL) && !print(bp,s,x->e,m,off))
       
   170 		goto err;
       
   171 	if ((x->d != NULL) && !print(bp,"privateExponent:",x->d,m,off))
       
   172 		goto err;
       
   173 	if ((x->p != NULL) && !print(bp,"prime1:",x->p,m,off))
       
   174 		goto err;
       
   175 	if ((x->q != NULL) && !print(bp,"prime2:",x->q,m,off))
       
   176 		goto err;
       
   177 	if ((x->dmp1 != NULL) && !print(bp,"exponent1:",x->dmp1,m,off))
       
   178 		goto err;
       
   179 	if ((x->dmq1 != NULL) && !print(bp,"exponent2:",x->dmq1,m,off))
       
   180 		goto err;
       
   181 	if ((x->iqmp != NULL) && !print(bp,"coefficient:",x->iqmp,m,off))
       
   182 		goto err;
       
   183 	ret=1;
       
   184 err:
       
   185 	if (m != NULL) OPENSSL_free(m);
       
   186 	return(ret);
       
   187 
       
   188 	}
       
   189 #endif /* OPENSSL_NO_RSA */
       
   190 
       
   191 #ifndef OPENSSL_NO_DSA
       
   192 #ifndef OPENSSL_NO_FP_API
       
   193 EXPORT_C int DSA_print_fp(FILE *fp, const DSA *x, int off)
       
   194 	{
       
   195 	BIO *b;
       
   196 	int ret;
       
   197 
       
   198 	if ((b=BIO_new(BIO_s_file())) == NULL)
       
   199 		{
       
   200 		DSAerr(DSA_F_DSA_PRINT_FP,ERR_R_BUF_LIB);
       
   201 		return(0);
       
   202 		}
       
   203 	BIO_set_fp(b,fp,BIO_NOCLOSE);
       
   204 	ret=DSA_print(b,x,off);
       
   205 	BIO_free(b);
       
   206 	return(ret);
       
   207 	}
       
   208 #endif
       
   209 
       
   210 EXPORT_C int DSA_print(BIO *bp, const DSA *x, int off)
       
   211 	{
       
   212 	unsigned char *m=NULL;
       
   213 	int ret=0;
       
   214 	size_t buf_len=0,i;
       
   215 
       
   216 	if (x->p)
       
   217 		buf_len = (size_t)BN_num_bytes(x->p);
       
   218 	else
       
   219 		{
       
   220 		DSAerr(DSA_F_DSA_PRINT,DSA_R_MISSING_PARAMETERS);
       
   221 		goto err;
       
   222 		}
       
   223 	if (x->q)
       
   224 		if (buf_len < (i = (size_t)BN_num_bytes(x->q)))
       
   225 			buf_len = i;
       
   226 	if (x->g)
       
   227 		if (buf_len < (i = (size_t)BN_num_bytes(x->g)))
       
   228 			buf_len = i;
       
   229 	if (x->priv_key)
       
   230 		if (buf_len < (i = (size_t)BN_num_bytes(x->priv_key)))
       
   231 			buf_len = i;
       
   232 	if (x->pub_key)
       
   233 		if (buf_len < (i = (size_t)BN_num_bytes(x->pub_key)))
       
   234 			buf_len = i;
       
   235 
       
   236 	m=(unsigned char *)OPENSSL_malloc(buf_len+10);
       
   237 	if (m == NULL)
       
   238 		{
       
   239 		DSAerr(DSA_F_DSA_PRINT,ERR_R_MALLOC_FAILURE);
       
   240 		goto err;
       
   241 		}
       
   242 
       
   243 	if (x->priv_key != NULL)
       
   244 		{
       
   245 		if(!BIO_indent(bp,off,128))
       
   246 		   goto err;
       
   247 		if (BIO_printf(bp,"Private-Key: (%d bit)\n",BN_num_bits(x->p))
       
   248 			<= 0) goto err;
       
   249 		}
       
   250 
       
   251 	if ((x->priv_key != NULL) && !print(bp,"priv:",x->priv_key,m,off))
       
   252 		goto err;
       
   253 	if ((x->pub_key  != NULL) && !print(bp,"pub: ",x->pub_key,m,off))
       
   254 		goto err;
       
   255 	if ((x->p != NULL) && !print(bp,"P:   ",x->p,m,off)) goto err;
       
   256 	if ((x->q != NULL) && !print(bp,"Q:   ",x->q,m,off)) goto err;
       
   257 	if ((x->g != NULL) && !print(bp,"G:   ",x->g,m,off)) goto err;
       
   258 	ret=1;
       
   259 err:
       
   260 	if (m != NULL) OPENSSL_free(m);
       
   261 	return(ret);
       
   262 	}
       
   263 #endif /* !OPENSSL_NO_DSA */
       
   264 
       
   265 #ifndef OPENSSL_NO_EC
       
   266 #ifndef OPENSSL_NO_FP_API
       
   267 EXPORT_C int ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off)
       
   268 	{
       
   269 	BIO *b;
       
   270 	int ret;
       
   271 
       
   272 	if ((b=BIO_new(BIO_s_file())) == NULL)
       
   273 		{
       
   274 		ECerr(EC_F_ECPKPARAMETERS_PRINT_FP,ERR_R_BUF_LIB);
       
   275 		return(0);
       
   276 		}
       
   277 	BIO_set_fp(b, fp, BIO_NOCLOSE);
       
   278 	ret = ECPKParameters_print(b, x, off);
       
   279 	BIO_free(b);
       
   280 	return(ret);
       
   281 	}
       
   282 
       
   283 EXPORT_C int EC_KEY_print_fp(FILE *fp, const EC_KEY *x, int off)
       
   284 	{
       
   285 	BIO *b;
       
   286 	int ret;
       
   287  
       
   288 	if ((b=BIO_new(BIO_s_file())) == NULL)
       
   289 		{
       
   290 		ECerr(EC_F_EC_KEY_PRINT_FP, ERR_R_BIO_LIB);
       
   291 		return(0);
       
   292 		}
       
   293 	BIO_set_fp(b, fp, BIO_NOCLOSE);
       
   294 	ret = EC_KEY_print(b, x, off);
       
   295 	BIO_free(b);
       
   296 	return(ret);
       
   297 	}
       
   298 #endif
       
   299 
       
   300 EXPORT_C int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off)
       
   301 	{
       
   302 	unsigned char *buffer=NULL;
       
   303 	size_t	buf_len=0, i;
       
   304 	int     ret=0, reason=ERR_R_BIO_LIB;
       
   305 	BN_CTX  *ctx=NULL;
       
   306 	const EC_POINT *point=NULL;
       
   307 	BIGNUM	*p=NULL, *a=NULL, *b=NULL, *gen=NULL,
       
   308 		*order=NULL, *cofactor=NULL;
       
   309 	const unsigned char *seed;
       
   310 	size_t	seed_len=0;
       
   311 	
       
   312 	static const char *gen_compressed = "Generator (compressed):";
       
   313 	static const char *gen_uncompressed = "Generator (uncompressed):";
       
   314 	static const char *gen_hybrid = "Generator (hybrid):";
       
   315  
       
   316 	if (!x)
       
   317 		{
       
   318 		reason = ERR_R_PASSED_NULL_PARAMETER;
       
   319 		goto err;
       
   320 		}
       
   321 
       
   322 	if (EC_GROUP_get_asn1_flag(x))
       
   323 		{
       
   324 		/* the curve parameter are given by an asn1 OID */
       
   325 		int nid;
       
   326 
       
   327 		if (!BIO_indent(bp, off, 128))
       
   328 			goto err;
       
   329 
       
   330 		nid = EC_GROUP_get_curve_name(x);
       
   331 		if (nid == 0)
       
   332 			goto err;
       
   333 
       
   334 		if (BIO_printf(bp, "ASN1 OID: %s", OBJ_nid2sn(nid)) <= 0)
       
   335 			goto err;
       
   336 		if (BIO_printf(bp, "\n") <= 0)
       
   337 			goto err;
       
   338 		}
       
   339 	else
       
   340 		{
       
   341 		/* explicit parameters */
       
   342 		int is_char_two = 0;
       
   343 		point_conversion_form_t form;
       
   344 		int tmp_nid = EC_METHOD_get_field_type(EC_GROUP_method_of(x));
       
   345 
       
   346 		if (tmp_nid == NID_X9_62_characteristic_two_field)
       
   347 			is_char_two = 1;
       
   348 
       
   349 		if ((p = BN_new()) == NULL || (a = BN_new()) == NULL ||
       
   350 			(b = BN_new()) == NULL || (order = BN_new()) == NULL ||
       
   351 			(cofactor = BN_new()) == NULL)
       
   352 			{
       
   353 			reason = ERR_R_MALLOC_FAILURE;
       
   354 			goto err;
       
   355 			}
       
   356 
       
   357 		if (is_char_two)
       
   358 			{
       
   359 			if (!EC_GROUP_get_curve_GF2m(x, p, a, b, ctx))
       
   360 				{
       
   361 				reason = ERR_R_EC_LIB;
       
   362 				goto err;
       
   363 				}
       
   364 			}
       
   365 		else /* prime field */
       
   366 			{
       
   367 			if (!EC_GROUP_get_curve_GFp(x, p, a, b, ctx))
       
   368 				{
       
   369 				reason = ERR_R_EC_LIB;
       
   370 				goto err;
       
   371 				}
       
   372 			}
       
   373 
       
   374 		if ((point = EC_GROUP_get0_generator(x)) == NULL)
       
   375 			{
       
   376 			reason = ERR_R_EC_LIB;
       
   377 			goto err;
       
   378 			}
       
   379 		if (!EC_GROUP_get_order(x, order, NULL) || 
       
   380             		!EC_GROUP_get_cofactor(x, cofactor, NULL))
       
   381 			{
       
   382 			reason = ERR_R_EC_LIB;
       
   383 			goto err;
       
   384 			}
       
   385 		
       
   386 		form = EC_GROUP_get_point_conversion_form(x);
       
   387 
       
   388 		if ((gen = EC_POINT_point2bn(x, point, 
       
   389 				form, NULL, ctx)) == NULL)
       
   390 			{
       
   391 			reason = ERR_R_EC_LIB;
       
   392 			goto err;
       
   393 			}
       
   394 
       
   395 		buf_len = (size_t)BN_num_bytes(p);
       
   396 		if (buf_len < (i = (size_t)BN_num_bytes(a)))
       
   397 			buf_len = i;
       
   398 		if (buf_len < (i = (size_t)BN_num_bytes(b)))
       
   399 			buf_len = i;
       
   400 		if (buf_len < (i = (size_t)BN_num_bytes(gen)))
       
   401 			buf_len = i;
       
   402 		if (buf_len < (i = (size_t)BN_num_bytes(order)))
       
   403 			buf_len = i;
       
   404 		if (buf_len < (i = (size_t)BN_num_bytes(cofactor))) 
       
   405 			buf_len = i;
       
   406 
       
   407 		if ((seed = EC_GROUP_get0_seed(x)) != NULL)
       
   408 			seed_len = EC_GROUP_get_seed_len(x);
       
   409 
       
   410 		buf_len += 10;
       
   411 		if ((buffer = OPENSSL_malloc(buf_len)) == NULL)
       
   412 			{
       
   413 			reason = ERR_R_MALLOC_FAILURE;
       
   414 			goto err;
       
   415 			}
       
   416 
       
   417 		if (!BIO_indent(bp, off, 128))
       
   418 			goto err;
       
   419 
       
   420 		/* print the 'short name' of the field type */
       
   421 		if (BIO_printf(bp, "Field Type: %s\n", OBJ_nid2sn(tmp_nid))
       
   422 			<= 0)
       
   423 			goto err;  
       
   424 
       
   425 		if (is_char_two)
       
   426 			{
       
   427 			/* print the 'short name' of the base type OID */
       
   428 			int basis_type = EC_GROUP_get_basis_type(x);
       
   429 			if (basis_type == 0)
       
   430 				goto err;
       
   431 
       
   432 			if (!BIO_indent(bp, off, 128))
       
   433 				goto err;
       
   434 
       
   435 			if (BIO_printf(bp, "Basis Type: %s\n", 
       
   436 				OBJ_nid2sn(basis_type)) <= 0)
       
   437 				goto err;
       
   438 
       
   439 			/* print the polynomial */
       
   440 			if ((p != NULL) && !print(bp, "Polynomial:", p, buffer,
       
   441 				off))
       
   442 				goto err;
       
   443 			}
       
   444 		else
       
   445 			{
       
   446 			if ((p != NULL) && !print(bp, "Prime:", p, buffer,off))
       
   447 				goto err;
       
   448 			}
       
   449 		if ((a != NULL) && !print(bp, "A:   ", a, buffer, off)) 
       
   450 			goto err;
       
   451 		if ((b != NULL) && !print(bp, "B:   ", b, buffer, off))
       
   452 			goto err;
       
   453 		if (form == POINT_CONVERSION_COMPRESSED)
       
   454 			{
       
   455 			if ((gen != NULL) && !print(bp, gen_compressed, gen,
       
   456 				buffer, off))
       
   457 				goto err;
       
   458 			}
       
   459 		else if (form == POINT_CONVERSION_UNCOMPRESSED)
       
   460 			{
       
   461 			if ((gen != NULL) && !print(bp, gen_uncompressed, gen,
       
   462 				buffer, off))
       
   463 				goto err;
       
   464 			}
       
   465 		else /* form == POINT_CONVERSION_HYBRID */
       
   466 			{
       
   467 			if ((gen != NULL) && !print(bp, gen_hybrid, gen,
       
   468 				buffer, off))
       
   469 				goto err;
       
   470 			}
       
   471 		if ((order != NULL) && !print(bp, "Order: ", order, 
       
   472 			buffer, off)) goto err;
       
   473 		if ((cofactor != NULL) && !print(bp, "Cofactor: ", cofactor, 
       
   474 			buffer, off)) goto err;
       
   475 		if (seed && !print_bin(bp, "Seed:", seed, seed_len, off))
       
   476 			goto err;
       
   477 		}
       
   478 	ret=1;
       
   479 err:
       
   480 	if (!ret)
       
   481  		ECerr(EC_F_ECPKPARAMETERS_PRINT, reason);
       
   482 	if (p) 
       
   483 		BN_free(p);
       
   484 	if (a) 
       
   485 		BN_free(a);
       
   486 	if (b)
       
   487 		BN_free(b);
       
   488 	if (gen)
       
   489 		BN_free(gen);
       
   490 	if (order)
       
   491 		BN_free(order);
       
   492 	if (cofactor)
       
   493 		BN_free(cofactor);
       
   494 	if (ctx)
       
   495 		BN_CTX_free(ctx);
       
   496 	if (buffer != NULL) 
       
   497 		OPENSSL_free(buffer);
       
   498 	return(ret);	
       
   499 	}
       
   500 
       
   501 EXPORT_C int EC_KEY_print(BIO *bp, const EC_KEY *x, int off)
       
   502 	{
       
   503 	unsigned char *buffer=NULL;
       
   504 	size_t	buf_len=0, i;
       
   505 	int     ret=0, reason=ERR_R_BIO_LIB;
       
   506 	BIGNUM  *pub_key=NULL, *order=NULL;
       
   507 	BN_CTX  *ctx=NULL;
       
   508 	const EC_GROUP *group;
       
   509 	const EC_POINT *public_key;
       
   510 	const BIGNUM *priv_key;
       
   511  
       
   512 	if (x == NULL || (group = EC_KEY_get0_group(x)) == NULL)
       
   513 		{
       
   514 		reason = ERR_R_PASSED_NULL_PARAMETER;
       
   515 		goto err;
       
   516 		}
       
   517 
       
   518 	public_key = EC_KEY_get0_public_key(x);
       
   519 	if ((pub_key = EC_POINT_point2bn(group, public_key,
       
   520 		EC_KEY_get_conv_form(x), NULL, ctx)) == NULL)
       
   521 		{
       
   522 		reason = ERR_R_EC_LIB;
       
   523 		goto err;
       
   524 		}
       
   525 
       
   526 	buf_len = (size_t)BN_num_bytes(pub_key);
       
   527 	priv_key = EC_KEY_get0_private_key(x);
       
   528 	if (priv_key != NULL)
       
   529 		{
       
   530 		if ((i = (size_t)BN_num_bytes(priv_key)) > buf_len)
       
   531 			buf_len = i;
       
   532 		}
       
   533 
       
   534 	buf_len += 10;
       
   535 	if ((buffer = OPENSSL_malloc(buf_len)) == NULL)
       
   536 		{
       
   537 		reason = ERR_R_MALLOC_FAILURE;
       
   538 		goto err;
       
   539 		}
       
   540 
       
   541 	if (priv_key != NULL)
       
   542 		{
       
   543 		if (!BIO_indent(bp, off, 128))
       
   544 			goto err;
       
   545 		if ((order = BN_new()) == NULL)
       
   546 			goto err;
       
   547 		if (!EC_GROUP_get_order(group, order, NULL))
       
   548 			goto err;
       
   549 		if (BIO_printf(bp, "Private-Key: (%d bit)\n", 
       
   550 			BN_num_bits(order)) <= 0) goto err;
       
   551 		}
       
   552   
       
   553 	if ((priv_key != NULL) && !print(bp, "priv:", priv_key, 
       
   554 		buffer, off))
       
   555 		goto err;
       
   556 	if ((pub_key != NULL) && !print(bp, "pub: ", pub_key,
       
   557 		buffer, off))
       
   558 		goto err;
       
   559 	if (!ECPKParameters_print(bp, group, off))
       
   560 		goto err;
       
   561 	ret=1;
       
   562 err:
       
   563 	if (!ret)
       
   564  		ECerr(EC_F_EC_KEY_PRINT, reason);
       
   565 	if (pub_key) 
       
   566 		BN_free(pub_key);
       
   567 	if (order)
       
   568 		BN_free(order);
       
   569 	if (ctx)
       
   570 		BN_CTX_free(ctx);
       
   571 	if (buffer != NULL)
       
   572 		OPENSSL_free(buffer);
       
   573 	return(ret);
       
   574 	}
       
   575 #endif /* OPENSSL_NO_EC */
       
   576 
       
   577 static int print(BIO *bp, const char *number, const BIGNUM *num, unsigned char *buf,
       
   578 	     int off)
       
   579 	{
       
   580 	int n,i;
       
   581 	const char *neg;
       
   582 
       
   583 	if (num == NULL) return(1);
       
   584 	neg = (BN_is_negative(num))?"-":"";
       
   585 	if(!BIO_indent(bp,off,128))
       
   586 		return 0;
       
   587 	if (BN_is_zero(num))
       
   588 		{
       
   589 		if (BIO_printf(bp, "%s 0\n", number) <= 0)
       
   590 			return 0;
       
   591 		return 1;
       
   592 		}
       
   593 
       
   594 	if (BN_num_bytes(num) <= BN_BYTES)
       
   595 		{
       
   596 		if (BIO_printf(bp,"%s %s%lu (%s0x%lx)\n",number,neg,
       
   597 			(unsigned long)num->d[0],neg,(unsigned long)num->d[0])
       
   598 			<= 0) return(0);
       
   599 		}
       
   600 	else
       
   601 		{
       
   602 		buf[0]=0;
       
   603 		if (BIO_printf(bp,"%s%s",number,
       
   604 			(neg[0] == '-')?" (Negative)":"") <= 0)
       
   605 			return(0);
       
   606 		n=BN_bn2bin(num,&buf[1]);
       
   607 	
       
   608 		if (buf[1] & 0x80)
       
   609 			n++;
       
   610 		else	buf++;
       
   611 
       
   612 		for (i=0; i<n; i++)
       
   613 			{
       
   614 			if ((i%15) == 0)
       
   615 				{
       
   616 				if(BIO_puts(bp,"\n") <= 0
       
   617 				   || !BIO_indent(bp,off+4,128))
       
   618 				    return 0;
       
   619 				}
       
   620 			if (BIO_printf(bp,"%02x%s",buf[i],((i+1) == n)?"":":")
       
   621 				<= 0) return(0);
       
   622 			}
       
   623 		if (BIO_write(bp,"\n",1) <= 0) return(0);
       
   624 		}
       
   625 	return(1);
       
   626 	}
       
   627 
       
   628 #ifndef OPENSSL_NO_EC
       
   629 static int print_bin(BIO *fp, const char *name, const unsigned char *buf,
       
   630 		size_t len, int off)
       
   631 	{
       
   632 	size_t i;
       
   633 #ifndef SYMBIAN	
       
   634 	char str[128];
       
   635 #else
       
   636   char str[80];
       
   637 #endif	
       
   638 
       
   639 	if (buf == NULL)
       
   640 		return 1;
       
   641 	if (off)
       
   642 		{
       
   643 #ifndef SYMBIAN			
       
   644 		if (off > 128)
       
   645 			off=128;
       
   646 #else
       
   647 if (off > 80)
       
   648 			off=80;
       
   649 #endif			
       
   650 		memset(str,' ',off);
       
   651 		if (BIO_write(fp, str, off) <= 0)
       
   652 			return 0;
       
   653 		}
       
   654 
       
   655 	if (BIO_printf(fp,"%s", name) <= 0)
       
   656 		return 0;
       
   657 
       
   658 	for (i=0; i<len; i++)
       
   659 		{
       
   660 		if ((i%15) == 0)
       
   661 			{
       
   662 			str[0]='\n';
       
   663 			memset(&(str[1]),' ',off+4);
       
   664 			if (BIO_write(fp, str, off+1+4) <= 0)
       
   665 				return 0;
       
   666 			}
       
   667 		if (BIO_printf(fp,"%02x%s",buf[i],((i+1) == len)?"":":") <= 0)
       
   668 			return 0;
       
   669 		}
       
   670 	if (BIO_write(fp,"\n",1) <= 0)
       
   671 		return 0;
       
   672 
       
   673 	return 1;
       
   674 	}
       
   675 #endif
       
   676 
       
   677 #ifndef OPENSSL_NO_DH
       
   678 #ifndef OPENSSL_NO_FP_API
       
   679 EXPORT_C int DHparams_print_fp(FILE *fp, const DH *x)
       
   680 	{
       
   681 	BIO *b;
       
   682 	int ret;
       
   683 
       
   684 	if ((b=BIO_new(BIO_s_file())) == NULL)
       
   685 		{
       
   686 		DHerr(DH_F_DHPARAMS_PRINT_FP,ERR_R_BUF_LIB);
       
   687 		return(0);
       
   688 		}
       
   689 	BIO_set_fp(b,fp,BIO_NOCLOSE);
       
   690 	ret=DHparams_print(b, x);
       
   691 	BIO_free(b);
       
   692 	return(ret);
       
   693 	}
       
   694 #endif
       
   695 
       
   696 EXPORT_C int DHparams_print(BIO *bp, const DH *x)
       
   697 	{
       
   698 	unsigned char *m=NULL;
       
   699 	int reason=ERR_R_BUF_LIB,ret=0;
       
   700 	size_t buf_len=0, i;
       
   701 
       
   702 	if (x->p)
       
   703 		buf_len = (size_t)BN_num_bytes(x->p);
       
   704 	else
       
   705 		{
       
   706 		reason = ERR_R_PASSED_NULL_PARAMETER;
       
   707 		goto err;
       
   708 		}
       
   709 	if (x->g)
       
   710 		if (buf_len < (i = (size_t)BN_num_bytes(x->g)))
       
   711 			buf_len = i;
       
   712 	m=(unsigned char *)OPENSSL_malloc(buf_len+10);
       
   713 	if (m == NULL)
       
   714 		{
       
   715 		reason=ERR_R_MALLOC_FAILURE;
       
   716 		goto err;
       
   717 		}
       
   718 
       
   719 	if (BIO_printf(bp,"Diffie-Hellman-Parameters: (%d bit)\n",
       
   720 		BN_num_bits(x->p)) <= 0)
       
   721 		goto err;
       
   722 	if (!print(bp,"prime:",x->p,m,4)) goto err;
       
   723 	if (!print(bp,"generator:",x->g,m,4)) goto err;
       
   724 	if (x->length != 0)
       
   725 		{
       
   726 		if (BIO_printf(bp,"    recommended-private-length: %d bits\n",
       
   727 			(int)x->length) <= 0) goto err;
       
   728 		}
       
   729 	ret=1;
       
   730 	if (0)
       
   731 		{
       
   732 err:
       
   733 		DHerr(DH_F_DHPARAMS_PRINT,reason);
       
   734 		}
       
   735 	if (m != NULL) OPENSSL_free(m);
       
   736 	return(ret);
       
   737 	}
       
   738 #endif
       
   739 
       
   740 #ifndef OPENSSL_NO_DSA
       
   741 #ifndef OPENSSL_NO_FP_API
       
   742 EXPORT_C int DSAparams_print_fp(FILE *fp, const DSA *x)
       
   743 	{
       
   744 	BIO *b;
       
   745 	int ret;
       
   746 
       
   747 	if ((b=BIO_new(BIO_s_file())) == NULL)
       
   748 		{
       
   749 		DSAerr(DSA_F_DSAPARAMS_PRINT_FP,ERR_R_BUF_LIB);
       
   750 		return(0);
       
   751 		}
       
   752 	BIO_set_fp(b,fp,BIO_NOCLOSE);
       
   753 	ret=DSAparams_print(b, x);
       
   754 	BIO_free(b);
       
   755 	return(ret);
       
   756 	}
       
   757 #endif
       
   758 
       
   759 EXPORT_C int DSAparams_print(BIO *bp, const DSA *x)
       
   760 	{
       
   761 	unsigned char *m=NULL;
       
   762 	int ret=0;
       
   763 	size_t buf_len=0,i;
       
   764 
       
   765 	if (x->p)
       
   766 		buf_len = (size_t)BN_num_bytes(x->p);
       
   767 	else
       
   768 		{
       
   769 		DSAerr(DSA_F_DSAPARAMS_PRINT,DSA_R_MISSING_PARAMETERS);
       
   770 		goto err;
       
   771 		}
       
   772 	if (x->q)
       
   773 		if (buf_len < (i = (size_t)BN_num_bytes(x->q)))
       
   774 			buf_len = i;
       
   775 	if (x->g)
       
   776 		if (buf_len < (i = (size_t)BN_num_bytes(x->g)))
       
   777 			buf_len = i;
       
   778 	m=(unsigned char *)OPENSSL_malloc(buf_len+10);
       
   779 	if (m == NULL)
       
   780 		{
       
   781 		DSAerr(DSA_F_DSAPARAMS_PRINT,ERR_R_MALLOC_FAILURE);
       
   782 		goto err;
       
   783 		}
       
   784 
       
   785 	if (BIO_printf(bp,"DSA-Parameters: (%d bit)\n",
       
   786 		BN_num_bits(x->p)) <= 0)
       
   787 		goto err;
       
   788 	if (!print(bp,"p:",x->p,m,4)) goto err;
       
   789 	if ((x->q != NULL) && !print(bp,"q:",x->q,m,4)) goto err;
       
   790 	if ((x->g != NULL) && !print(bp,"g:",x->g,m,4)) goto err;
       
   791 	ret=1;
       
   792 err:
       
   793 	if (m != NULL) OPENSSL_free(m);
       
   794 	return(ret);
       
   795 	}
       
   796 
       
   797 #endif /* !OPENSSL_NO_DSA */
       
   798 
       
   799 #ifndef OPENSSL_NO_EC
       
   800 #ifndef OPENSSL_NO_FP_API
       
   801 EXPORT_C int ECParameters_print_fp(FILE *fp, const EC_KEY *x)
       
   802 	{
       
   803 	BIO *b;
       
   804 	int ret;
       
   805  
       
   806 	if ((b=BIO_new(BIO_s_file())) == NULL)
       
   807 		{
       
   808 		ECerr(EC_F_ECPARAMETERS_PRINT_FP, ERR_R_BIO_LIB);
       
   809 		return(0);
       
   810 		}
       
   811 	BIO_set_fp(b, fp, BIO_NOCLOSE);
       
   812 	ret = ECParameters_print(b, x);
       
   813 	BIO_free(b);
       
   814 	return(ret);
       
   815 	}
       
   816 #endif
       
   817 
       
   818 EXPORT_C int ECParameters_print(BIO *bp, const EC_KEY *x)
       
   819 	{
       
   820 	int     reason=ERR_R_EC_LIB, ret=0;
       
   821 	BIGNUM	*order=NULL;
       
   822 	const EC_GROUP *group;
       
   823  
       
   824 	if (x == NULL || (group = EC_KEY_get0_group(x)) == NULL)
       
   825 		{
       
   826 		reason = ERR_R_PASSED_NULL_PARAMETER;;
       
   827 		goto err;
       
   828 		}
       
   829 
       
   830 	if ((order = BN_new()) == NULL)
       
   831 		{
       
   832 		reason = ERR_R_MALLOC_FAILURE;
       
   833 		goto err;
       
   834 		}
       
   835 
       
   836 	if (!EC_GROUP_get_order(group, order, NULL))
       
   837 		{
       
   838 		reason = ERR_R_EC_LIB;
       
   839 		goto err;
       
   840 		}
       
   841  
       
   842 	if (BIO_printf(bp, "ECDSA-Parameters: (%d bit)\n", 
       
   843 		BN_num_bits(order)) <= 0)
       
   844 		goto err;
       
   845 	if (!ECPKParameters_print(bp, group, 4))
       
   846 		goto err;
       
   847 	ret=1;
       
   848 err:
       
   849 	if (order)
       
   850 		BN_free(order);
       
   851 	ECerr(EC_F_ECPARAMETERS_PRINT, reason);
       
   852 	return(ret);
       
   853 	}
       
   854   
       
   855 #endif