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