155714Skris/* crypto/pem/pem.h */ 255714Skris/* Copyright (C) 1995-1997 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#ifndef HEADER_PEM_H 60296341Sdelphij# define HEADER_PEM_H 6155714Skris 62296341Sdelphij# include <openssl/e_os2.h> 63296341Sdelphij# ifndef OPENSSL_NO_BIO 64296341Sdelphij# include <openssl/bio.h> 65296341Sdelphij# endif 66296341Sdelphij# ifndef OPENSSL_NO_STACK 67296341Sdelphij# include <openssl/stack.h> 68296341Sdelphij# endif 69296341Sdelphij# include <openssl/evp.h> 70296341Sdelphij# include <openssl/x509.h> 71296341Sdelphij# include <openssl/pem2.h> 7255714Skris 7368651Skris#ifdef __cplusplus 7468651Skrisextern "C" { 7568651Skris#endif 7668651Skris 77296341Sdelphij# define PEM_BUFSIZE 1024 7855714Skris 79296341Sdelphij# define PEM_OBJ_UNDEF 0 80296341Sdelphij# define PEM_OBJ_X509 1 81296341Sdelphij# define PEM_OBJ_X509_REQ 2 82296341Sdelphij# define PEM_OBJ_CRL 3 83296341Sdelphij# define PEM_OBJ_SSL_SESSION 4 84296341Sdelphij# define PEM_OBJ_PRIV_KEY 10 85296341Sdelphij# define PEM_OBJ_PRIV_RSA 11 86296341Sdelphij# define PEM_OBJ_PRIV_DSA 12 87296341Sdelphij# define PEM_OBJ_PRIV_DH 13 88296341Sdelphij# define PEM_OBJ_PUB_RSA 14 89296341Sdelphij# define PEM_OBJ_PUB_DSA 15 90296341Sdelphij# define PEM_OBJ_PUB_DH 16 91296341Sdelphij# define PEM_OBJ_DHPARAMS 17 92296341Sdelphij# define PEM_OBJ_DSAPARAMS 18 93296341Sdelphij# define PEM_OBJ_PRIV_RSA_PUBLIC 19 94296341Sdelphij# define PEM_OBJ_PRIV_ECDSA 20 95296341Sdelphij# define PEM_OBJ_PUB_ECDSA 21 96296341Sdelphij# define PEM_OBJ_ECPARAMETERS 22 9755714Skris 98296341Sdelphij# define PEM_ERROR 30 99296341Sdelphij# define PEM_DEK_DES_CBC 40 100296341Sdelphij# define PEM_DEK_IDEA_CBC 45 101296341Sdelphij# define PEM_DEK_DES_EDE 50 102296341Sdelphij# define PEM_DEK_DES_ECB 60 103296341Sdelphij# define PEM_DEK_RSA 70 104296341Sdelphij# define PEM_DEK_RSA_MD2 80 105296341Sdelphij# define PEM_DEK_RSA_MD5 90 10655714Skris 107296341Sdelphij# define PEM_MD_MD2 NID_md2 108296341Sdelphij# define PEM_MD_MD5 NID_md5 109296341Sdelphij# define PEM_MD_SHA NID_sha 110296341Sdelphij# define PEM_MD_MD2_RSA NID_md2WithRSAEncryption 111296341Sdelphij# define PEM_MD_MD5_RSA NID_md5WithRSAEncryption 112296341Sdelphij# define PEM_MD_SHA_RSA NID_sha1WithRSAEncryption 11355714Skris 114296341Sdelphij# define PEM_STRING_X509_OLD "X509 CERTIFICATE" 115296341Sdelphij# define PEM_STRING_X509 "CERTIFICATE" 116296341Sdelphij# define PEM_STRING_X509_PAIR "CERTIFICATE PAIR" 117296341Sdelphij# define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" 118296341Sdelphij# define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" 119296341Sdelphij# define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" 120296341Sdelphij# define PEM_STRING_X509_CRL "X509 CRL" 121296341Sdelphij# define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" 122296341Sdelphij# define PEM_STRING_PUBLIC "PUBLIC KEY" 123296341Sdelphij# define PEM_STRING_RSA "RSA PRIVATE KEY" 124296341Sdelphij# define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" 125296341Sdelphij# define PEM_STRING_DSA "DSA PRIVATE KEY" 126296341Sdelphij# define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" 127296341Sdelphij# define PEM_STRING_PKCS7 "PKCS7" 128296341Sdelphij# define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" 129296341Sdelphij# define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" 130296341Sdelphij# define PEM_STRING_PKCS8INF "PRIVATE KEY" 131296341Sdelphij# define PEM_STRING_DHPARAMS "DH PARAMETERS" 132296341Sdelphij# define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" 133296341Sdelphij# define PEM_STRING_DSAPARAMS "DSA PARAMETERS" 134296341Sdelphij# define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" 135296341Sdelphij# define PEM_STRING_ECPARAMETERS "EC PARAMETERS" 136296341Sdelphij# define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" 137296341Sdelphij# define PEM_STRING_PARAMETERS "PARAMETERS" 138296341Sdelphij# define PEM_STRING_CMS "CMS" 13955714Skris 140296341Sdelphij /* 141296341Sdelphij * Note that this structure is initialised by PEM_SealInit and cleaned up 142296341Sdelphij * by PEM_SealFinal (at least for now) 143296341Sdelphij */ 144296341Sdelphijtypedef struct PEM_Encode_Seal_st { 145296341Sdelphij EVP_ENCODE_CTX encode; 146296341Sdelphij EVP_MD_CTX md; 147296341Sdelphij EVP_CIPHER_CTX cipher; 148296341Sdelphij} PEM_ENCODE_SEAL_CTX; 14955714Skris 15055714Skris/* enc_type is one off */ 151296341Sdelphij# define PEM_TYPE_ENCRYPTED 10 152296341Sdelphij# define PEM_TYPE_MIC_ONLY 20 153296341Sdelphij# define PEM_TYPE_MIC_CLEAR 30 154296341Sdelphij# define PEM_TYPE_CLEAR 40 15555714Skris 156296341Sdelphijtypedef struct pem_recip_st { 157296341Sdelphij char *name; 158296341Sdelphij X509_NAME *dn; 159296341Sdelphij int cipher; 160296341Sdelphij int key_enc; 161296341Sdelphij /* char iv[8]; unused and wrong size */ 162296341Sdelphij} PEM_USER; 16355714Skris 164296341Sdelphijtypedef struct pem_ctx_st { 165296341Sdelphij int type; /* what type of object */ 166296341Sdelphij struct { 167296341Sdelphij int version; 168296341Sdelphij int mode; 169296341Sdelphij } proc_type; 17055714Skris 171296341Sdelphij char *domain; 17255714Skris 173296341Sdelphij struct { 174296341Sdelphij int cipher; 175296341Sdelphij /*- 176296341Sdelphij unused, and wrong size 177296341Sdelphij unsigned char iv[8]; */ 178296341Sdelphij } DEK_info; 17955714Skris 180296341Sdelphij PEM_USER *originator; 18155714Skris 182296341Sdelphij int num_recipient; 183296341Sdelphij PEM_USER **recipient; 18455714Skris 185296341Sdelphij/*- 186296341Sdelphij XXX(ben): don#t think this is used! 187296341Sdelphij STACK *x509_chain; / * certificate chain */ 188296341Sdelphij EVP_MD *md; /* signature type */ 18955714Skris 190296341Sdelphij int md_enc; /* is the md encrypted or not? */ 191296341Sdelphij int md_len; /* length of md_data */ 192296341Sdelphij char *md_data; /* message digest, could be pkey encrypted */ 19355714Skris 194296341Sdelphij EVP_CIPHER *dec; /* date encryption cipher */ 195296341Sdelphij int key_len; /* key length */ 196296341Sdelphij unsigned char *key; /* key */ 197296341Sdelphij /*- 198296341Sdelphij unused, and wrong size 199296341Sdelphij unsigned char iv[8]; */ 20055714Skris 201296341Sdelphij int data_enc; /* is the data encrypted */ 202296341Sdelphij int data_len; 203296341Sdelphij unsigned char *data; 204296341Sdelphij} PEM_CTX; 20555714Skris 206296341Sdelphij/* 207296341Sdelphij * These macros make the PEM_read/PEM_write functions easier to maintain and 208296341Sdelphij * write. Now they are all implemented with either: IMPLEMENT_PEM_rw(...) or 209296341Sdelphij * IMPLEMENT_PEM_rw_cb(...) 21055714Skris */ 21155714Skris 212296341Sdelphij# ifdef OPENSSL_NO_FP_API 21355714Skris 214296341Sdelphij# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ 215296341Sdelphij# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ 216296341Sdelphij# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/ 217296341Sdelphij# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ 218296341Sdelphij# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/ 219296341Sdelphij# else 22055714Skris 221296341Sdelphij# define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ 22255714Skristype *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ 22355714Skris{ \ 224238405Sjkimreturn PEM_ASN1_read((d2i_of_void *)d2i_##asn1, str,fp,(void **)x,cb,u); \ 225296341Sdelphij} 22655714Skris 227296341Sdelphij# define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ 22855714Skrisint PEM_write_##name(FILE *fp, type *x) \ 22955714Skris{ \ 230238405Sjkimreturn PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL); \ 231160814Ssimon} 23255714Skris 233296341Sdelphij# define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ 234160814Ssimonint PEM_write_##name(FILE *fp, const type *x) \ 235160814Ssimon{ \ 236238405Sjkimreturn PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,(void *)x,NULL,NULL,0,NULL,NULL); \ 237160814Ssimon} 238160814Ssimon 239296341Sdelphij# define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ 24055714Skrisint PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ 241296341Sdelphij unsigned char *kstr, int klen, pem_password_cb *cb, \ 242296341Sdelphij void *u) \ 243296341Sdelphij { \ 244296341Sdelphij return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ 245296341Sdelphij } 24655714Skris 247296341Sdelphij# define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ 248160814Ssimonint PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ 249296341Sdelphij unsigned char *kstr, int klen, pem_password_cb *cb, \ 250296341Sdelphij void *u) \ 251296341Sdelphij { \ 252296341Sdelphij return PEM_ASN1_write((i2d_of_void *)i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u); \ 253296341Sdelphij } 254160814Ssimon 255296341Sdelphij# endif 25655714Skris 257296341Sdelphij# define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ 25855714Skristype *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ 25955714Skris{ \ 260238405Sjkimreturn PEM_ASN1_read_bio((d2i_of_void *)d2i_##asn1, str,bp,(void **)x,cb,u); \ 26155714Skris} 26255714Skris 263296341Sdelphij# define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ 26455714Skrisint PEM_write_bio_##name(BIO *bp, type *x) \ 26555714Skris{ \ 266238405Sjkimreturn PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL); \ 26755714Skris} 26855714Skris 269296341Sdelphij# define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ 270160814Ssimonint PEM_write_bio_##name(BIO *bp, const type *x) \ 271160814Ssimon{ \ 272238405Sjkimreturn PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,NULL,NULL,0,NULL,NULL); \ 273160814Ssimon} 274160814Ssimon 275296341Sdelphij# define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ 27655714Skrisint PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ 277296341Sdelphij unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ 278296341Sdelphij { \ 279296341Sdelphij return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u); \ 280296341Sdelphij } 28155714Skris 282296341Sdelphij# define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ 283160814Ssimonint PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ 284296341Sdelphij unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ 285296341Sdelphij { \ 286296341Sdelphij return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1,str,bp,(void *)x,enc,kstr,klen,cb,u); \ 287296341Sdelphij } 288160814Ssimon 289296341Sdelphij# define IMPLEMENT_PEM_write(name, type, str, asn1) \ 290296341Sdelphij IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ 291296341Sdelphij IMPLEMENT_PEM_write_fp(name, type, str, asn1) 29255714Skris 293296341Sdelphij# define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ 294296341Sdelphij IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ 295296341Sdelphij IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) 296160814Ssimon 297296341Sdelphij# define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ 298296341Sdelphij IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ 299296341Sdelphij IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) 30055714Skris 301296341Sdelphij# define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ 302296341Sdelphij IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ 303296341Sdelphij IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) 304160814Ssimon 305296341Sdelphij# define IMPLEMENT_PEM_read(name, type, str, asn1) \ 306296341Sdelphij IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ 307296341Sdelphij IMPLEMENT_PEM_read_fp(name, type, str, asn1) 30855714Skris 309296341Sdelphij# define IMPLEMENT_PEM_rw(name, type, str, asn1) \ 310296341Sdelphij IMPLEMENT_PEM_read(name, type, str, asn1) \ 311296341Sdelphij IMPLEMENT_PEM_write(name, type, str, asn1) 31255714Skris 313296341Sdelphij# define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ 314296341Sdelphij IMPLEMENT_PEM_read(name, type, str, asn1) \ 315296341Sdelphij IMPLEMENT_PEM_write_const(name, type, str, asn1) 316160814Ssimon 317296341Sdelphij# define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ 318296341Sdelphij IMPLEMENT_PEM_read(name, type, str, asn1) \ 319296341Sdelphij IMPLEMENT_PEM_write_cb(name, type, str, asn1) 32055714Skris 32155714Skris/* These are the same except they are for the declarations */ 32255714Skris 323296341Sdelphij# if defined(OPENSSL_NO_FP_API) 32455714Skris 325296341Sdelphij# define DECLARE_PEM_read_fp(name, type) /**/ 326296341Sdelphij# define DECLARE_PEM_write_fp(name, type) /**/ 327296341Sdelphij# define DECLARE_PEM_write_cb_fp(name, type) /**/ 328296341Sdelphij# else 32955714Skris 330296341Sdelphij# define DECLARE_PEM_read_fp(name, type) \ 331296341Sdelphij type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); 33255714Skris 333296341Sdelphij# define DECLARE_PEM_write_fp(name, type) \ 334296341Sdelphij int PEM_write_##name(FILE *fp, type *x); 33555714Skris 336296341Sdelphij# define DECLARE_PEM_write_fp_const(name, type) \ 337296341Sdelphij int PEM_write_##name(FILE *fp, const type *x); 33855714Skris 339296341Sdelphij# define DECLARE_PEM_write_cb_fp(name, type) \ 340296341Sdelphij int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ 341296341Sdelphij unsigned char *kstr, int klen, pem_password_cb *cb, void *u); 342160814Ssimon 343296341Sdelphij# endif 34455714Skris 345296341Sdelphij# ifndef OPENSSL_NO_BIO 346296341Sdelphij# define DECLARE_PEM_read_bio(name, type) \ 347296341Sdelphij type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); 34855714Skris 349296341Sdelphij# define DECLARE_PEM_write_bio(name, type) \ 350296341Sdelphij int PEM_write_bio_##name(BIO *bp, type *x); 35155714Skris 352296341Sdelphij# define DECLARE_PEM_write_bio_const(name, type) \ 353296341Sdelphij int PEM_write_bio_##name(BIO *bp, const type *x); 35455714Skris 355296341Sdelphij# define DECLARE_PEM_write_cb_bio(name, type) \ 356296341Sdelphij int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ 357296341Sdelphij unsigned char *kstr, int klen, pem_password_cb *cb, void *u); 358160814Ssimon 359296341Sdelphij# else 36055714Skris 361296341Sdelphij# define DECLARE_PEM_read_bio(name, type) /**/ 362296341Sdelphij# define DECLARE_PEM_write_bio(name, type) /**/ 363296341Sdelphij# define DECLARE_PEM_write_bio_const(name, type) /**/ 364296341Sdelphij# define DECLARE_PEM_write_cb_bio(name, type) /**/ 365296341Sdelphij# endif 366296341Sdelphij# define DECLARE_PEM_write(name, type) \ 367296341Sdelphij DECLARE_PEM_write_bio(name, type) \ 368296341Sdelphij DECLARE_PEM_write_fp(name, type) 369296341Sdelphij# define DECLARE_PEM_write_const(name, type) \ 370296341Sdelphij DECLARE_PEM_write_bio_const(name, type) \ 371296341Sdelphij DECLARE_PEM_write_fp_const(name, type) 372296341Sdelphij# define DECLARE_PEM_write_cb(name, type) \ 373296341Sdelphij DECLARE_PEM_write_cb_bio(name, type) \ 374296341Sdelphij DECLARE_PEM_write_cb_fp(name, type) 375296341Sdelphij# define DECLARE_PEM_read(name, type) \ 376296341Sdelphij DECLARE_PEM_read_bio(name, type) \ 377296341Sdelphij DECLARE_PEM_read_fp(name, type) 378296341Sdelphij# define DECLARE_PEM_rw(name, type) \ 379296341Sdelphij DECLARE_PEM_read(name, type) \ 380296341Sdelphij DECLARE_PEM_write(name, type) 381296341Sdelphij# define DECLARE_PEM_rw_const(name, type) \ 382296341Sdelphij DECLARE_PEM_read(name, type) \ 383296341Sdelphij DECLARE_PEM_write_const(name, type) 384296341Sdelphij# define DECLARE_PEM_rw_cb(name, type) \ 385296341Sdelphij DECLARE_PEM_read(name, type) \ 386296341Sdelphij DECLARE_PEM_write_cb(name, type) 387296341Sdelphij# if 1 38855714Skris/* "userdata": new with OpenSSL 0.9.4 */ 389296341Sdelphijtypedef int pem_password_cb (char *buf, int size, int rwflag, void *userdata); 390296341Sdelphij# else 39155714Skris/* OpenSSL 0.9.3, 0.9.3a */ 392296341Sdelphijtypedef int pem_password_cb (char *buf, int size, int rwflag); 393296341Sdelphij# endif 39455714Skris 395296341Sdelphijint PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); 396296341Sdelphijint PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *len, 397296341Sdelphij pem_password_cb *callback, void *u); 39855714Skris 399296341Sdelphij# ifndef OPENSSL_NO_BIO 400296341Sdelphijint PEM_read_bio(BIO *bp, char **name, char **header, 401296341Sdelphij unsigned char **data, long *len); 402296341Sdelphijint PEM_write_bio(BIO *bp, const char *name, char *hdr, unsigned char *data, 403296341Sdelphij long len); 404296341Sdelphijint PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, 405296341Sdelphij const char *name, BIO *bp, pem_password_cb *cb, 406296341Sdelphij void *u); 407296341Sdelphijvoid *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, 408296341Sdelphij pem_password_cb *cb, void *u); 409296341Sdelphijint PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, 410296341Sdelphij const EVP_CIPHER *enc, unsigned char *kstr, int klen, 411296341Sdelphij pem_password_cb *cb, void *u); 412194206Ssimon 413296341SdelphijSTACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, 414296341Sdelphij pem_password_cb *cb, void *u); 415296341Sdelphijint PEM_X509_INFO_write_bio(BIO *bp, X509_INFO *xi, EVP_CIPHER *enc, 416296341Sdelphij unsigned char *kstr, int klen, 417296341Sdelphij pem_password_cb *cd, void *u); 418296341Sdelphij# endif 41955714Skris 420296341Sdelphijint PEM_read(FILE *fp, char **name, char **header, 421296341Sdelphij unsigned char **data, long *len); 422296341Sdelphijint PEM_write(FILE *fp, char *name, char *hdr, unsigned char *data, long len); 423296341Sdelphijvoid *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, 424296341Sdelphij pem_password_cb *cb, void *u); 425296341Sdelphijint PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, 426296341Sdelphij void *x, const EVP_CIPHER *enc, unsigned char *kstr, 427296341Sdelphij int klen, pem_password_cb *callback, void *u); 428296341SdelphijSTACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, 429296341Sdelphij pem_password_cb *cb, void *u); 43055714Skris 431296341Sdelphijint PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type, 432296341Sdelphij EVP_MD *md_type, unsigned char **ek, int *ekl, 433296341Sdelphij unsigned char *iv, EVP_PKEY **pubk, int npubk); 434296341Sdelphijvoid PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl, 435296341Sdelphij unsigned char *in, int inl); 436296341Sdelphijint PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig, int *sigl, 437296341Sdelphij unsigned char *out, int *outl, EVP_PKEY *priv); 43855714Skris 439296341Sdelphijvoid PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); 440296341Sdelphijvoid PEM_SignUpdate(EVP_MD_CTX *ctx, unsigned char *d, unsigned int cnt); 441296341Sdelphijint PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, 442296341Sdelphij unsigned int *siglen, EVP_PKEY *pkey); 44355714Skris 444296341Sdelphijint PEM_def_callback(char *buf, int num, int w, void *key); 445296341Sdelphijvoid PEM_proc_type(char *buf, int type); 446296341Sdelphijvoid PEM_dek_info(char *buf, const char *type, int len, char *str); 44755714Skris 448296341Sdelphij# include <openssl/symhacks.h> 44955714Skris 45055714SkrisDECLARE_PEM_rw(X509, X509) 45159191SkrisDECLARE_PEM_rw(X509_AUX, X509) 452160814SsimonDECLARE_PEM_rw(X509_CERT_PAIR, X509_CERT_PAIR) 45355714SkrisDECLARE_PEM_rw(X509_REQ, X509_REQ) 45459191SkrisDECLARE_PEM_write(X509_REQ_NEW, X509_REQ) 45555714SkrisDECLARE_PEM_rw(X509_CRL, X509_CRL) 45655714SkrisDECLARE_PEM_rw(PKCS7, PKCS7) 45755714SkrisDECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) 45855714SkrisDECLARE_PEM_rw(PKCS8, X509_SIG) 45955714SkrisDECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) 460296341Sdelphij# ifndef OPENSSL_NO_RSA 46155714SkrisDECLARE_PEM_rw_cb(RSAPrivateKey, RSA) 462160814SsimonDECLARE_PEM_rw_const(RSAPublicKey, RSA) 46359191SkrisDECLARE_PEM_rw(RSA_PUBKEY, RSA) 464296341Sdelphij# endif 465296341Sdelphij# ifndef OPENSSL_NO_DSA 46655714SkrisDECLARE_PEM_rw_cb(DSAPrivateKey, DSA) 46759191SkrisDECLARE_PEM_rw(DSA_PUBKEY, DSA) 468160814SsimonDECLARE_PEM_rw_const(DSAparams, DSA) 469296341Sdelphij# endif 470296341Sdelphij# ifndef OPENSSL_NO_EC 471160814SsimonDECLARE_PEM_rw_const(ECPKParameters, EC_GROUP) 472160814SsimonDECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY) 473160814SsimonDECLARE_PEM_rw(EC_PUBKEY, EC_KEY) 474296341Sdelphij# endif 475296341Sdelphij# ifndef OPENSSL_NO_DH 476160814SsimonDECLARE_PEM_rw_const(DHparams, DH) 477296341Sdelphij# endif 47855714SkrisDECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) 47959191SkrisDECLARE_PEM_rw(PUBKEY, EVP_PKEY) 48059191Skris 48159191Skrisint PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, 482296341Sdelphij char *kstr, int klen, 483296341Sdelphij pem_password_cb *cb, void *u); 48455714Skrisint PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, 48555714Skris char *, int, pem_password_cb *, void *); 48659191Skrisint i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, 487296341Sdelphij char *kstr, int klen, 488296341Sdelphij pem_password_cb *cb, void *u); 48959191Skrisint i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, 490296341Sdelphij char *kstr, int klen, 491296341Sdelphij pem_password_cb *cb, void *u); 492296341SdelphijEVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, 493296341Sdelphij void *u); 49459191Skris 49559191Skrisint i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, 496296341Sdelphij char *kstr, int klen, 497296341Sdelphij pem_password_cb *cb, void *u); 49859191Skrisint i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, 499296341Sdelphij char *kstr, int klen, 500296341Sdelphij pem_password_cb *cb, void *u); 50159191Skrisint PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, 502296341Sdelphij char *kstr, int klen, 503296341Sdelphij pem_password_cb *cb, void *u); 50459191Skris 505296341SdelphijEVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, 506296341Sdelphij void *u); 50759191Skris 508296341Sdelphijint PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, 509296341Sdelphij char *kstr, int klen, pem_password_cb *cd, 510296341Sdelphij void *u); 51159191Skris 512238405SjkimEVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); 513238405Sjkimint PEM_write_bio_Parameters(BIO *bp, EVP_PKEY *x); 51455714Skris 515238405SjkimEVP_PKEY *b2i_PrivateKey(const unsigned char **in, long length); 516238405SjkimEVP_PKEY *b2i_PublicKey(const unsigned char **in, long length); 517238405SjkimEVP_PKEY *b2i_PrivateKey_bio(BIO *in); 518238405SjkimEVP_PKEY *b2i_PublicKey_bio(BIO *in); 519238405Sjkimint i2b_PrivateKey_bio(BIO *out, EVP_PKEY *pk); 520238405Sjkimint i2b_PublicKey_bio(BIO *out, EVP_PKEY *pk); 521296341Sdelphij# ifndef OPENSSL_NO_RC4 522238405SjkimEVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u); 523238405Sjkimint i2b_PVK_bio(BIO *out, EVP_PKEY *pk, int enclevel, 524296341Sdelphij pem_password_cb *cb, void *u); 525296341Sdelphij# endif 526238405Sjkim 52755714Skris/* BEGIN ERROR CODES */ 528296341Sdelphij/* 529296341Sdelphij * The following lines are auto generated by the script mkerr.pl. Any changes 53055714Skris * made after this point may be overwritten when the script is next run. 53155714Skris */ 53289837Skrisvoid ERR_load_PEM_strings(void); 53355714Skris 53455714Skris/* Error codes for the PEM functions. */ 53555714Skris 53655714Skris/* Function codes. */ 537296341Sdelphij# define PEM_F_B2I_DSS 127 538296341Sdelphij# define PEM_F_B2I_PVK_BIO 128 539296341Sdelphij# define PEM_F_B2I_RSA 129 540296341Sdelphij# define PEM_F_CHECK_BITLEN_DSA 130 541296341Sdelphij# define PEM_F_CHECK_BITLEN_RSA 131 542296341Sdelphij# define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 120 543296341Sdelphij# define PEM_F_D2I_PKCS8PRIVATEKEY_FP 121 544296341Sdelphij# define PEM_F_DO_B2I 132 545296341Sdelphij# define PEM_F_DO_B2I_BIO 133 546296341Sdelphij# define PEM_F_DO_BLOB_HEADER 134 547296341Sdelphij# define PEM_F_DO_PK8PKEY 126 548296341Sdelphij# define PEM_F_DO_PK8PKEY_FP 125 549296341Sdelphij# define PEM_F_DO_PVK_BODY 135 550296341Sdelphij# define PEM_F_DO_PVK_HEADER 136 551296341Sdelphij# define PEM_F_I2B_PVK 137 552296341Sdelphij# define PEM_F_I2B_PVK_BIO 138 553296341Sdelphij# define PEM_F_LOAD_IV 101 554296341Sdelphij# define PEM_F_PEM_ASN1_READ 102 555296341Sdelphij# define PEM_F_PEM_ASN1_READ_BIO 103 556296341Sdelphij# define PEM_F_PEM_ASN1_WRITE 104 557296341Sdelphij# define PEM_F_PEM_ASN1_WRITE_BIO 105 558296341Sdelphij# define PEM_F_PEM_DEF_CALLBACK 100 559296341Sdelphij# define PEM_F_PEM_DO_HEADER 106 560296341Sdelphij# define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY 118 561296341Sdelphij# define PEM_F_PEM_GET_EVP_CIPHER_INFO 107 562296341Sdelphij# define PEM_F_PEM_PK8PKEY 119 563296341Sdelphij# define PEM_F_PEM_READ 108 564296341Sdelphij# define PEM_F_PEM_READ_BIO 109 565296341Sdelphij# define PEM_F_PEM_READ_BIO_PARAMETERS 140 566296341Sdelphij# define PEM_F_PEM_READ_BIO_PRIVATEKEY 123 567296341Sdelphij# define PEM_F_PEM_READ_PRIVATEKEY 124 568296341Sdelphij# define PEM_F_PEM_SEALFINAL 110 569296341Sdelphij# define PEM_F_PEM_SEALINIT 111 570296341Sdelphij# define PEM_F_PEM_SIGNFINAL 112 571296341Sdelphij# define PEM_F_PEM_WRITE 113 572296341Sdelphij# define PEM_F_PEM_WRITE_BIO 114 573296341Sdelphij# define PEM_F_PEM_WRITE_PRIVATEKEY 139 574296341Sdelphij# define PEM_F_PEM_X509_INFO_READ 115 575296341Sdelphij# define PEM_F_PEM_X509_INFO_READ_BIO 116 576296341Sdelphij# define PEM_F_PEM_X509_INFO_WRITE_BIO 117 57755714Skris 57855714Skris/* Reason codes. */ 579296341Sdelphij# define PEM_R_BAD_BASE64_DECODE 100 580296341Sdelphij# define PEM_R_BAD_DECRYPT 101 581296341Sdelphij# define PEM_R_BAD_END_LINE 102 582296341Sdelphij# define PEM_R_BAD_IV_CHARS 103 583296341Sdelphij# define PEM_R_BAD_MAGIC_NUMBER 116 584296341Sdelphij# define PEM_R_BAD_PASSWORD_READ 104 585296341Sdelphij# define PEM_R_BAD_VERSION_NUMBER 117 586296341Sdelphij# define PEM_R_BIO_WRITE_FAILURE 118 587296341Sdelphij# define PEM_R_CIPHER_IS_NULL 127 588296341Sdelphij# define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 589296341Sdelphij# define PEM_R_EXPECTING_PRIVATE_KEY_BLOB 119 590296341Sdelphij# define PEM_R_EXPECTING_PUBLIC_KEY_BLOB 120 591296341Sdelphij# define PEM_R_INCONSISTENT_HEADER 121 592296341Sdelphij# define PEM_R_KEYBLOB_HEADER_PARSE_ERROR 122 593296341Sdelphij# define PEM_R_KEYBLOB_TOO_SHORT 123 594296341Sdelphij# define PEM_R_NOT_DEK_INFO 105 595296341Sdelphij# define PEM_R_NOT_ENCRYPTED 106 596296341Sdelphij# define PEM_R_NOT_PROC_TYPE 107 597296341Sdelphij# define PEM_R_NO_START_LINE 108 598296341Sdelphij# define PEM_R_PROBLEMS_GETTING_PASSWORD 109 599296341Sdelphij# define PEM_R_PUBLIC_KEY_NO_RSA 110 600296341Sdelphij# define PEM_R_PVK_DATA_TOO_SHORT 124 601296341Sdelphij# define PEM_R_PVK_TOO_SHORT 125 602296341Sdelphij# define PEM_R_READ_KEY 111 603296341Sdelphij# define PEM_R_SHORT_HEADER 112 604296341Sdelphij# define PEM_R_UNSUPPORTED_CIPHER 113 605296341Sdelphij# define PEM_R_UNSUPPORTED_ENCRYPTION 114 606296341Sdelphij# define PEM_R_UNSUPPORTED_KEY_COMPONENTS 126 60755714Skris 60855714Skris#ifdef __cplusplus 60955714Skris} 61055714Skris#endif 61155714Skris#endif 612