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