jpayne@69: /* jpayne@69: * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. jpayne@69: * jpayne@69: * Licensed under the OpenSSL license (the "License"). You may not use jpayne@69: * this file except in compliance with the License. You can obtain a copy jpayne@69: * in the file LICENSE in the source distribution or at jpayne@69: * https://www.openssl.org/source/license.html jpayne@69: */ jpayne@69: jpayne@69: #ifndef HEADER_PEM_H jpayne@69: # define HEADER_PEM_H jpayne@69: jpayne@69: # include jpayne@69: # include jpayne@69: # include jpayne@69: # include jpayne@69: # include jpayne@69: # include jpayne@69: jpayne@69: #ifdef __cplusplus jpayne@69: extern "C" { jpayne@69: #endif jpayne@69: jpayne@69: # define PEM_BUFSIZE 1024 jpayne@69: jpayne@69: # define PEM_STRING_X509_OLD "X509 CERTIFICATE" jpayne@69: # define PEM_STRING_X509 "CERTIFICATE" jpayne@69: # define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" jpayne@69: # define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" jpayne@69: # define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" jpayne@69: # define PEM_STRING_X509_CRL "X509 CRL" jpayne@69: # define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" jpayne@69: # define PEM_STRING_PUBLIC "PUBLIC KEY" jpayne@69: # define PEM_STRING_RSA "RSA PRIVATE KEY" jpayne@69: # define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" jpayne@69: # define PEM_STRING_DSA "DSA PRIVATE KEY" jpayne@69: # define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" jpayne@69: # define PEM_STRING_PKCS7 "PKCS7" jpayne@69: # define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" jpayne@69: # define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" jpayne@69: # define PEM_STRING_PKCS8INF "PRIVATE KEY" jpayne@69: # define PEM_STRING_DHPARAMS "DH PARAMETERS" jpayne@69: # define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS" jpayne@69: # define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" jpayne@69: # define PEM_STRING_DSAPARAMS "DSA PARAMETERS" jpayne@69: # define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" jpayne@69: # define PEM_STRING_ECPARAMETERS "EC PARAMETERS" jpayne@69: # define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" jpayne@69: # define PEM_STRING_PARAMETERS "PARAMETERS" jpayne@69: # define PEM_STRING_CMS "CMS" jpayne@69: jpayne@69: # define PEM_TYPE_ENCRYPTED 10 jpayne@69: # define PEM_TYPE_MIC_ONLY 20 jpayne@69: # define PEM_TYPE_MIC_CLEAR 30 jpayne@69: # define PEM_TYPE_CLEAR 40 jpayne@69: jpayne@69: /* jpayne@69: * These macros make the PEM_read/PEM_write functions easier to maintain and jpayne@69: * write. Now they are all implemented with either: IMPLEMENT_PEM_rw(...) or jpayne@69: * IMPLEMENT_PEM_rw_cb(...) jpayne@69: */ jpayne@69: jpayne@69: # ifdef OPENSSL_NO_STDIO jpayne@69: jpayne@69: # define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ jpayne@69: # define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ jpayne@69: # define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/ jpayne@69: # define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ jpayne@69: # define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/ jpayne@69: # else jpayne@69: jpayne@69: # define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ jpayne@69: type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ jpayne@69: { \ jpayne@69: return PEM_ASN1_read((d2i_of_void *)d2i_##asn1, str,fp,(void **)x,cb,u); \ jpayne@69: } jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ jpayne@69: int PEM_write_##name(FILE *fp, type *x) \ jpayne@69: { \ jpayne@69: return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL); \ jpayne@69: } jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ jpayne@69: int PEM_write_##name(FILE *fp, const type *x) \ jpayne@69: { \ jpayne@69: return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,(void *)x,NULL,NULL,0,NULL,NULL); \ jpayne@69: } jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ jpayne@69: int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ jpayne@69: unsigned char *kstr, int klen, pem_password_cb *cb, \ jpayne@69: void *u) \ jpayne@69: { \ jpayne@69: return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ jpayne@69: } jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ jpayne@69: int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ jpayne@69: unsigned char *kstr, int klen, pem_password_cb *cb, \ jpayne@69: void *u) \ jpayne@69: { \ jpayne@69: return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ jpayne@69: } jpayne@69: jpayne@69: # endif jpayne@69: jpayne@69: # define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ jpayne@69: type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ jpayne@69: { \ jpayne@69: return PEM_ASN1_read_bio((d2i_of_void *)d2i_##asn1, str,bp,(void **)x,cb,u); \ jpayne@69: } jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ jpayne@69: int PEM_write_bio_##name(BIO *bp, type *x) \ jpayne@69: { \ jpayne@69: return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL); \ jpayne@69: } jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ jpayne@69: int PEM_write_bio_##name(BIO *bp, const type *x) \ jpayne@69: { \ jpayne@69: return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,NULL,NULL,0,NULL,NULL); \ jpayne@69: } jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ jpayne@69: int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ jpayne@69: unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ jpayne@69: { \ jpayne@69: return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u); \ jpayne@69: } jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ jpayne@69: int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ jpayne@69: unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ jpayne@69: { \ jpayne@69: return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,enc,kstr,klen,cb,u); \ jpayne@69: } jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write_fp(name, type, str, asn1) jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) jpayne@69: jpayne@69: # define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) jpayne@69: jpayne@69: # define IMPLEMENT_PEM_read(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_read_fp(name, type, str, asn1) jpayne@69: jpayne@69: # define IMPLEMENT_PEM_rw(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_read(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write(name, type, str, asn1) jpayne@69: jpayne@69: # define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_read(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write_const(name, type, str, asn1) jpayne@69: jpayne@69: # define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_read(name, type, str, asn1) \ jpayne@69: IMPLEMENT_PEM_write_cb(name, type, str, asn1) jpayne@69: jpayne@69: /* These are the same except they are for the declarations */ jpayne@69: jpayne@69: # if defined(OPENSSL_NO_STDIO) jpayne@69: jpayne@69: # define DECLARE_PEM_read_fp(name, type) /**/ jpayne@69: # define DECLARE_PEM_write_fp(name, type) /**/ jpayne@69: # define DECLARE_PEM_write_fp_const(name, type) /**/ jpayne@69: # define DECLARE_PEM_write_cb_fp(name, type) /**/ jpayne@69: # else jpayne@69: jpayne@69: # define DECLARE_PEM_read_fp(name, type) \ jpayne@69: type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); jpayne@69: jpayne@69: # define DECLARE_PEM_write_fp(name, type) \ jpayne@69: int PEM_write_##name(FILE *fp, type *x); jpayne@69: jpayne@69: # define DECLARE_PEM_write_fp_const(name, type) \ jpayne@69: int PEM_write_##name(FILE *fp, const type *x); jpayne@69: jpayne@69: # define DECLARE_PEM_write_cb_fp(name, type) \ jpayne@69: int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ jpayne@69: unsigned char *kstr, int klen, pem_password_cb *cb, void *u); jpayne@69: jpayne@69: # endif jpayne@69: jpayne@69: # define DECLARE_PEM_read_bio(name, type) \ jpayne@69: type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); jpayne@69: jpayne@69: # define DECLARE_PEM_write_bio(name, type) \ jpayne@69: int PEM_write_bio_##name(BIO *bp, type *x); jpayne@69: jpayne@69: # define DECLARE_PEM_write_bio_const(name, type) \ jpayne@69: int PEM_write_bio_##name(BIO *bp, const type *x); jpayne@69: jpayne@69: # define DECLARE_PEM_write_cb_bio(name, type) \ jpayne@69: int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ jpayne@69: unsigned char *kstr, int klen, pem_password_cb *cb, void *u); jpayne@69: jpayne@69: # define DECLARE_PEM_write(name, type) \ jpayne@69: DECLARE_PEM_write_bio(name, type) \ jpayne@69: DECLARE_PEM_write_fp(name, type) jpayne@69: # define DECLARE_PEM_write_const(name, type) \ jpayne@69: DECLARE_PEM_write_bio_const(name, type) \ jpayne@69: DECLARE_PEM_write_fp_const(name, type) jpayne@69: # define DECLARE_PEM_write_cb(name, type) \ jpayne@69: DECLARE_PEM_write_cb_bio(name, type) \ jpayne@69: DECLARE_PEM_write_cb_fp(name, type) jpayne@69: # define DECLARE_PEM_read(name, type) \ jpayne@69: DECLARE_PEM_read_bio(name, type) \ jpayne@69: DECLARE_PEM_read_fp(name, type) jpayne@69: # define DECLARE_PEM_rw(name, type) \ jpayne@69: DECLARE_PEM_read(name, type) \ jpayne@69: DECLARE_PEM_write(name, type) jpayne@69: # define DECLARE_PEM_rw_const(name, type) \ jpayne@69: DECLARE_PEM_read(name, type) \ jpayne@69: DECLARE_PEM_write_const(name, type) jpayne@69: # define DECLARE_PEM_rw_cb(name, type) \ jpayne@69: DECLARE_PEM_read(name, type) \ jpayne@69: DECLARE_PEM_write_cb(name, type) jpayne@69: typedef int pem_password_cb (char *buf, int size, int rwflag, void *userdata); jpayne@69: jpayne@69: int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); jpayne@69: int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *len, jpayne@69: pem_password_cb *callback, void *u); jpayne@69: jpayne@69: int PEM_read_bio(BIO *bp, char **name, char **header, jpayne@69: unsigned char **data, long *len); jpayne@69: # define PEM_FLAG_SECURE 0x1 jpayne@69: # define PEM_FLAG_EAY_COMPATIBLE 0x2 jpayne@69: # define PEM_FLAG_ONLY_B64 0x4 jpayne@69: int PEM_read_bio_ex(BIO *bp, char **name, char **header, jpayne@69: unsigned char **data, long *len, unsigned int flags); jpayne@69: int PEM_bytes_read_bio_secmem(unsigned char **pdata, long *plen, char **pnm, jpayne@69: const char *name, BIO *bp, pem_password_cb *cb, jpayne@69: void *u); jpayne@69: int PEM_write_bio(BIO *bp, const char *name, const char *hdr, jpayne@69: const unsigned char *data, long len); jpayne@69: int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, jpayne@69: const char *name, BIO *bp, pem_password_cb *cb, jpayne@69: void *u); jpayne@69: void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, jpayne@69: const EVP_CIPHER *enc, unsigned char *kstr, int klen, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: jpayne@69: STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: int PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc, jpayne@69: unsigned char *kstr, int klen, jpayne@69: pem_password_cb *cd, void *u); jpayne@69: jpayne@69: #ifndef OPENSSL_NO_STDIO jpayne@69: int PEM_read(FILE *fp, char **name, char **header, jpayne@69: unsigned char **data, long *len); jpayne@69: int PEM_write(FILE *fp, const char *name, const char *hdr, jpayne@69: const unsigned char *data, long len); jpayne@69: void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, jpayne@69: void *x, const EVP_CIPHER *enc, unsigned char *kstr, jpayne@69: int klen, pem_password_cb *callback, void *u); jpayne@69: STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: #endif jpayne@69: jpayne@69: int PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); jpayne@69: int PEM_SignUpdate(EVP_MD_CTX *ctx, unsigned char *d, unsigned int cnt); jpayne@69: int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, jpayne@69: unsigned int *siglen, EVP_PKEY *pkey); jpayne@69: jpayne@69: /* The default pem_password_cb that's used internally */ jpayne@69: int PEM_def_callback(char *buf, int num, int rwflag, void *userdata); jpayne@69: void PEM_proc_type(char *buf, int type); jpayne@69: void PEM_dek_info(char *buf, const char *type, int len, char *str); jpayne@69: jpayne@69: # include jpayne@69: jpayne@69: DECLARE_PEM_rw(X509, X509) jpayne@69: DECLARE_PEM_rw(X509_AUX, X509) jpayne@69: DECLARE_PEM_rw(X509_REQ, X509_REQ) jpayne@69: DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) jpayne@69: DECLARE_PEM_rw(X509_CRL, X509_CRL) jpayne@69: DECLARE_PEM_rw(PKCS7, PKCS7) jpayne@69: DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) jpayne@69: DECLARE_PEM_rw(PKCS8, X509_SIG) jpayne@69: DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) jpayne@69: # ifndef OPENSSL_NO_RSA jpayne@69: DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) jpayne@69: DECLARE_PEM_rw_const(RSAPublicKey, RSA) jpayne@69: DECLARE_PEM_rw(RSA_PUBKEY, RSA) jpayne@69: # endif jpayne@69: # ifndef OPENSSL_NO_DSA jpayne@69: DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) jpayne@69: DECLARE_PEM_rw(DSA_PUBKEY, DSA) jpayne@69: DECLARE_PEM_rw_const(DSAparams, DSA) jpayne@69: # endif jpayne@69: # ifndef OPENSSL_NO_EC jpayne@69: DECLARE_PEM_rw_const(ECPKParameters, EC_GROUP) jpayne@69: DECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY) jpayne@69: DECLARE_PEM_rw(EC_PUBKEY, EC_KEY) jpayne@69: # endif jpayne@69: # ifndef OPENSSL_NO_DH jpayne@69: DECLARE_PEM_rw_const(DHparams, DH) jpayne@69: DECLARE_PEM_write_const(DHxparams, DH) jpayne@69: # endif jpayne@69: DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) jpayne@69: DECLARE_PEM_rw(PUBKEY, EVP_PKEY) jpayne@69: jpayne@69: int PEM_write_bio_PrivateKey_traditional(BIO *bp, EVP_PKEY *x, jpayne@69: const EVP_CIPHER *enc, jpayne@69: unsigned char *kstr, int klen, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: jpayne@69: int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, jpayne@69: char *kstr, int klen, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, jpayne@69: char *, int, pem_password_cb *, void *); jpayne@69: int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, jpayne@69: char *kstr, int klen, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, jpayne@69: char *kstr, int klen, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, jpayne@69: void *u); jpayne@69: jpayne@69: # ifndef OPENSSL_NO_STDIO jpayne@69: int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, jpayne@69: char *kstr, int klen, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, jpayne@69: char *kstr, int klen, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, jpayne@69: char *kstr, int klen, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: jpayne@69: EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, jpayne@69: void *u); jpayne@69: jpayne@69: int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, jpayne@69: char *kstr, int klen, pem_password_cb *cd, jpayne@69: void *u); jpayne@69: # endif jpayne@69: EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); jpayne@69: int PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x); jpayne@69: jpayne@69: # ifndef OPENSSL_NO_DSA jpayne@69: EVP_PKEY *b2i_PrivateKey(const unsigned char **in, long length); jpayne@69: EVP_PKEY *b2i_PublicKey(const unsigned char **in, long length); jpayne@69: EVP_PKEY *b2i_PrivateKey_bio(BIO *in); jpayne@69: EVP_PKEY *b2i_PublicKey_bio(BIO *in); jpayne@69: int i2b_PrivateKey_bio(BIO *out, EVP_PKEY *pk); jpayne@69: int i2b_PublicKey_bio(BIO *out, EVP_PKEY *pk); jpayne@69: # ifndef OPENSSL_NO_RC4 jpayne@69: EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u); jpayne@69: int i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel, jpayne@69: pem_password_cb *cb, void *u); jpayne@69: # endif jpayne@69: # endif jpayne@69: jpayne@69: # ifdef __cplusplus jpayne@69: } jpayne@69: # endif jpayne@69: #endif