1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/ssl/libcrypto/src/crypto/x509/x_all.c Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,522 @@
1.4 +/* crypto/x509/x_all.c */
1.5 +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
1.6 + * All rights reserved.
1.7 + *
1.8 + * This package is an SSL implementation written
1.9 + * by Eric Young (eay@cryptsoft.com).
1.10 + * The implementation was written so as to conform with Netscapes SSL.
1.11 + *
1.12 + * This library is free for commercial and non-commercial use as long as
1.13 + * the following conditions are aheared to. The following conditions
1.14 + * apply to all code found in this distribution, be it the RC4, RSA,
1.15 + * lhash, DES, etc., code; not just the SSL code. The SSL documentation
1.16 + * included with this distribution is covered by the same copyright terms
1.17 + * except that the holder is Tim Hudson (tjh@cryptsoft.com).
1.18 + *
1.19 + * Copyright remains Eric Young's, and as such any Copyright notices in
1.20 + * the code are not to be removed.
1.21 + * If this package is used in a product, Eric Young should be given attribution
1.22 + * as the author of the parts of the library used.
1.23 + * This can be in the form of a textual message at program startup or
1.24 + * in documentation (online or textual) provided with the package.
1.25 + *
1.26 + * Redistribution and use in source and binary forms, with or without
1.27 + * modification, are permitted provided that the following conditions
1.28 + * are met:
1.29 + * 1. Redistributions of source code must retain the copyright
1.30 + * notice, this list of conditions and the following disclaimer.
1.31 + * 2. Redistributions in binary form must reproduce the above copyright
1.32 + * notice, this list of conditions and the following disclaimer in the
1.33 + * documentation and/or other materials provided with the distribution.
1.34 + * 3. All advertising materials mentioning features or use of this software
1.35 + * must display the following acknowledgement:
1.36 + * "This product includes cryptographic software written by
1.37 + * Eric Young (eay@cryptsoft.com)"
1.38 + * The word 'cryptographic' can be left out if the rouines from the library
1.39 + * being used are not cryptographic related :-).
1.40 + * 4. If you include any Windows specific code (or a derivative thereof) from
1.41 + * the apps directory (application code) you must include an acknowledgement:
1.42 + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
1.43 + *
1.44 + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
1.45 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1.46 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1.47 + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1.48 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1.49 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1.50 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1.51 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1.52 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1.53 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1.54 + * SUCH DAMAGE.
1.55 + *
1.56 + * The licence and distribution terms for any publically available version or
1.57 + * derivative of this code cannot be changed. i.e. this code cannot simply be
1.58 + * copied and put under another distribution licence
1.59 + * [including the GNU Public Licence.]
1.60 + */
1.61 +
1.62 +#include <stdio.h>
1.63 +#undef SSLEAY_MACROS
1.64 +#include <openssl/stack.h>
1.65 +#include "cryptlib.h"
1.66 +#include <openssl/buffer.h>
1.67 +#include <openssl/asn1.h>
1.68 +#include <openssl/evp.h>
1.69 +#include <openssl/x509.h>
1.70 +#ifndef OPENSSL_NO_RSA
1.71 +#include <openssl/rsa.h>
1.72 +#endif
1.73 +#ifndef OPENSSL_NO_DSA
1.74 +#include <openssl/dsa.h>
1.75 +#endif
1.76 +
1.77 +EXPORT_C int X509_verify(X509 *a, EVP_PKEY *r)
1.78 + {
1.79 + return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF),a->sig_alg,
1.80 + a->signature,a->cert_info,r));
1.81 + }
1.82 +
1.83 +EXPORT_C int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r)
1.84 + {
1.85 + return( ASN1_item_verify(ASN1_ITEM_rptr(X509_REQ_INFO),
1.86 + a->sig_alg,a->signature,a->req_info,r));
1.87 + }
1.88 +
1.89 +EXPORT_C int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r)
1.90 + {
1.91 + return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CRL_INFO),
1.92 + a->sig_alg, a->signature,a->crl,r));
1.93 + }
1.94 +
1.95 +EXPORT_C int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r)
1.96 + {
1.97 + return(ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC),
1.98 + a->sig_algor,a->signature,a->spkac,r));
1.99 + }
1.100 +
1.101 +EXPORT_C int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
1.102 + {
1.103 + return(ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature,
1.104 + x->sig_alg, x->signature, x->cert_info,pkey,md));
1.105 + }
1.106 +
1.107 +EXPORT_C int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md)
1.108 + {
1.109 + return(ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO),x->sig_alg, NULL,
1.110 + x->signature, x->req_info,pkey,md));
1.111 + }
1.112 +
1.113 +EXPORT_C int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md)
1.114 + {
1.115 + x->crl->enc.modified = 1;
1.116 + return(ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO),x->crl->sig_alg,
1.117 + x->sig_alg, x->signature, x->crl,pkey,md));
1.118 + }
1.119 +
1.120 +EXPORT_C int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md)
1.121 + {
1.122 + return(ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor,NULL,
1.123 + x->signature, x->spkac,pkey,md));
1.124 + }
1.125 +
1.126 +#ifndef OPENSSL_NO_FP_API
1.127 +EXPORT_C X509 *d2i_X509_fp(FILE *fp, X509 **x509)
1.128 + {
1.129 + return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
1.130 + }
1.131 +
1.132 +EXPORT_C int i2d_X509_fp(FILE *fp, X509 *x509)
1.133 + {
1.134 + return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509);
1.135 + }
1.136 +#endif
1.137 +
1.138 +EXPORT_C X509 *d2i_X509_bio(BIO *bp, X509 **x509)
1.139 + {
1.140 + return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509);
1.141 + }
1.142 +
1.143 +EXPORT_C int i2d_X509_bio(BIO *bp, X509 *x509)
1.144 + {
1.145 + return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
1.146 + }
1.147 +
1.148 +#ifndef OPENSSL_NO_FP_API
1.149 +EXPORT_C X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl)
1.150 + {
1.151 + return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
1.152 + }
1.153 +
1.154 +EXPORT_C int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl)
1.155 + {
1.156 + return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
1.157 + }
1.158 +#endif
1.159 +
1.160 +EXPORT_C X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl)
1.161 + {
1.162 + return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
1.163 + }
1.164 +
1.165 +EXPORT_C int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl)
1.166 + {
1.167 + return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
1.168 + }
1.169 +
1.170 +#ifndef OPENSSL_NO_FP_API
1.171 +EXPORT_C PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7)
1.172 + {
1.173 + return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
1.174 + }
1.175 +
1.176 +EXPORT_C int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7)
1.177 + {
1.178 + return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
1.179 + }
1.180 +#endif
1.181 +
1.182 +EXPORT_C PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7)
1.183 + {
1.184 + return ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
1.185 + }
1.186 +
1.187 +EXPORT_C int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7)
1.188 + {
1.189 + return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
1.190 + }
1.191 +
1.192 +#ifndef OPENSSL_NO_FP_API
1.193 +EXPORT_C X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req)
1.194 + {
1.195 + return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
1.196 + }
1.197 +
1.198 +EXPORT_C int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req)
1.199 + {
1.200 + return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
1.201 + }
1.202 +#endif
1.203 +
1.204 +EXPORT_C X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req)
1.205 + {
1.206 + return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
1.207 + }
1.208 +
1.209 +EXPORT_C int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req)
1.210 + {
1.211 + return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
1.212 + }
1.213 +
1.214 +#ifndef OPENSSL_NO_RSA
1.215 +
1.216 +#ifndef OPENSSL_NO_FP_API
1.217 +EXPORT_C RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa)
1.218 + {
1.219 + return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
1.220 + }
1.221 +
1.222 +EXPORT_C int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa)
1.223 + {
1.224 + return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
1.225 + }
1.226 +
1.227 +EXPORT_C RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa)
1.228 + {
1.229 + return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
1.230 + }
1.231 +
1.232 +
1.233 +EXPORT_C RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa)
1.234 + {
1.235 + return ASN1_d2i_fp((void *(*)(void))
1.236 + RSA_new,(D2I_OF(void))d2i_RSA_PUBKEY, fp,
1.237 + (void **)rsa);
1.238 + }
1.239 +
1.240 +EXPORT_C int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa)
1.241 + {
1.242 + return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
1.243 + }
1.244 +
1.245 +EXPORT_C int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa)
1.246 + {
1.247 + return ASN1_i2d_fp((I2D_OF(void))i2d_RSA_PUBKEY,fp,rsa);
1.248 + }
1.249 +#endif
1.250 +
1.251 +EXPORT_C RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa)
1.252 + {
1.253 + return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
1.254 + }
1.255 +
1.256 +EXPORT_C int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa)
1.257 + {
1.258 + return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
1.259 + }
1.260 +
1.261 +EXPORT_C RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa)
1.262 + {
1.263 + return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
1.264 + }
1.265 +
1.266 +
1.267 +EXPORT_C RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa)
1.268 + {
1.269 + return ASN1_d2i_bio_of(RSA,RSA_new,d2i_RSA_PUBKEY,bp,rsa);
1.270 + }
1.271 +
1.272 +EXPORT_C int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa)
1.273 + {
1.274 + return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
1.275 + }
1.276 +
1.277 +EXPORT_C int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa)
1.278 + {
1.279 + return ASN1_i2d_bio_of(RSA,i2d_RSA_PUBKEY,bp,rsa);
1.280 + }
1.281 +#endif
1.282 +
1.283 +#ifndef OPENSSL_NO_DSA
1.284 +#ifndef OPENSSL_NO_FP_API
1.285 +EXPORT_C DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa)
1.286 + {
1.287 + return ASN1_d2i_fp_of(DSA,DSA_new,d2i_DSAPrivateKey,fp,dsa);
1.288 + }
1.289 +
1.290 +EXPORT_C int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa)
1.291 + {
1.292 + return ASN1_i2d_fp_of_const(DSA,i2d_DSAPrivateKey,fp,dsa);
1.293 + }
1.294 +
1.295 +EXPORT_C DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa)
1.296 + {
1.297 + return ASN1_d2i_fp_of(DSA,DSA_new,d2i_DSA_PUBKEY,fp,dsa);
1.298 + }
1.299 +
1.300 +EXPORT_C int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa)
1.301 + {
1.302 + return ASN1_i2d_fp_of(DSA,i2d_DSA_PUBKEY,fp,dsa);
1.303 + }
1.304 +#endif
1.305 +
1.306 +EXPORT_C DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa)
1.307 + {
1.308 + return ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSAPrivateKey,bp,dsa
1.309 +);
1.310 + }
1.311 +
1.312 +EXPORT_C int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa)
1.313 + {
1.314 + return ASN1_i2d_bio_of_const(DSA,i2d_DSAPrivateKey,bp,dsa);
1.315 + }
1.316 +
1.317 +EXPORT_C DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa)
1.318 + {
1.319 + return ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSA_PUBKEY,bp,dsa);
1.320 + }
1.321 +
1.322 +EXPORT_C int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa)
1.323 + {
1.324 + return ASN1_i2d_bio_of(DSA,i2d_DSA_PUBKEY,bp,dsa);
1.325 + }
1.326 +
1.327 +#endif
1.328 +
1.329 +#ifndef OPENSSL_NO_EC
1.330 +#ifndef OPENSSL_NO_FP_API
1.331 +EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey)
1.332 + {
1.333 + return ASN1_d2i_fp_of(EC_KEY,EC_KEY_new,d2i_EC_PUBKEY,fp,eckey);
1.334 + }
1.335 +
1.336 +int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey)
1.337 + {
1.338 + return ASN1_i2d_fp_of(EC_KEY,i2d_EC_PUBKEY,fp,eckey);
1.339 + }
1.340 +
1.341 +EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey)
1.342 + {
1.343 + return ASN1_d2i_fp_of(EC_KEY,EC_KEY_new,d2i_ECPrivateKey,fp,eckey);
1.344 + }
1.345 +
1.346 +int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey)
1.347 + {
1.348 + return ASN1_i2d_fp_of(EC_KEY,i2d_ECPrivateKey,fp,eckey);
1.349 + }
1.350 +#endif
1.351 +EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey)
1.352 + {
1.353 + return ASN1_d2i_bio_of(EC_KEY,EC_KEY_new,d2i_EC_PUBKEY,bp,eckey);
1.354 + }
1.355 +
1.356 +int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *ecdsa)
1.357 + {
1.358 + return ASN1_i2d_bio_of(EC_KEY,i2d_EC_PUBKEY,bp,ecdsa);
1.359 + }
1.360 +
1.361 +EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey)
1.362 + {
1.363 + return ASN1_d2i_bio_of(EC_KEY,EC_KEY_new,d2i_ECPrivateKey,bp,eckey);
1.364 + }
1.365 +
1.366 +int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey)
1.367 + {
1.368 + return ASN1_i2d_bio_of(EC_KEY,i2d_ECPrivateKey,bp,eckey);
1.369 + }
1.370 +#endif
1.371 +
1.372 +
1.373 +EXPORT_C int X509_pubkey_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
1.374 + unsigned int *len)
1.375 + {
1.376 + ASN1_BIT_STRING *key;
1.377 + key = X509_get0_pubkey_bitstr(data);
1.378 + if(!key) return 0;
1.379 + return EVP_Digest(key->data, key->length, md, len, type, NULL);
1.380 + }
1.381 +
1.382 +EXPORT_C int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
1.383 + unsigned int *len)
1.384 + {
1.385 + return(ASN1_item_digest(ASN1_ITEM_rptr(X509),type,(char *)data,md,len));
1.386 + }
1.387 +
1.388 +EXPORT_C int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, unsigned char *md,
1.389 + unsigned int *len)
1.390 + {
1.391 + return(ASN1_item_digest(ASN1_ITEM_rptr(X509_CRL),type,(char *)data,md,len));
1.392 + }
1.393 +
1.394 +EXPORT_C int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, unsigned char *md,
1.395 + unsigned int *len)
1.396 + {
1.397 + return(ASN1_item_digest(ASN1_ITEM_rptr(X509_REQ),type,(char *)data,md,len));
1.398 + }
1.399 +
1.400 +EXPORT_C int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, unsigned char *md,
1.401 + unsigned int *len)
1.402 + {
1.403 + return(ASN1_item_digest(ASN1_ITEM_rptr(X509_NAME),type,(char *)data,md,len));
1.404 + }
1.405 +
1.406 +EXPORT_C int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, const EVP_MD *type,
1.407 + unsigned char *md, unsigned int *len)
1.408 + {
1.409 + return(ASN1_item_digest(ASN1_ITEM_rptr(PKCS7_ISSUER_AND_SERIAL),type,
1.410 + (char *)data,md,len));
1.411 + }
1.412 +
1.413 +
1.414 +#ifndef OPENSSL_NO_FP_API
1.415 +EXPORT_C X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8)
1.416 + {
1.417 + return ASN1_d2i_fp_of(X509_SIG,X509_SIG_new,d2i_X509_SIG,fp,p8);
1.418 + }
1.419 +
1.420 +EXPORT_C int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8)
1.421 + {
1.422 + return ASN1_i2d_fp_of(X509_SIG,i2d_X509_SIG,fp,p8);
1.423 + }
1.424 +#endif
1.425 +
1.426 +EXPORT_C X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8)
1.427 + {
1.428 + return ASN1_d2i_bio_of(X509_SIG,X509_SIG_new,d2i_X509_SIG,bp,p8);
1.429 + }
1.430 +
1.431 +EXPORT_C int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8)
1.432 + {
1.433 + return ASN1_i2d_bio_of(X509_SIG,i2d_X509_SIG,bp,p8);
1.434 + }
1.435 +
1.436 +#ifndef OPENSSL_NO_FP_API
1.437 +EXPORT_C PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
1.438 + PKCS8_PRIV_KEY_INFO **p8inf)
1.439 + {
1.440 + return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO,PKCS8_PRIV_KEY_INFO_new,
1.441 + d2i_PKCS8_PRIV_KEY_INFO,fp,p8inf);
1.442 + }
1.443 +
1.444 +EXPORT_C int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf)
1.445 + {
1.446 + return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO,i2d_PKCS8_PRIV_KEY_INFO,fp,
1.447 + p8inf);
1.448 + }
1.449 +
1.450 +EXPORT_C int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key)
1.451 + {
1.452 + PKCS8_PRIV_KEY_INFO *p8inf;
1.453 + int ret;
1.454 + p8inf = EVP_PKEY2PKCS8(key);
1.455 + if(!p8inf) return 0;
1.456 + ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf);
1.457 + PKCS8_PRIV_KEY_INFO_free(p8inf);
1.458 + return ret;
1.459 + }
1.460 +
1.461 +EXPORT_C int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey)
1.462 + {
1.463 + return ASN1_i2d_fp_of(EVP_PKEY,i2d_PrivateKey,fp,pkey);
1.464 + }
1.465 +
1.466 +EXPORT_C EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a)
1.467 +{
1.468 + return ASN1_d2i_fp_of(EVP_PKEY,EVP_PKEY_new,d2i_AutoPrivateKey,fp,a);
1.469 +}
1.470 +
1.471 +EXPORT_C int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey)
1.472 + {
1.473 + return ASN1_i2d_fp_of(EVP_PKEY,i2d_PUBKEY,fp,pkey);
1.474 + }
1.475 +
1.476 +EXPORT_C EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a)
1.477 +{
1.478 + return ASN1_d2i_fp_of(EVP_PKEY,EVP_PKEY_new,d2i_PUBKEY,fp,a);
1.479 +}
1.480 +
1.481 +#endif
1.482 +
1.483 +EXPORT_C PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
1.484 + PKCS8_PRIV_KEY_INFO **p8inf)
1.485 + {
1.486 + return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO,PKCS8_PRIV_KEY_INFO_new,
1.487 + d2i_PKCS8_PRIV_KEY_INFO,bp,p8inf);
1.488 + }
1.489 +
1.490 +EXPORT_C int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf)
1.491 + {
1.492 + return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO,i2d_PKCS8_PRIV_KEY_INFO,bp,
1.493 + p8inf);
1.494 + }
1.495 +
1.496 +EXPORT_C int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key)
1.497 + {
1.498 + PKCS8_PRIV_KEY_INFO *p8inf;
1.499 + int ret;
1.500 + p8inf = EVP_PKEY2PKCS8(key);
1.501 + if(!p8inf) return 0;
1.502 + ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
1.503 + PKCS8_PRIV_KEY_INFO_free(p8inf);
1.504 + return ret;
1.505 + }
1.506 +
1.507 +EXPORT_C int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey)
1.508 + {
1.509 + return ASN1_i2d_bio_of(EVP_PKEY,i2d_PrivateKey,bp,pkey);
1.510 + }
1.511 +
1.512 +EXPORT_C EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a)
1.513 + {
1.514 + return ASN1_d2i_bio_of(EVP_PKEY,EVP_PKEY_new,d2i_AutoPrivateKey,bp,a);
1.515 + }
1.516 +
1.517 +EXPORT_C int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey)
1.518 + {
1.519 + return ASN1_i2d_bio_of(EVP_PKEY,i2d_PUBKEY,bp,pkey);
1.520 + }
1.521 +
1.522 +EXPORT_C EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a)
1.523 + {
1.524 + return ASN1_d2i_bio_of(EVP_PKEY,EVP_PKEY_new,d2i_PUBKEY,bp,a);
1.525 + }