1 /* crypto/x509/x_all.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 #include <stdio.h>
  60 #include <openssl/stack.h>
  61 #include "cryptlib.h"
  62 #include <openssl/buffer.h>
  63 #include <openssl/asn1.h>
  64 #include <openssl/evp.h>
  65 #include <openssl/x509.h>
  66 #ifndef OPENSSL_NO_RSA
  67 #include <openssl/rsa.h>
  68 #endif
  69 #ifndef OPENSSL_NO_DSA
  70 #include <openssl/dsa.h>
  71 #endif
  72 
  73 int X509_verify(X509 *a, EVP_PKEY *r)
  74         {
  75         return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF),a->sig_alg,
  76                 a->signature,a->cert_info,r));
  77         }
  78 
  79 int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r)
  80         {
  81         return( ASN1_item_verify(ASN1_ITEM_rptr(X509_REQ_INFO),
  82                 a->sig_alg,a->signature,a->req_info,r));
  83         }
  84 
  85 int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r)
  86         {
  87         return(ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC),
  88                 a->sig_algor,a->signature,a->spkac,r));
  89         }
  90 
  91 int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
  92         {
  93         x->cert_info->enc.modified = 1;
  94         return(ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature,
  95                 x->sig_alg, x->signature, x->cert_info,pkey,md));
  96         }
  97 
  98 int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx)
  99         {
 100         x->cert_info->enc.modified = 1;
 101         return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF),
 102                 x->cert_info->signature,
 103                 x->sig_alg, x->signature, x->cert_info, ctx);
 104         }
 105 
 106 int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md)
 107         {
 108         return(ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO),x->sig_alg, NULL,
 109                 x->signature, x->req_info,pkey,md));
 110         }
 111 
 112 int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx)
 113         {
 114         return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO),
 115                 x->sig_alg, NULL, x->signature, x->req_info, ctx);
 116         }
 117 
 118 int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md)
 119         {
 120         x->crl->enc.modified = 1;
 121         return(ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO),x->crl->sig_alg,
 122                 x->sig_alg, x->signature, x->crl,pkey,md));
 123         }
 124 
 125 int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx)
 126         {
 127         x->crl->enc.modified = 1;
 128         return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO),
 129                 x->crl->sig_alg, x->sig_alg, x->signature, x->crl, ctx);
 130         }
 131 
 132 int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md)
 133         {
 134         return(ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor,NULL,
 135                 x->signature, x->spkac,pkey,md));
 136         }
 137 
 138 #ifndef OPENSSL_NO_FP_API
 139 X509 *d2i_X509_fp(FILE *fp, X509 **x509)
 140         {
 141         return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
 142         }
 143 
 144 int i2d_X509_fp(FILE *fp, X509 *x509)
 145         {
 146         return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509);
 147         }
 148 #endif
 149 
 150 X509 *d2i_X509_bio(BIO *bp, X509 **x509)
 151         {
 152         return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509);
 153         }
 154 
 155 int i2d_X509_bio(BIO *bp, X509 *x509)
 156         {
 157         return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
 158         }
 159 
 160 #ifndef OPENSSL_NO_FP_API
 161 X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl)
 162         {
 163         return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
 164         }
 165 
 166 int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl)
 167         {
 168         return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
 169         }
 170 #endif
 171 
 172 X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl)
 173         {
 174         return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
 175         }
 176 
 177 int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl)
 178         {
 179         return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
 180         }
 181 
 182 #ifndef OPENSSL_NO_FP_API
 183 PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7)
 184         {
 185         return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
 186         }
 187 
 188 int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7)
 189         {
 190         return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
 191         }
 192 #endif
 193 
 194 PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7)
 195         {
 196         return ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
 197         }
 198 
 199 int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7)
 200         {
 201         return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
 202         }
 203 
 204 #ifndef OPENSSL_NO_FP_API
 205 X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req)
 206         {
 207         return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
 208         }
 209 
 210 int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req)
 211         {
 212         return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
 213         }
 214 #endif
 215 
 216 X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req)
 217         {
 218         return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
 219         }
 220 
 221 int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req)
 222         {
 223         return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
 224         }
 225 
 226 #ifndef OPENSSL_NO_RSA
 227 
 228 #ifndef OPENSSL_NO_FP_API
 229 RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa)
 230         {
 231         return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
 232         }
 233 
 234 int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa)
 235         {
 236         return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
 237         }
 238 
 239 RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa)
 240         {
 241         return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
 242         }
 243 
 244 
 245 RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa)
 246         {
 247         return ASN1_d2i_fp((void *(*)(void))
 248                            RSA_new,(D2I_OF(void))d2i_RSA_PUBKEY, fp,
 249                            (void **)rsa);
 250         }
 251 
 252 int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa)
 253         {
 254         return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
 255         }
 256 
 257 int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa)
 258         {
 259         return ASN1_i2d_fp((I2D_OF(void))i2d_RSA_PUBKEY,fp,rsa);
 260         }
 261 #endif
 262 
 263 RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa)
 264         {
 265         return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
 266         }
 267 
 268 int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa)
 269         {
 270         return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
 271         }
 272 
 273 RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa)
 274         {
 275         return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
 276         }
 277 
 278 
 279 RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa)
 280         {
 281         return ASN1_d2i_bio_of(RSA,RSA_new,d2i_RSA_PUBKEY,bp,rsa);
 282         }
 283 
 284 int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa)
 285         {
 286         return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
 287         }
 288 
 289 int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa)
 290         {
 291         return ASN1_i2d_bio_of(RSA,i2d_RSA_PUBKEY,bp,rsa);
 292         }
 293 #endif
 294 
 295 #ifndef OPENSSL_NO_DSA
 296 #ifndef OPENSSL_NO_FP_API
 297 DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa)
 298         {
 299         return ASN1_d2i_fp_of(DSA,DSA_new,d2i_DSAPrivateKey,fp,dsa);
 300         }
 301 
 302 int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa)
 303         {
 304         return ASN1_i2d_fp_of_const(DSA,i2d_DSAPrivateKey,fp,dsa);
 305         }
 306 
 307 DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa)
 308         {
 309         return ASN1_d2i_fp_of(DSA,DSA_new,d2i_DSA_PUBKEY,fp,dsa);
 310         }
 311 
 312 int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa)
 313         {
 314         return ASN1_i2d_fp_of(DSA,i2d_DSA_PUBKEY,fp,dsa);
 315         }
 316 #endif
 317 
 318 DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa)
 319         {
 320         return ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSAPrivateKey,bp,dsa
 321 );
 322         }
 323 
 324 int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa)
 325         {
 326         return ASN1_i2d_bio_of_const(DSA,i2d_DSAPrivateKey,bp,dsa);
 327         }
 328 
 329 DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa)
 330         {
 331         return ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSA_PUBKEY,bp,dsa);
 332         }
 333 
 334 int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa)
 335         {
 336         return ASN1_i2d_bio_of(DSA,i2d_DSA_PUBKEY,bp,dsa);
 337         }
 338 
 339 #endif
 340 
 341 #ifndef OPENSSL_NO_EC
 342 #ifndef OPENSSL_NO_FP_API
 343 EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey)
 344         {
 345         return ASN1_d2i_fp_of(EC_KEY,EC_KEY_new,d2i_EC_PUBKEY,fp,eckey);
 346         }
 347 
 348 int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey)
 349         {
 350         return ASN1_i2d_fp_of(EC_KEY,i2d_EC_PUBKEY,fp,eckey);
 351         }
 352 
 353 EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey)
 354         {
 355         return ASN1_d2i_fp_of(EC_KEY,EC_KEY_new,d2i_ECPrivateKey,fp,eckey);
 356         }
 357 
 358 int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey)
 359         {
 360         return ASN1_i2d_fp_of(EC_KEY,i2d_ECPrivateKey,fp,eckey);
 361         }
 362 #endif
 363 EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey)
 364         {
 365         return ASN1_d2i_bio_of(EC_KEY,EC_KEY_new,d2i_EC_PUBKEY,bp,eckey);
 366         }
 367 
 368 int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *ecdsa)
 369         {
 370         return ASN1_i2d_bio_of(EC_KEY,i2d_EC_PUBKEY,bp,ecdsa);
 371         }
 372 
 373 EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey)
 374         {
 375         return ASN1_d2i_bio_of(EC_KEY,EC_KEY_new,d2i_ECPrivateKey,bp,eckey);
 376         }
 377 
 378 int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey)
 379         {
 380         return ASN1_i2d_bio_of(EC_KEY,i2d_ECPrivateKey,bp,eckey);
 381         }
 382 #endif
 383 
 384 
 385 int X509_pubkey_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
 386              unsigned int *len)
 387         {
 388         ASN1_BIT_STRING *key;
 389         key = X509_get0_pubkey_bitstr(data);
 390         if(!key) return 0;
 391         return EVP_Digest(key->data, key->length, md, len, type, NULL);
 392         }
 393 
 394 int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
 395              unsigned int *len)
 396         {
 397         return(ASN1_item_digest(ASN1_ITEM_rptr(X509),type,(char *)data,md,len));
 398         }
 399 
 400 int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, unsigned char *md,
 401              unsigned int *len)
 402         {
 403         return(ASN1_item_digest(ASN1_ITEM_rptr(X509_CRL),type,(char *)data,md,len));
 404         }
 405 
 406 int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, unsigned char *md,
 407              unsigned int *len)
 408         {
 409         return(ASN1_item_digest(ASN1_ITEM_rptr(X509_REQ),type,(char *)data,md,len));
 410         }
 411 
 412 int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, unsigned char *md,
 413              unsigned int *len)
 414         {
 415         return(ASN1_item_digest(ASN1_ITEM_rptr(X509_NAME),type,(char *)data,md,len));
 416         }
 417 
 418 int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, const EVP_MD *type,
 419              unsigned char *md, unsigned int *len)
 420         {
 421         return(ASN1_item_digest(ASN1_ITEM_rptr(PKCS7_ISSUER_AND_SERIAL),type,
 422                 (char *)data,md,len));
 423         }
 424 
 425 
 426 #ifndef OPENSSL_NO_FP_API
 427 X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8)
 428         {
 429         return ASN1_d2i_fp_of(X509_SIG,X509_SIG_new,d2i_X509_SIG,fp,p8);
 430         }
 431 
 432 int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8)
 433         {
 434         return ASN1_i2d_fp_of(X509_SIG,i2d_X509_SIG,fp,p8);
 435         }
 436 #endif
 437 
 438 X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8)
 439         {
 440         return ASN1_d2i_bio_of(X509_SIG,X509_SIG_new,d2i_X509_SIG,bp,p8);
 441         }
 442 
 443 int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8)
 444         {
 445         return ASN1_i2d_bio_of(X509_SIG,i2d_X509_SIG,bp,p8);
 446         }
 447 
 448 #ifndef OPENSSL_NO_FP_API
 449 PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
 450                                                  PKCS8_PRIV_KEY_INFO **p8inf)
 451         {
 452         return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO,PKCS8_PRIV_KEY_INFO_new,
 453                               d2i_PKCS8_PRIV_KEY_INFO,fp,p8inf);
 454         }
 455 
 456 int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf)
 457         {
 458         return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO,i2d_PKCS8_PRIV_KEY_INFO,fp,
 459                               p8inf);
 460         }
 461 
 462 int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key)
 463         {
 464         PKCS8_PRIV_KEY_INFO *p8inf;
 465         int ret;
 466         p8inf = EVP_PKEY2PKCS8(key);
 467         if(!p8inf) return 0;
 468         ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf);
 469         PKCS8_PRIV_KEY_INFO_free(p8inf);
 470         return ret;
 471         }
 472 
 473 int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey)
 474         {
 475         return ASN1_i2d_fp_of(EVP_PKEY,i2d_PrivateKey,fp,pkey);
 476         }
 477 
 478 EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a)
 479 {
 480         return ASN1_d2i_fp_of(EVP_PKEY,EVP_PKEY_new,d2i_AutoPrivateKey,fp,a);
 481 }
 482 
 483 int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey)
 484         {
 485         return ASN1_i2d_fp_of(EVP_PKEY,i2d_PUBKEY,fp,pkey);
 486         }
 487 
 488 EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a)
 489 {
 490         return ASN1_d2i_fp_of(EVP_PKEY,EVP_PKEY_new,d2i_PUBKEY,fp,a);
 491 }
 492 
 493 #endif
 494 
 495 PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
 496                                                  PKCS8_PRIV_KEY_INFO **p8inf)
 497         {
 498         return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO,PKCS8_PRIV_KEY_INFO_new,
 499                             d2i_PKCS8_PRIV_KEY_INFO,bp,p8inf);
 500         }
 501 
 502 int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf)
 503         {
 504         return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO,i2d_PKCS8_PRIV_KEY_INFO,bp,
 505                                p8inf);
 506         }
 507 
 508 int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key)
 509         {
 510         PKCS8_PRIV_KEY_INFO *p8inf;
 511         int ret;
 512         p8inf = EVP_PKEY2PKCS8(key);
 513         if(!p8inf) return 0;
 514         ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
 515         PKCS8_PRIV_KEY_INFO_free(p8inf);
 516         return ret;
 517         }
 518 
 519 int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey)
 520         {
 521         return ASN1_i2d_bio_of(EVP_PKEY,i2d_PrivateKey,bp,pkey);
 522         }
 523 
 524 EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a)
 525         {
 526         return ASN1_d2i_bio_of(EVP_PKEY,EVP_PKEY_new,d2i_AutoPrivateKey,bp,a);
 527         }
 528 
 529 int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey)
 530         {
 531         return ASN1_i2d_bio_of(EVP_PKEY,i2d_PUBKEY,bp,pkey);
 532         }
 533 
 534 EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a)
 535         {
 536         return ASN1_d2i_bio_of(EVP_PKEY,EVP_PKEY_new,d2i_PUBKEY,bp,a);
 537         }