t_pkey.c
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:19k
源码类别:

其他游戏

开发平台:

Visual C++

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