Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

548 строки
15 KiB

  1. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  2. * All rights reserved.
  3. *
  4. * This package is an SSL implementation written
  5. * by Eric Young (eay@cryptsoft.com).
  6. * The implementation was written so as to conform with Netscapes SSL.
  7. *
  8. * This library is free for commercial and non-commercial use as long as
  9. * the following conditions are aheared to. The following conditions
  10. * apply to all code found in this distribution, be it the RC4, RSA,
  11. * lhash, DES, etc., code; not just the SSL code. The SSL documentation
  12. * included with this distribution is covered by the same copyright terms
  13. * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  14. *
  15. * Copyright remains Eric Young's, and as such any Copyright notices in
  16. * the code are not to be removed.
  17. * If this package is used in a product, Eric Young should be given attribution
  18. * as the author of the parts of the library used.
  19. * This can be in the form of a textual message at program startup or
  20. * in documentation (online or textual) provided with the package.
  21. *
  22. * Redistribution and use in source and binary forms, with or without
  23. * modification, are permitted provided that the following conditions
  24. * are met:
  25. * 1. Redistributions of source code must retain the copyright
  26. * notice, this list of conditions and the following disclaimer.
  27. * 2. Redistributions in binary form must reproduce the above copyright
  28. * notice, this list of conditions and the following disclaimer in the
  29. * documentation and/or other materials provided with the distribution.
  30. * 3. All advertising materials mentioning features or use of this software
  31. * must display the following acknowledgement:
  32. * "This product includes cryptographic software written by
  33. * Eric Young (eay@cryptsoft.com)"
  34. * The word 'cryptographic' can be left out if the rouines from the library
  35. * being used are not cryptographic related :-).
  36. * 4. If you include any Windows specific code (or a derivative thereof) from
  37. * the apps directory (application code) you must include an acknowledgement:
  38. * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  39. *
  40. * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  41. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  42. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  43. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  44. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  45. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  46. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  48. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  49. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  50. * SUCH DAMAGE.
  51. *
  52. * The licence and distribution terms for any publically available version or
  53. * derivative of this code cannot be changed. i.e. this code cannot simply be
  54. * copied and put under another distribution licence
  55. * [including the GNU Public Licence.] */
  56. #include <openssl/asn1.h>
  57. #include <openssl/buf.h>
  58. #include <openssl/digest.h>
  59. #include <openssl/dsa.h>
  60. #include <openssl/evp.h>
  61. #include <openssl/rsa.h>
  62. #include <openssl/stack.h>
  63. #include <openssl/x509.h>
  64. int X509_verify(X509 *a, EVP_PKEY *r)
  65. {
  66. if (X509_ALGOR_cmp(a->sig_alg, a->cert_info->signature))
  67. return 0;
  68. return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF),a->sig_alg,
  69. a->signature,a->cert_info,r));
  70. }
  71. int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r)
  72. {
  73. return( ASN1_item_verify(ASN1_ITEM_rptr(X509_REQ_INFO),
  74. a->sig_alg,a->signature,a->req_info,r));
  75. }
  76. int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
  77. {
  78. x->cert_info->enc.modified = 1;
  79. return(ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature,
  80. x->sig_alg, x->signature, x->cert_info,pkey,md));
  81. }
  82. int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx)
  83. {
  84. x->cert_info->enc.modified = 1;
  85. return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF),
  86. x->cert_info->signature,
  87. x->sig_alg, x->signature, x->cert_info, ctx);
  88. }
  89. /* TODO(fork)
  90. int X509_http_nbio(OCSP_REQ_CTX *rctx, X509 **pcert)
  91. {
  92. return OCSP_REQ_CTX_nbio_d2i(rctx,
  93. (ASN1_VALUE **)pcert, ASN1_ITEM_rptr(X509));
  94. }
  95. */
  96. int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md)
  97. {
  98. return(ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO),x->sig_alg, NULL,
  99. x->signature, x->req_info,pkey,md));
  100. }
  101. int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx)
  102. {
  103. return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO),
  104. x->sig_alg, NULL, x->signature, x->req_info, ctx);
  105. }
  106. int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md)
  107. {
  108. x->crl->enc.modified = 1;
  109. return(ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO),x->crl->sig_alg,
  110. x->sig_alg, x->signature, x->crl,pkey,md));
  111. }
  112. int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx)
  113. {
  114. x->crl->enc.modified = 1;
  115. return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO),
  116. x->crl->sig_alg, x->sig_alg, x->signature, x->crl, ctx);
  117. }
  118. /* TODO(fork)
  119. int X509_CRL_http_nbio(OCSP_REQ_CTX *rctx, X509_CRL **pcrl)
  120. {
  121. return OCSP_REQ_CTX_nbio_d2i(rctx,
  122. (ASN1_VALUE **)pcrl, ASN1_ITEM_rptr(X509_CRL));
  123. }
  124. */
  125. int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md)
  126. {
  127. return(ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor,NULL,
  128. x->signature, x->spkac,pkey,md));
  129. }
  130. int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *x, EVP_PKEY *pkey)
  131. {
  132. return (ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor,
  133. x->signature, x->spkac, pkey));
  134. }
  135. #ifndef OPENSSL_NO_FP_API
  136. X509 *d2i_X509_fp(FILE *fp, X509 **x509)
  137. {
  138. return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
  139. }
  140. int i2d_X509_fp(FILE *fp, X509 *x509)
  141. {
  142. return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509);
  143. }
  144. #endif
  145. X509 *d2i_X509_bio(BIO *bp, X509 **x509)
  146. {
  147. return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509);
  148. }
  149. int i2d_X509_bio(BIO *bp, X509 *x509)
  150. {
  151. return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
  152. }
  153. #ifndef OPENSSL_NO_FP_API
  154. X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl)
  155. {
  156. return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
  157. }
  158. int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl)
  159. {
  160. return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
  161. }
  162. #endif
  163. X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl)
  164. {
  165. return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
  166. }
  167. int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl)
  168. {
  169. return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
  170. }
  171. /* TODO(fork) */
  172. #if 0
  173. #ifndef OPENSSL_NO_FP_API
  174. PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7)
  175. {
  176. return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
  177. }
  178. int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7)
  179. {
  180. return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
  181. }
  182. #endif
  183. PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7)
  184. {
  185. return ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
  186. }
  187. int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7)
  188. {
  189. return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
  190. }
  191. #endif
  192. #ifndef OPENSSL_NO_FP_API
  193. X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req)
  194. {
  195. return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
  196. }
  197. int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req)
  198. {
  199. return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
  200. }
  201. #endif
  202. X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req)
  203. {
  204. return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
  205. }
  206. int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req)
  207. {
  208. return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
  209. }
  210. #ifndef OPENSSL_NO_FP_API
  211. RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa)
  212. {
  213. return ASN1_d2i_fp_of(RSA, RSA_new, d2i_RSAPrivateKey, fp, rsa);
  214. }
  215. int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa)
  216. {
  217. return ASN1_i2d_fp_of_const(RSA, i2d_RSAPrivateKey, fp, rsa);
  218. }
  219. RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa)
  220. {
  221. return ASN1_d2i_fp_of(RSA, RSA_new, d2i_RSAPublicKey, fp, rsa);
  222. }
  223. RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa)
  224. {
  225. return ASN1_d2i_fp((void *(*)(void))
  226. RSA_new,(D2I_OF(void))d2i_RSA_PUBKEY, fp,
  227. (void **)rsa);
  228. }
  229. int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa)
  230. {
  231. return ASN1_i2d_fp_of_const(RSA, i2d_RSAPublicKey, fp, rsa);
  232. }
  233. int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa)
  234. {
  235. return ASN1_i2d_fp((I2D_OF_const(void))i2d_RSA_PUBKEY,fp,rsa);
  236. }
  237. #endif
  238. RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa)
  239. {
  240. return ASN1_d2i_bio_of(RSA, RSA_new, d2i_RSAPrivateKey, bp, rsa);
  241. }
  242. int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa)
  243. {
  244. return ASN1_i2d_bio_of_const(RSA, i2d_RSAPrivateKey, bp, rsa);
  245. }
  246. RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa)
  247. {
  248. return ASN1_d2i_bio_of(RSA, RSA_new, d2i_RSAPublicKey, bp, rsa);
  249. }
  250. RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa)
  251. {
  252. return ASN1_d2i_bio_of(RSA,RSA_new,d2i_RSA_PUBKEY,bp,rsa);
  253. }
  254. int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa)
  255. {
  256. return ASN1_i2d_bio_of_const(RSA, i2d_RSAPublicKey, bp, rsa);
  257. }
  258. int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa)
  259. {
  260. return ASN1_i2d_bio_of_const(RSA,i2d_RSA_PUBKEY,bp,rsa);
  261. }
  262. #ifndef OPENSSL_NO_DSA
  263. #ifndef OPENSSL_NO_FP_API
  264. DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa)
  265. {
  266. return ASN1_d2i_fp_of(DSA,DSA_new,d2i_DSAPrivateKey,fp,dsa);
  267. }
  268. int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa)
  269. {
  270. return ASN1_i2d_fp_of_const(DSA,i2d_DSAPrivateKey,fp,dsa);
  271. }
  272. DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa)
  273. {
  274. return ASN1_d2i_fp_of(DSA,DSA_new,d2i_DSA_PUBKEY,fp,dsa);
  275. }
  276. int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa)
  277. {
  278. return ASN1_i2d_fp_of_const(DSA,i2d_DSA_PUBKEY,fp,dsa);
  279. }
  280. #endif
  281. DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa)
  282. {
  283. return ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSAPrivateKey,bp,dsa
  284. );
  285. }
  286. int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa)
  287. {
  288. return ASN1_i2d_bio_of_const(DSA,i2d_DSAPrivateKey,bp,dsa);
  289. }
  290. DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa)
  291. {
  292. return ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSA_PUBKEY,bp,dsa);
  293. }
  294. int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa)
  295. {
  296. return ASN1_i2d_bio_of_const(DSA,i2d_DSA_PUBKEY,bp,dsa);
  297. }
  298. #endif
  299. #ifndef OPENSSL_NO_FP_API
  300. EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey)
  301. {
  302. return ASN1_d2i_fp_of(EC_KEY,EC_KEY_new,d2i_EC_PUBKEY,fp,eckey);
  303. }
  304. int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey)
  305. {
  306. return ASN1_i2d_fp_of_const(EC_KEY,i2d_EC_PUBKEY,fp,eckey);
  307. }
  308. EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey)
  309. {
  310. return ASN1_d2i_fp_of(EC_KEY,EC_KEY_new,d2i_ECPrivateKey,fp,eckey);
  311. }
  312. int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey)
  313. {
  314. return ASN1_i2d_fp_of_const(EC_KEY,i2d_ECPrivateKey,fp,eckey);
  315. }
  316. #endif
  317. EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey)
  318. {
  319. return ASN1_d2i_bio_of(EC_KEY,EC_KEY_new,d2i_EC_PUBKEY,bp,eckey);
  320. }
  321. int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *ecdsa)
  322. {
  323. return ASN1_i2d_bio_of_const(EC_KEY,i2d_EC_PUBKEY,bp,ecdsa);
  324. }
  325. EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey)
  326. {
  327. return ASN1_d2i_bio_of(EC_KEY,EC_KEY_new,d2i_ECPrivateKey,bp,eckey);
  328. }
  329. int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey)
  330. {
  331. return ASN1_i2d_bio_of_const(EC_KEY,i2d_ECPrivateKey,bp,eckey);
  332. }
  333. int X509_pubkey_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
  334. unsigned int *len)
  335. {
  336. ASN1_BIT_STRING *key;
  337. key = X509_get0_pubkey_bitstr(data);
  338. if(!key) return 0;
  339. return EVP_Digest(key->data, key->length, md, len, type, NULL);
  340. }
  341. int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
  342. unsigned int *len)
  343. {
  344. return(ASN1_item_digest(ASN1_ITEM_rptr(X509),type,(char *)data,md,len));
  345. }
  346. int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, unsigned char *md,
  347. unsigned int *len)
  348. {
  349. return(ASN1_item_digest(ASN1_ITEM_rptr(X509_CRL),type,(char *)data,md,len));
  350. }
  351. int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, unsigned char *md,
  352. unsigned int *len)
  353. {
  354. return(ASN1_item_digest(ASN1_ITEM_rptr(X509_REQ),type,(char *)data,md,len));
  355. }
  356. int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, unsigned char *md,
  357. unsigned int *len)
  358. {
  359. return(ASN1_item_digest(ASN1_ITEM_rptr(X509_NAME),type,(char *)data,md,len));
  360. }
  361. #if 0 /* TODO(fork): remove */
  362. int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, const EVP_MD *type,
  363. unsigned char *md, unsigned int *len)
  364. {
  365. return(ASN1_item_digest(ASN1_ITEM_rptr(PKCS7_ISSUER_AND_SERIAL),type,
  366. (char *)data,md,len));
  367. }
  368. #endif
  369. #ifndef OPENSSL_NO_FP_API
  370. X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8)
  371. {
  372. return ASN1_d2i_fp_of(X509_SIG,X509_SIG_new,d2i_X509_SIG,fp,p8);
  373. }
  374. int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8)
  375. {
  376. return ASN1_i2d_fp_of(X509_SIG,i2d_X509_SIG,fp,p8);
  377. }
  378. #endif
  379. X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8)
  380. {
  381. return ASN1_d2i_bio_of(X509_SIG,X509_SIG_new,d2i_X509_SIG,bp,p8);
  382. }
  383. int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8)
  384. {
  385. return ASN1_i2d_bio_of(X509_SIG,i2d_X509_SIG,bp,p8);
  386. }
  387. #ifndef OPENSSL_NO_FP_API
  388. PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
  389. PKCS8_PRIV_KEY_INFO **p8inf)
  390. {
  391. return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO,PKCS8_PRIV_KEY_INFO_new,
  392. d2i_PKCS8_PRIV_KEY_INFO,fp,p8inf);
  393. }
  394. int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf)
  395. {
  396. return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO,i2d_PKCS8_PRIV_KEY_INFO,fp,
  397. p8inf);
  398. }
  399. int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key)
  400. {
  401. PKCS8_PRIV_KEY_INFO *p8inf;
  402. int ret;
  403. p8inf = EVP_PKEY2PKCS8(key);
  404. if(!p8inf) return 0;
  405. ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf);
  406. PKCS8_PRIV_KEY_INFO_free(p8inf);
  407. return ret;
  408. }
  409. int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey)
  410. {
  411. return ASN1_i2d_fp_of_const(EVP_PKEY,i2d_PrivateKey,fp,pkey);
  412. }
  413. EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a)
  414. {
  415. return ASN1_d2i_fp_of(EVP_PKEY,EVP_PKEY_new,d2i_AutoPrivateKey,fp,a);
  416. }
  417. int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey)
  418. {
  419. return ASN1_i2d_fp_of_const(EVP_PKEY,i2d_PUBKEY,fp,pkey);
  420. }
  421. EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a)
  422. {
  423. return ASN1_d2i_fp_of(EVP_PKEY,EVP_PKEY_new,d2i_PUBKEY,fp,a);
  424. }
  425. PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
  426. PKCS8_PRIV_KEY_INFO **p8inf)
  427. {
  428. return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO,PKCS8_PRIV_KEY_INFO_new,
  429. d2i_PKCS8_PRIV_KEY_INFO,bp,p8inf);
  430. }
  431. int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf)
  432. {
  433. return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO,i2d_PKCS8_PRIV_KEY_INFO,bp,
  434. p8inf);
  435. }
  436. int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key)
  437. {
  438. PKCS8_PRIV_KEY_INFO *p8inf;
  439. int ret;
  440. p8inf = EVP_PKEY2PKCS8(key);
  441. if(!p8inf) return 0;
  442. ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
  443. PKCS8_PRIV_KEY_INFO_free(p8inf);
  444. return ret;
  445. }
  446. #endif
  447. int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey)
  448. {
  449. return ASN1_i2d_bio_of_const(EVP_PKEY,i2d_PrivateKey,bp,pkey);
  450. }
  451. EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a)
  452. {
  453. return ASN1_d2i_bio_of(EVP_PKEY,EVP_PKEY_new,d2i_AutoPrivateKey,bp,a);
  454. }
  455. int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey)
  456. {
  457. return ASN1_i2d_bio_of_const(EVP_PKEY,i2d_PUBKEY,bp,pkey);
  458. }
  459. EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a)
  460. {
  461. return ASN1_d2i_bio_of(EVP_PKEY,EVP_PKEY_new,d2i_PUBKEY,bp,a);
  462. }