155714Skris/* crypto/x509/x_all.c */ 255714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 355714Skris * All rights reserved. 455714Skris * 555714Skris * This package is an SSL implementation written 655714Skris * by Eric Young (eay@cryptsoft.com). 755714Skris * The implementation was written so as to conform with Netscapes SSL. 8296341Sdelphij * 955714Skris * This library is free for commercial and non-commercial use as long as 1055714Skris * the following conditions are aheared to. The following conditions 1155714Skris * apply to all code found in this distribution, be it the RC4, RSA, 1255714Skris * lhash, DES, etc., code; not just the SSL code. The SSL documentation 1355714Skris * included with this distribution is covered by the same copyright terms 1455714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15296341Sdelphij * 1655714Skris * Copyright remains Eric Young's, and as such any Copyright notices in 1755714Skris * the code are not to be removed. 1855714Skris * If this package is used in a product, Eric Young should be given attribution 1955714Skris * as the author of the parts of the library used. 2055714Skris * This can be in the form of a textual message at program startup or 2155714Skris * in documentation (online or textual) provided with the package. 22296341Sdelphij * 2355714Skris * Redistribution and use in source and binary forms, with or without 2455714Skris * modification, are permitted provided that the following conditions 2555714Skris * are met: 2655714Skris * 1. Redistributions of source code must retain the copyright 2755714Skris * notice, this list of conditions and the following disclaimer. 2855714Skris * 2. Redistributions in binary form must reproduce the above copyright 2955714Skris * notice, this list of conditions and the following disclaimer in the 3055714Skris * documentation and/or other materials provided with the distribution. 3155714Skris * 3. All advertising materials mentioning features or use of this software 3255714Skris * must display the following acknowledgement: 3355714Skris * "This product includes cryptographic software written by 3455714Skris * Eric Young (eay@cryptsoft.com)" 3555714Skris * The word 'cryptographic' can be left out if the rouines from the library 3655714Skris * being used are not cryptographic related :-). 37296341Sdelphij * 4. If you include any Windows specific code (or a derivative thereof) from 3855714Skris * the apps directory (application code) you must include an acknowledgement: 3955714Skris * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40296341Sdelphij * 4155714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 4255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4455714Skris * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 4555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 4755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 4955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 5055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5155714Skris * SUCH DAMAGE. 52296341Sdelphij * 5355714Skris * The licence and distribution terms for any publically available version or 5455714Skris * derivative of this code cannot be changed. i.e. this code cannot simply be 5555714Skris * copied and put under another distribution licence 5655714Skris * [including the GNU Public Licence.] 5755714Skris */ 5855714Skris 5955714Skris#include <stdio.h> 6055714Skris#include <openssl/stack.h> 6155714Skris#include "cryptlib.h" 6255714Skris#include <openssl/buffer.h> 6355714Skris#include <openssl/asn1.h> 6455714Skris#include <openssl/evp.h> 6555714Skris#include <openssl/x509.h> 66160814Ssimon#ifndef OPENSSL_NO_RSA 67296341Sdelphij# include <openssl/rsa.h> 68160814Ssimon#endif 69160814Ssimon#ifndef OPENSSL_NO_DSA 70296341Sdelphij# include <openssl/dsa.h> 71160814Ssimon#endif 7255714Skris 7355714Skrisint X509_verify(X509 *a, EVP_PKEY *r) 74296341Sdelphij{ 75296341Sdelphij if (X509_ALGOR_cmp(a->sig_alg, a->cert_info->signature)) 76296341Sdelphij return 0; 77296341Sdelphij return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), a->sig_alg, 78296341Sdelphij a->signature, a->cert_info, r)); 79296341Sdelphij} 8055714Skris 8155714Skrisint X509_REQ_verify(X509_REQ *a, EVP_PKEY *r) 82296341Sdelphij{ 83296341Sdelphij return (ASN1_item_verify(ASN1_ITEM_rptr(X509_REQ_INFO), 84296341Sdelphij a->sig_alg, a->signature, a->req_info, r)); 85296341Sdelphij} 8655714Skris 8755714Skrisint NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r) 88296341Sdelphij{ 89296341Sdelphij return (ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC), 90296341Sdelphij a->sig_algor, a->signature, a->spkac, r)); 91296341Sdelphij} 9255714Skris 9355714Skrisint X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md) 94296341Sdelphij{ 95296341Sdelphij x->cert_info->enc.modified = 1; 96296341Sdelphij return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature, 97296341Sdelphij x->sig_alg, x->signature, x->cert_info, pkey, md)); 98296341Sdelphij} 9955714Skris 100238405Sjkimint X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx) 101296341Sdelphij{ 102296341Sdelphij x->cert_info->enc.modified = 1; 103296341Sdelphij return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF), 104296341Sdelphij x->cert_info->signature, 105296341Sdelphij x->sig_alg, x->signature, x->cert_info, ctx); 106296341Sdelphij} 107238405Sjkim 10855714Skrisint X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md) 109296341Sdelphij{ 110296341Sdelphij return (ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, NULL, 111296341Sdelphij x->signature, x->req_info, pkey, md)); 112296341Sdelphij} 11355714Skris 114238405Sjkimint X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx) 115296341Sdelphij{ 116296341Sdelphij return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO), 117296341Sdelphij x->sig_alg, NULL, x->signature, x->req_info, 118296341Sdelphij ctx); 119296341Sdelphij} 120238405Sjkim 12155714Skrisint X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md) 122296341Sdelphij{ 123296341Sdelphij x->crl->enc.modified = 1; 124296341Sdelphij return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), x->crl->sig_alg, 125296341Sdelphij x->sig_alg, x->signature, x->crl, pkey, md)); 126296341Sdelphij} 12755714Skris 128238405Sjkimint X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx) 129296341Sdelphij{ 130296341Sdelphij x->crl->enc.modified = 1; 131296341Sdelphij return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO), 132296341Sdelphij x->crl->sig_alg, x->sig_alg, x->signature, 133296341Sdelphij x->crl, ctx); 134296341Sdelphij} 135238405Sjkim 13655714Skrisint NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md) 137296341Sdelphij{ 138296341Sdelphij return (ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor, NULL, 139296341Sdelphij x->signature, x->spkac, pkey, md)); 140296341Sdelphij} 14155714Skris 142109998Smarkm#ifndef OPENSSL_NO_FP_API 14355714SkrisX509 *d2i_X509_fp(FILE *fp, X509 **x509) 144296341Sdelphij{ 145296341Sdelphij return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509); 146296341Sdelphij} 14755714Skris 14855714Skrisint i2d_X509_fp(FILE *fp, X509 *x509) 149296341Sdelphij{ 150296341Sdelphij return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509); 151296341Sdelphij} 15255714Skris#endif 15355714Skris 15455714SkrisX509 *d2i_X509_bio(BIO *bp, X509 **x509) 155296341Sdelphij{ 156296341Sdelphij return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509); 157296341Sdelphij} 15855714Skris 15955714Skrisint i2d_X509_bio(BIO *bp, X509 *x509) 160296341Sdelphij{ 161296341Sdelphij return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509); 162296341Sdelphij} 16355714Skris 164109998Smarkm#ifndef OPENSSL_NO_FP_API 16555714SkrisX509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl) 166296341Sdelphij{ 167296341Sdelphij return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl); 168296341Sdelphij} 16955714Skris 17055714Skrisint i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl) 171296341Sdelphij{ 172296341Sdelphij return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl); 173296341Sdelphij} 17455714Skris#endif 17555714Skris 17655714SkrisX509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl) 177296341Sdelphij{ 178296341Sdelphij return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl); 179296341Sdelphij} 18055714Skris 18155714Skrisint i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl) 182296341Sdelphij{ 183296341Sdelphij return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl); 184296341Sdelphij} 18555714Skris 186109998Smarkm#ifndef OPENSSL_NO_FP_API 18755714SkrisPKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7) 188296341Sdelphij{ 189296341Sdelphij return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS7), fp, p7); 190296341Sdelphij} 19155714Skris 19255714Skrisint i2d_PKCS7_fp(FILE *fp, PKCS7 *p7) 193296341Sdelphij{ 194296341Sdelphij return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7), fp, p7); 195296341Sdelphij} 19655714Skris#endif 19755714Skris 19855714SkrisPKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7) 199296341Sdelphij{ 200296341Sdelphij return ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS7), bp, p7); 201296341Sdelphij} 20255714Skris 20355714Skrisint i2d_PKCS7_bio(BIO *bp, PKCS7 *p7) 204296341Sdelphij{ 205296341Sdelphij return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7), bp, p7); 206296341Sdelphij} 20755714Skris 208109998Smarkm#ifndef OPENSSL_NO_FP_API 20955714SkrisX509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req) 210296341Sdelphij{ 211296341Sdelphij return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req); 212296341Sdelphij} 21355714Skris 21455714Skrisint i2d_X509_REQ_fp(FILE *fp, X509_REQ *req) 215296341Sdelphij{ 216296341Sdelphij return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req); 217296341Sdelphij} 21855714Skris#endif 21955714Skris 22055714SkrisX509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req) 221296341Sdelphij{ 222296341Sdelphij return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req); 223296341Sdelphij} 22455714Skris 22555714Skrisint i2d_X509_REQ_bio(BIO *bp, X509_REQ *req) 226296341Sdelphij{ 227296341Sdelphij return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req); 228296341Sdelphij} 22955714Skris 230109998Smarkm#ifndef OPENSSL_NO_RSA 23155714Skris 232296341Sdelphij# ifndef OPENSSL_NO_FP_API 23355714SkrisRSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa) 234296341Sdelphij{ 235296341Sdelphij return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa); 236296341Sdelphij} 23755714Skris 23855714Skrisint i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa) 239296341Sdelphij{ 240296341Sdelphij return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa); 241296341Sdelphij} 24255714Skris 24355714SkrisRSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa) 244296341Sdelphij{ 245296341Sdelphij return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa); 246296341Sdelphij} 24755714Skris 24859191SkrisRSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa) 249296341Sdelphij{ 250296341Sdelphij return ASN1_d2i_fp((void *(*)(void)) 251296341Sdelphij RSA_new, (D2I_OF(void)) d2i_RSA_PUBKEY, fp, 252296341Sdelphij (void **)rsa); 253296341Sdelphij} 25459191Skris 25555714Skrisint i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa) 256296341Sdelphij{ 257296341Sdelphij return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa); 258296341Sdelphij} 25959191Skris 26059191Skrisint i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa) 261296341Sdelphij{ 262296341Sdelphij return ASN1_i2d_fp((I2D_OF(void))i2d_RSA_PUBKEY, fp, rsa); 263296341Sdelphij} 264296341Sdelphij# endif 26555714Skris 26655714SkrisRSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa) 267296341Sdelphij{ 268296341Sdelphij return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa); 269296341Sdelphij} 27055714Skris 27155714Skrisint i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa) 272296341Sdelphij{ 273296341Sdelphij return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa); 274296341Sdelphij} 27555714Skris 27655714SkrisRSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa) 277296341Sdelphij{ 278296341Sdelphij return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa); 279296341Sdelphij} 28055714Skris 28159191SkrisRSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa) 282296341Sdelphij{ 283296341Sdelphij return ASN1_d2i_bio_of(RSA, RSA_new, d2i_RSA_PUBKEY, bp, rsa); 284296341Sdelphij} 28559191Skris 28655714Skrisint i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa) 287296341Sdelphij{ 288296341Sdelphij return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa); 289296341Sdelphij} 29059191Skris 29159191Skrisint i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa) 292296341Sdelphij{ 293296341Sdelphij return ASN1_i2d_bio_of(RSA, i2d_RSA_PUBKEY, bp, rsa); 294296341Sdelphij} 29555714Skris#endif 29655714Skris 297109998Smarkm#ifndef OPENSSL_NO_DSA 298296341Sdelphij# ifndef OPENSSL_NO_FP_API 29955714SkrisDSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa) 300296341Sdelphij{ 301296341Sdelphij return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSAPrivateKey, fp, dsa); 302296341Sdelphij} 30355714Skris 30455714Skrisint i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa) 305296341Sdelphij{ 306296341Sdelphij return ASN1_i2d_fp_of_const(DSA, i2d_DSAPrivateKey, fp, dsa); 307296341Sdelphij} 30859191Skris 30959191SkrisDSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa) 310296341Sdelphij{ 311296341Sdelphij return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSA_PUBKEY, fp, dsa); 312296341Sdelphij} 31359191Skris 31459191Skrisint i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa) 315296341Sdelphij{ 316296341Sdelphij return ASN1_i2d_fp_of(DSA, i2d_DSA_PUBKEY, fp, dsa); 317296341Sdelphij} 318296341Sdelphij# endif 31955714Skris 32055714SkrisDSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa) 321296341Sdelphij{ 322296341Sdelphij return ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSAPrivateKey, bp, dsa); 323296341Sdelphij} 32455714Skris 32555714Skrisint i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa) 326296341Sdelphij{ 327296341Sdelphij return ASN1_i2d_bio_of_const(DSA, i2d_DSAPrivateKey, bp, dsa); 328296341Sdelphij} 32959191Skris 33059191SkrisDSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa) 331296341Sdelphij{ 332296341Sdelphij return ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSA_PUBKEY, bp, dsa); 333296341Sdelphij} 33459191Skris 33559191Skrisint i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa) 336296341Sdelphij{ 337296341Sdelphij return ASN1_i2d_bio_of(DSA, i2d_DSA_PUBKEY, bp, dsa); 338296341Sdelphij} 33959191Skris 34055714Skris#endif 34155714Skris 342160814Ssimon#ifndef OPENSSL_NO_EC 343296341Sdelphij# ifndef OPENSSL_NO_FP_API 344160814SsimonEC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey) 345296341Sdelphij{ 346296341Sdelphij return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, fp, eckey); 347296341Sdelphij} 348296341Sdelphij 349160814Ssimonint i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey) 350296341Sdelphij{ 351296341Sdelphij return ASN1_i2d_fp_of(EC_KEY, i2d_EC_PUBKEY, fp, eckey); 352296341Sdelphij} 353160814Ssimon 354160814SsimonEC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey) 355296341Sdelphij{ 356296341Sdelphij return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_ECPrivateKey, fp, eckey); 357296341Sdelphij} 358296341Sdelphij 359160814Ssimonint i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey) 360296341Sdelphij{ 361296341Sdelphij return ASN1_i2d_fp_of(EC_KEY, i2d_ECPrivateKey, fp, eckey); 362296341Sdelphij} 363296341Sdelphij# endif 364160814SsimonEC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey) 365296341Sdelphij{ 366296341Sdelphij return ASN1_d2i_bio_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, bp, eckey); 367296341Sdelphij} 368296341Sdelphij 369160814Ssimonint i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *ecdsa) 370296341Sdelphij{ 371296341Sdelphij return ASN1_i2d_bio_of(EC_KEY, i2d_EC_PUBKEY, bp, ecdsa); 372296341Sdelphij} 373160814Ssimon 374160814SsimonEC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey) 375296341Sdelphij{ 376296341Sdelphij return ASN1_d2i_bio_of(EC_KEY, EC_KEY_new, d2i_ECPrivateKey, bp, eckey); 377296341Sdelphij} 378296341Sdelphij 379160814Ssimonint i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey) 380296341Sdelphij{ 381296341Sdelphij return ASN1_i2d_bio_of(EC_KEY, i2d_ECPrivateKey, bp, eckey); 382296341Sdelphij} 383160814Ssimon#endif 384160814Ssimon 385296341Sdelphijint X509_pubkey_digest(const X509 *data, const EVP_MD *type, 386296341Sdelphij unsigned char *md, unsigned int *len) 387296341Sdelphij{ 388296341Sdelphij ASN1_BIT_STRING *key; 389296341Sdelphij key = X509_get0_pubkey_bitstr(data); 390296341Sdelphij if (!key) 391296341Sdelphij return 0; 392296341Sdelphij return EVP_Digest(key->data, key->length, md, len, type, NULL); 393296341Sdelphij} 394160814Ssimon 39568651Skrisint X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md, 396296341Sdelphij unsigned int *len) 397296341Sdelphij{ 398296341Sdelphij return (ASN1_item_digest 399296341Sdelphij (ASN1_ITEM_rptr(X509), type, (char *)data, md, len)); 400296341Sdelphij} 40155714Skris 402296341Sdelphijint X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, 403296341Sdelphij unsigned char *md, unsigned int *len) 404296341Sdelphij{ 405296341Sdelphij return (ASN1_item_digest 406296341Sdelphij (ASN1_ITEM_rptr(X509_CRL), type, (char *)data, md, len)); 407296341Sdelphij} 40868651Skris 409296341Sdelphijint X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, 410296341Sdelphij unsigned char *md, unsigned int *len) 411296341Sdelphij{ 412296341Sdelphij return (ASN1_item_digest 413296341Sdelphij (ASN1_ITEM_rptr(X509_REQ), type, (char *)data, md, len)); 414296341Sdelphij} 41568651Skris 416296341Sdelphijint X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, 417296341Sdelphij unsigned char *md, unsigned int *len) 418296341Sdelphij{ 419296341Sdelphij return (ASN1_item_digest 420296341Sdelphij (ASN1_ITEM_rptr(X509_NAME), type, (char *)data, md, len)); 421296341Sdelphij} 42255714Skris 423296341Sdelphijint PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, 424296341Sdelphij const EVP_MD *type, unsigned char *md, 425296341Sdelphij unsigned int *len) 426296341Sdelphij{ 427296341Sdelphij return (ASN1_item_digest(ASN1_ITEM_rptr(PKCS7_ISSUER_AND_SERIAL), type, 428296341Sdelphij (char *)data, md, len)); 429296341Sdelphij} 43055714Skris 431109998Smarkm#ifndef OPENSSL_NO_FP_API 43255714SkrisX509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8) 433296341Sdelphij{ 434296341Sdelphij return ASN1_d2i_fp_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, fp, p8); 435296341Sdelphij} 43655714Skris 43755714Skrisint i2d_PKCS8_fp(FILE *fp, X509_SIG *p8) 438296341Sdelphij{ 439296341Sdelphij return ASN1_i2d_fp_of(X509_SIG, i2d_X509_SIG, fp, p8); 440296341Sdelphij} 44155714Skris#endif 44255714Skris 44355714SkrisX509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8) 444296341Sdelphij{ 445296341Sdelphij return ASN1_d2i_bio_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, bp, p8); 446296341Sdelphij} 44755714Skris 44855714Skrisint i2d_PKCS8_bio(BIO *bp, X509_SIG *p8) 449296341Sdelphij{ 450296341Sdelphij return ASN1_i2d_bio_of(X509_SIG, i2d_X509_SIG, bp, p8); 451296341Sdelphij} 45255714Skris 453109998Smarkm#ifndef OPENSSL_NO_FP_API 45455714SkrisPKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, 455296341Sdelphij PKCS8_PRIV_KEY_INFO **p8inf) 456296341Sdelphij{ 457296341Sdelphij return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_new, 458296341Sdelphij d2i_PKCS8_PRIV_KEY_INFO, fp, p8inf); 459296341Sdelphij} 46055714Skris 46155714Skrisint i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf) 462296341Sdelphij{ 463296341Sdelphij return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO, fp, 464296341Sdelphij p8inf); 465296341Sdelphij} 46659191Skris 46759191Skrisint i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key) 468296341Sdelphij{ 469296341Sdelphij PKCS8_PRIV_KEY_INFO *p8inf; 470296341Sdelphij int ret; 471296341Sdelphij p8inf = EVP_PKEY2PKCS8(key); 472296341Sdelphij if (!p8inf) 473296341Sdelphij return 0; 474296341Sdelphij ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf); 475296341Sdelphij PKCS8_PRIV_KEY_INFO_free(p8inf); 476296341Sdelphij return ret; 477296341Sdelphij} 47859191Skris 47959191Skrisint i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey) 480296341Sdelphij{ 481296341Sdelphij return ASN1_i2d_fp_of(EVP_PKEY, i2d_PrivateKey, fp, pkey); 482296341Sdelphij} 48359191Skris 48459191SkrisEVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a) 48559191Skris{ 486296341Sdelphij return ASN1_d2i_fp_of(EVP_PKEY, EVP_PKEY_new, d2i_AutoPrivateKey, fp, a); 48759191Skris} 48859191Skris 48968651Skrisint i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey) 490296341Sdelphij{ 491296341Sdelphij return ASN1_i2d_fp_of(EVP_PKEY, i2d_PUBKEY, fp, pkey); 492296341Sdelphij} 49368651Skris 49468651SkrisEVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a) 49568651Skris{ 496296341Sdelphij return ASN1_d2i_fp_of(EVP_PKEY, EVP_PKEY_new, d2i_PUBKEY, fp, a); 49768651Skris} 49868651Skris 49955714Skris#endif 50055714Skris 50155714SkrisPKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, 502296341Sdelphij PKCS8_PRIV_KEY_INFO **p8inf) 503296341Sdelphij{ 504296341Sdelphij return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_new, 505296341Sdelphij d2i_PKCS8_PRIV_KEY_INFO, bp, p8inf); 506296341Sdelphij} 50755714Skris 50855714Skrisint i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf) 509296341Sdelphij{ 510296341Sdelphij return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO, bp, 511296341Sdelphij p8inf); 512296341Sdelphij} 51359191Skris 51459191Skrisint i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key) 515296341Sdelphij{ 516296341Sdelphij PKCS8_PRIV_KEY_INFO *p8inf; 517296341Sdelphij int ret; 518296341Sdelphij p8inf = EVP_PKEY2PKCS8(key); 519296341Sdelphij if (!p8inf) 520296341Sdelphij return 0; 521296341Sdelphij ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf); 522296341Sdelphij PKCS8_PRIV_KEY_INFO_free(p8inf); 523296341Sdelphij return ret; 524296341Sdelphij} 52559191Skris 52659191Skrisint i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey) 527296341Sdelphij{ 528296341Sdelphij return ASN1_i2d_bio_of(EVP_PKEY, i2d_PrivateKey, bp, pkey); 529296341Sdelphij} 53059191Skris 53159191SkrisEVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a) 532296341Sdelphij{ 533296341Sdelphij return ASN1_d2i_bio_of(EVP_PKEY, EVP_PKEY_new, d2i_AutoPrivateKey, bp, a); 534296341Sdelphij} 53568651Skris 53668651Skrisint i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey) 537296341Sdelphij{ 538296341Sdelphij return ASN1_i2d_bio_of(EVP_PKEY, i2d_PUBKEY, bp, pkey); 539296341Sdelphij} 54068651Skris 54168651SkrisEVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a) 542296341Sdelphij{ 543296341Sdelphij return ASN1_d2i_bio_of(EVP_PKEY, EVP_PKEY_new, d2i_PUBKEY, bp, a); 544296341Sdelphij} 545