1/* crypto/pem/pem.h */ 2/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay@cryptsoft.com). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay@cryptsoft.com)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 59#ifndef HEADER_PEM_H 60#define HEADER_PEM_H 61 62#ifndef OPENSSL_NO_BIO 63#include <openssl/bio.h> 64#endif 65#ifndef OPENSSL_NO_STACK 66#include <openssl/stack.h> 67#endif 68#include <openssl/evp.h> 69#include <openssl/x509.h> 70#include <openssl/pem2.h> 71#include <openssl/e_os2.h> 72 73#ifdef __cplusplus 74extern "C" { 75#endif 76 77#define PEM_BUFSIZE 1024 78 79#define PEM_OBJ_UNDEF 0 80#define PEM_OBJ_X509 1 81#define PEM_OBJ_X509_REQ 2 82#define PEM_OBJ_CRL 3 83#define PEM_OBJ_SSL_SESSION 4 84#define PEM_OBJ_PRIV_KEY 10 85#define PEM_OBJ_PRIV_RSA 11 86#define PEM_OBJ_PRIV_DSA 12 87#define PEM_OBJ_PRIV_DH 13 88#define PEM_OBJ_PUB_RSA 14 89#define PEM_OBJ_PUB_DSA 15 90#define PEM_OBJ_PUB_DH 16 91#define PEM_OBJ_DHPARAMS 17 92#define PEM_OBJ_DSAPARAMS 18 93#define PEM_OBJ_PRIV_RSA_PUBLIC 19 94 95#define PEM_ERROR 30 96#define PEM_DEK_DES_CBC 40 97#define PEM_DEK_IDEA_CBC 45 98#define PEM_DEK_DES_EDE 50 99#define PEM_DEK_DES_ECB 60 100#define PEM_DEK_RSA 70 101#define PEM_DEK_RSA_MD2 80 102#define PEM_DEK_RSA_MD5 90 103 104#define PEM_MD_MD2 NID_md2 105#define PEM_MD_MD5 NID_md5 106#define PEM_MD_SHA NID_sha 107#define PEM_MD_MD2_RSA NID_md2WithRSAEncryption 108#define PEM_MD_MD5_RSA NID_md5WithRSAEncryption 109#define PEM_MD_SHA_RSA NID_sha1WithRSAEncryption 110 111#define PEM_STRING_X509_OLD "X509 CERTIFICATE" 112#define PEM_STRING_X509 "CERTIFICATE" 113#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" 114#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" 115#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" 116#define PEM_STRING_X509_CRL "X509 CRL" 117#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" 118#define PEM_STRING_PUBLIC "PUBLIC KEY" 119#define PEM_STRING_RSA "RSA PRIVATE KEY" 120#define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" 121#define PEM_STRING_DSA "DSA PRIVATE KEY" 122#define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" 123#define PEM_STRING_PKCS7 "PKCS7" 124#define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" 125#define PEM_STRING_PKCS8INF "PRIVATE KEY" 126#define PEM_STRING_DHPARAMS "DH PARAMETERS" 127#define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" 128#define PEM_STRING_DSAPARAMS "DSA PARAMETERS" 129 130 /* Note that this structure is initialised by PEM_SealInit and cleaned up 131 by PEM_SealFinal (at least for now) */ 132typedef struct PEM_Encode_Seal_st 133 { 134 EVP_ENCODE_CTX encode; 135 EVP_MD_CTX md; 136 EVP_CIPHER_CTX cipher; 137 } PEM_ENCODE_SEAL_CTX; 138 139/* enc_type is one off */ 140#define PEM_TYPE_ENCRYPTED 10 141#define PEM_TYPE_MIC_ONLY 20 142#define PEM_TYPE_MIC_CLEAR 30 143#define PEM_TYPE_CLEAR 40 144 145typedef struct pem_recip_st 146 { 147 char *name; 148 X509_NAME *dn; 149 150 int cipher; 151 int key_enc; 152 /* char iv[8]; unused and wrong size */ 153 } PEM_USER; 154 155typedef struct pem_ctx_st 156 { 157 int type; /* what type of object */ 158 159 struct { 160 int version; 161 int mode; 162 } proc_type; 163 164 char *domain; 165 166 struct { 167 int cipher; 168 /* unused, and wrong size 169 unsigned char iv[8]; */ 170 } DEK_info; 171 172 PEM_USER *originator; 173 174 int num_recipient; 175 PEM_USER **recipient; 176 177#ifndef OPENSSL_NO_STACK 178 STACK *x509_chain; /* certificate chain */ 179#else 180 char *x509_chain; /* certificate chain */ 181#endif 182 EVP_MD *md; /* signature type */ 183 184 int md_enc; /* is the md encrypted or not? */ 185 int md_len; /* length of md_data */ 186 char *md_data; /* message digest, could be pkey encrypted */ 187 188 EVP_CIPHER *dec; /* date encryption cipher */ 189 int key_len; /* key length */ 190 unsigned char *key; /* key */ 191 /* unused, and wrong size 192 unsigned char iv[8]; */ 193 194 195 int data_enc; /* is the data encrypted */ 196 int data_len; 197 unsigned char *data; 198 } PEM_CTX; 199 200/* These macros make the PEM_read/PEM_write functions easier to maintain and 201 * write. Now they are all implemented with either: 202 * IMPLEMENT_PEM_rw(...) or IMPLEMENT_PEM_rw_cb(...) 203 */ 204 205#ifdef OPENSSL_NO_FP_API 206 207#define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ 208#define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ 209#define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ 210 211#else 212 213#define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ 214type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ 215{ \ 216return((type *)PEM_ASN1_read((char *(*)())d2i_##asn1, str,fp,(char **)x,\ 217 cb,u)); \ 218} \ 219 220#define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ 221int PEM_write_##name(FILE *fp, type *x) \ 222{ \ 223return(PEM_ASN1_write((int (*)())i2d_##asn1,str,fp, (char *)x, \ 224 NULL,NULL,0,NULL,NULL)); \ 225} 226 227#define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ 228int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ 229 unsigned char *kstr, int klen, pem_password_cb *cb, \ 230 void *u) \ 231 { \ 232 return(PEM_ASN1_write((int (*)())i2d_##asn1,str,fp, \ 233 (char *)x,enc,kstr,klen,cb,u)); \ 234 } 235 236#endif 237 238#define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ 239type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ 240{ \ 241return((type *)PEM_ASN1_read_bio((char *(*)())d2i_##asn1, str,bp,\ 242 (char **)x,cb,u)); \ 243} 244 245#define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ 246int PEM_write_bio_##name(BIO *bp, type *x) \ 247{ \ 248return(PEM_ASN1_write_bio((int (*)())i2d_##asn1,str,bp, (char *)x, \ 249 NULL,NULL,0,NULL,NULL)); \ 250} 251 252#define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ 253int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ 254 unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ 255 { \ 256 return(PEM_ASN1_write_bio((int (*)())i2d_##asn1,str,bp, \ 257 (char *)x,enc,kstr,klen,cb,u)); \ 258 } 259 260#define IMPLEMENT_PEM_write(name, type, str, asn1) \ 261 IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ 262 IMPLEMENT_PEM_write_fp(name, type, str, asn1) 263 264#define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ 265 IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ 266 IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) 267 268#define IMPLEMENT_PEM_read(name, type, str, asn1) \ 269 IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ 270 IMPLEMENT_PEM_read_fp(name, type, str, asn1) 271 272#define IMPLEMENT_PEM_rw(name, type, str, asn1) \ 273 IMPLEMENT_PEM_read(name, type, str, asn1) \ 274 IMPLEMENT_PEM_write(name, type, str, asn1) 275 276#define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ 277 IMPLEMENT_PEM_read(name, type, str, asn1) \ 278 IMPLEMENT_PEM_write_cb(name, type, str, asn1) 279 280/* These are the same except they are for the declarations */ 281 282#if defined(OPENSSL_SYS_WIN16) || defined(OPENSSL_NO_FP_API) 283 284#define DECLARE_PEM_read_fp(name, type) /**/ 285#define DECLARE_PEM_write_fp(name, type) /**/ 286#define DECLARE_PEM_write_cb_fp(name, type) /**/ 287 288#else 289 290#define DECLARE_PEM_read_fp(name, type) \ 291 type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); 292 293#define DECLARE_PEM_write_fp(name, type) \ 294 int PEM_write_##name(FILE *fp, type *x); 295 296#define DECLARE_PEM_write_cb_fp(name, type) \ 297 int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ 298 unsigned char *kstr, int klen, pem_password_cb *cb, void *u); 299 300#endif 301 302#ifndef OPENSSL_NO_BIO 303#define DECLARE_PEM_read_bio(name, type) \ 304 type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); 305 306#define DECLARE_PEM_write_bio(name, type) \ 307 int PEM_write_bio_##name(BIO *bp, type *x); 308 309#define DECLARE_PEM_write_cb_bio(name, type) \ 310 int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ 311 unsigned char *kstr, int klen, pem_password_cb *cb, void *u); 312 313#else 314 315#define DECLARE_PEM_read_bio(name, type) /**/ 316#define DECLARE_PEM_write_bio(name, type) /**/ 317#define DECLARE_PEM_write_cb_bio(name, type) /**/ 318 319#endif 320 321#define DECLARE_PEM_write(name, type) \ 322 DECLARE_PEM_write_bio(name, type) \ 323 DECLARE_PEM_write_fp(name, type) 324 325#define DECLARE_PEM_write_cb(name, type) \ 326 DECLARE_PEM_write_cb_bio(name, type) \ 327 DECLARE_PEM_write_cb_fp(name, type) 328 329#define DECLARE_PEM_read(name, type) \ 330 DECLARE_PEM_read_bio(name, type) \ 331 DECLARE_PEM_read_fp(name, type) 332 333#define DECLARE_PEM_rw(name, type) \ 334 DECLARE_PEM_read(name, type) \ 335 DECLARE_PEM_write(name, type) 336 337#define DECLARE_PEM_rw_cb(name, type) \ 338 DECLARE_PEM_read(name, type) \ 339 DECLARE_PEM_write_cb(name, type) 340 341#ifdef SSLEAY_MACROS 342 343#define PEM_write_SSL_SESSION(fp,x) \ 344 PEM_ASN1_write((int (*)())i2d_SSL_SESSION, \ 345 PEM_STRING_SSL_SESSION,fp, (char *)x, NULL,NULL,0,NULL,NULL) 346#define PEM_write_X509(fp,x) \ 347 PEM_ASN1_write((int (*)())i2d_X509,PEM_STRING_X509,fp, \ 348 (char *)x, NULL,NULL,0,NULL,NULL) 349#define PEM_write_X509_REQ(fp,x) PEM_ASN1_write( \ 350 (int (*)())i2d_X509_REQ,PEM_STRING_X509_REQ,fp,(char *)x, \ 351 NULL,NULL,0,NULL,NULL) 352#define PEM_write_X509_CRL(fp,x) \ 353 PEM_ASN1_write((int (*)())i2d_X509_CRL,PEM_STRING_X509_CRL, \ 354 fp,(char *)x, NULL,NULL,0,NULL,NULL) 355#define PEM_write_RSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \ 356 PEM_ASN1_write((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,fp,\ 357 (char *)x,enc,kstr,klen,cb,u) 358#define PEM_write_RSAPublicKey(fp,x) \ 359 PEM_ASN1_write((int (*)())i2d_RSAPublicKey,\ 360 PEM_STRING_RSA_PUBLIC,fp,(char *)x,NULL,NULL,0,NULL,NULL) 361#define PEM_write_DSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \ 362 PEM_ASN1_write((int (*)())i2d_DSAPrivateKey,PEM_STRING_DSA,fp,\ 363 (char *)x,enc,kstr,klen,cb,u) 364#define PEM_write_PrivateKey(bp,x,enc,kstr,klen,cb,u) \ 365 PEM_ASN1_write((int (*)())i2d_PrivateKey,\ 366 (((x)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA),\ 367 bp,(char *)x,enc,kstr,klen,cb,u) 368#define PEM_write_PKCS7(fp,x) \ 369 PEM_ASN1_write((int (*)())i2d_PKCS7,PEM_STRING_PKCS7,fp, \ 370 (char *)x, NULL,NULL,0,NULL,NULL) 371#define PEM_write_DHparams(fp,x) \ 372 PEM_ASN1_write((int (*)())i2d_DHparams,PEM_STRING_DHPARAMS,fp,\ 373 (char *)x,NULL,NULL,0,NULL,NULL) 374 375#define PEM_write_NETSCAPE_CERT_SEQUENCE(fp,x) \ 376 PEM_ASN1_write((int (*)())i2d_NETSCAPE_CERT_SEQUENCE, \ 377 PEM_STRING_X509,fp, \ 378 (char *)x, NULL,NULL,0,NULL,NULL) 379 380#define PEM_read_SSL_SESSION(fp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read( \ 381 (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,fp,(char **)x,cb,u) 382#define PEM_read_X509(fp,x,cb,u) (X509 *)PEM_ASN1_read( \ 383 (char *(*)())d2i_X509,PEM_STRING_X509,fp,(char **)x,cb,u) 384#define PEM_read_X509_REQ(fp,x,cb,u) (X509_REQ *)PEM_ASN1_read( \ 385 (char *(*)())d2i_X509_REQ,PEM_STRING_X509_REQ,fp,(char **)x,cb,u) 386#define PEM_read_X509_CRL(fp,x,cb,u) (X509_CRL *)PEM_ASN1_read( \ 387 (char *(*)())d2i_X509_CRL,PEM_STRING_X509_CRL,fp,(char **)x,cb,u) 388#define PEM_read_RSAPrivateKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \ 389 (char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,fp,(char **)x,cb,u) 390#define PEM_read_RSAPublicKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \ 391 (char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,fp,(char **)x,cb,u) 392#define PEM_read_DSAPrivateKey(fp,x,cb,u) (DSA *)PEM_ASN1_read( \ 393 (char *(*)())d2i_DSAPrivateKey,PEM_STRING_DSA,fp,(char **)x,cb,u) 394#define PEM_read_PrivateKey(fp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read( \ 395 (char *(*)())d2i_PrivateKey,PEM_STRING_EVP_PKEY,fp,(char **)x,cb,u) 396#define PEM_read_PKCS7(fp,x,cb,u) (PKCS7 *)PEM_ASN1_read( \ 397 (char *(*)())d2i_PKCS7,PEM_STRING_PKCS7,fp,(char **)x,cb,u) 398#define PEM_read_DHparams(fp,x,cb,u) (DH *)PEM_ASN1_read( \ 399 (char *(*)())d2i_DHparams,PEM_STRING_DHPARAMS,fp,(char **)x,cb,u) 400 401#define PEM_read_NETSCAPE_CERT_SEQUENCE(fp,x,cb,u) \ 402 (NETSCAPE_CERT_SEQUENCE *)PEM_ASN1_read( \ 403 (char *(*)())d2i_NETSCAPE_CERT_SEQUENCE,PEM_STRING_X509,fp,\ 404 (char **)x,cb,u) 405 406#define PEM_write_bio_SSL_SESSION(bp,x) \ 407 PEM_ASN1_write_bio((int (*)())i2d_SSL_SESSION, \ 408 PEM_STRING_SSL_SESSION,bp, (char *)x, NULL,NULL,0,NULL,NULL) 409#define PEM_write_bio_X509(bp,x) \ 410 PEM_ASN1_write_bio((int (*)())i2d_X509,PEM_STRING_X509,bp, \ 411 (char *)x, NULL,NULL,0,NULL,NULL) 412#define PEM_write_bio_X509_REQ(bp,x) PEM_ASN1_write_bio( \ 413 (int (*)())i2d_X509_REQ,PEM_STRING_X509_REQ,bp,(char *)x, \ 414 NULL,NULL,0,NULL,NULL) 415#define PEM_write_bio_X509_CRL(bp,x) \ 416 PEM_ASN1_write_bio((int (*)())i2d_X509_CRL,PEM_STRING_X509_CRL,\ 417 bp,(char *)x, NULL,NULL,0,NULL,NULL) 418#define PEM_write_bio_RSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \ 419 PEM_ASN1_write_bio((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,\ 420 bp,(char *)x,enc,kstr,klen,cb,u) 421#define PEM_write_bio_RSAPublicKey(bp,x) \ 422 PEM_ASN1_write_bio((int (*)())i2d_RSAPublicKey, \ 423 PEM_STRING_RSA_PUBLIC,\ 424 bp,(char *)x,NULL,NULL,0,NULL,NULL) 425#define PEM_write_bio_DSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \ 426 PEM_ASN1_write_bio((int (*)())i2d_DSAPrivateKey,PEM_STRING_DSA,\ 427 bp,(char *)x,enc,kstr,klen,cb,u) 428#define PEM_write_bio_PrivateKey(bp,x,enc,kstr,klen,cb,u) \ 429 PEM_ASN1_write_bio((int (*)())i2d_PrivateKey,\ 430 (((x)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA),\ 431 bp,(char *)x,enc,kstr,klen,cb,u) 432#define PEM_write_bio_PKCS7(bp,x) \ 433 PEM_ASN1_write_bio((int (*)())i2d_PKCS7,PEM_STRING_PKCS7,bp, \ 434 (char *)x, NULL,NULL,0,NULL,NULL) 435#define PEM_write_bio_DHparams(bp,x) \ 436 PEM_ASN1_write_bio((int (*)())i2d_DHparams,PEM_STRING_DHPARAMS,\ 437 bp,(char *)x,NULL,NULL,0,NULL,NULL) 438#define PEM_write_bio_DSAparams(bp,x) \ 439 PEM_ASN1_write_bio((int (*)())i2d_DSAparams, \ 440 PEM_STRING_DSAPARAMS,bp,(char *)x,NULL,NULL,0,NULL,NULL) 441 442#define PEM_write_bio_NETSCAPE_CERT_SEQUENCE(bp,x) \ 443 PEM_ASN1_write_bio((int (*)())i2d_NETSCAPE_CERT_SEQUENCE, \ 444 PEM_STRING_X509,bp, \ 445 (char *)x, NULL,NULL,0,NULL,NULL) 446 447#define PEM_read_bio_SSL_SESSION(bp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read_bio( \ 448 (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,bp,(char **)x,cb,u) 449#define PEM_read_bio_X509(bp,x,cb,u) (X509 *)PEM_ASN1_read_bio( \ 450 (char *(*)())d2i_X509,PEM_STRING_X509,bp,(char **)x,cb,u) 451#define PEM_read_bio_X509_REQ(bp,x,cb,u) (X509_REQ *)PEM_ASN1_read_bio( \ 452 (char *(*)())d2i_X509_REQ,PEM_STRING_X509_REQ,bp,(char **)x,cb,u) 453#define PEM_read_bio_X509_CRL(bp,x,cb,u) (X509_CRL *)PEM_ASN1_read_bio( \ 454 (char *(*)())d2i_X509_CRL,PEM_STRING_X509_CRL,bp,(char **)x,cb,u) 455#define PEM_read_bio_RSAPrivateKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \ 456 (char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,bp,(char **)x,cb,u) 457#define PEM_read_bio_RSAPublicKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \ 458 (char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,bp,(char **)x,cb,u) 459#define PEM_read_bio_DSAPrivateKey(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \ 460 (char *(*)())d2i_DSAPrivateKey,PEM_STRING_DSA,bp,(char **)x,cb,u) 461#define PEM_read_bio_PrivateKey(bp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read_bio( \ 462 (char *(*)())d2i_PrivateKey,PEM_STRING_EVP_PKEY,bp,(char **)x,cb,u) 463 464#define PEM_read_bio_PKCS7(bp,x,cb,u) (PKCS7 *)PEM_ASN1_read_bio( \ 465 (char *(*)())d2i_PKCS7,PEM_STRING_PKCS7,bp,(char **)x,cb,u) 466#define PEM_read_bio_DHparams(bp,x,cb,u) (DH *)PEM_ASN1_read_bio( \ 467 (char *(*)())d2i_DHparams,PEM_STRING_DHPARAMS,bp,(char **)x,cb,u) 468#define PEM_read_bio_DSAparams(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \ 469 (char *(*)())d2i_DSAparams,PEM_STRING_DSAPARAMS,bp,(char **)x,cb,u) 470 471#define PEM_read_bio_NETSCAPE_CERT_SEQUENCE(bp,x,cb,u) \ 472 (NETSCAPE_CERT_SEQUENCE *)PEM_ASN1_read_bio( \ 473 (char *(*)())d2i_NETSCAPE_CERT_SEQUENCE,PEM_STRING_X509,bp,\ 474 (char **)x,cb,u) 475 476#endif 477 478#if 1 479/* "userdata": new with OpenSSL 0.9.4 */ 480typedef int pem_password_cb(char *buf, int size, int rwflag, void *userdata); 481#else 482/* OpenSSL 0.9.3, 0.9.3a */ 483typedef int pem_password_cb(char *buf, int size, int rwflag); 484#endif 485 486int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); 487int PEM_do_header (EVP_CIPHER_INFO *cipher, unsigned char *data,long *len, 488 pem_password_cb *callback,void *u); 489 490#ifndef OPENSSL_NO_BIO 491int PEM_read_bio(BIO *bp, char **name, char **header, 492 unsigned char **data,long *len); 493int PEM_write_bio(BIO *bp,const char *name,char *hdr,unsigned char *data, 494 long len); 495int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, const char *name, BIO *bp, 496 pem_password_cb *cb, void *u); 497char * PEM_ASN1_read_bio(char *(*d2i)(),const char *name,BIO *bp,char **x, 498 pem_password_cb *cb, void *u); 499int PEM_ASN1_write_bio(int (*i2d)(),const char *name,BIO *bp,char *x, 500 const EVP_CIPHER *enc,unsigned char *kstr,int klen, 501 pem_password_cb *cb, void *u); 502STACK_OF(X509_INFO) * PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u); 503int PEM_X509_INFO_write_bio(BIO *bp,X509_INFO *xi, EVP_CIPHER *enc, 504 unsigned char *kstr, int klen, pem_password_cb *cd, void *u); 505#endif 506 507#ifndef OPENSSL_SYS_WIN16 508int PEM_read(FILE *fp, char **name, char **header, 509 unsigned char **data,long *len); 510int PEM_write(FILE *fp,char *name,char *hdr,unsigned char *data,long len); 511char * PEM_ASN1_read(char *(*d2i)(),const char *name,FILE *fp,char **x, 512 pem_password_cb *cb, void *u); 513int PEM_ASN1_write(int (*i2d)(),const char *name,FILE *fp,char *x, 514 const EVP_CIPHER *enc,unsigned char *kstr,int klen, 515 pem_password_cb *callback, void *u); 516STACK_OF(X509_INFO) * PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, 517 pem_password_cb *cb, void *u); 518#endif 519 520int PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type, 521 EVP_MD *md_type, unsigned char **ek, int *ekl, 522 unsigned char *iv, EVP_PKEY **pubk, int npubk); 523void PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl, 524 unsigned char *in, int inl); 525int PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig,int *sigl, 526 unsigned char *out, int *outl, EVP_PKEY *priv); 527 528void PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); 529void PEM_SignUpdate(EVP_MD_CTX *ctx,unsigned char *d,unsigned int cnt); 530int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, 531 unsigned int *siglen, EVP_PKEY *pkey); 532 533int PEM_def_callback(char *buf, int num, int w, void *key); 534void PEM_proc_type(char *buf, int type); 535void PEM_dek_info(char *buf, const char *type, int len, char *str); 536 537#ifndef SSLEAY_MACROS 538 539#include <openssl/symhacks.h> 540 541DECLARE_PEM_rw(X509, X509) 542 543DECLARE_PEM_rw(X509_AUX, X509) 544 545DECLARE_PEM_rw(X509_REQ, X509_REQ) 546DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) 547 548DECLARE_PEM_rw(X509_CRL, X509_CRL) 549 550DECLARE_PEM_rw(PKCS7, PKCS7) 551 552DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) 553 554DECLARE_PEM_rw(PKCS8, X509_SIG) 555 556DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) 557 558#ifndef OPENSSL_NO_RSA 559 560DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) 561 562DECLARE_PEM_rw(RSAPublicKey, RSA) 563DECLARE_PEM_rw(RSA_PUBKEY, RSA) 564 565#endif 566 567#ifndef OPENSSL_NO_DSA 568 569DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) 570 571DECLARE_PEM_rw(DSA_PUBKEY, DSA) 572 573DECLARE_PEM_rw(DSAparams, DSA) 574 575#endif 576 577#ifndef OPENSSL_NO_DH 578 579DECLARE_PEM_rw(DHparams, DH) 580 581#endif 582 583DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) 584 585DECLARE_PEM_rw(PUBKEY, EVP_PKEY) 586 587int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, 588 char *kstr, int klen, 589 pem_password_cb *cb, void *u); 590int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, 591 char *, int, pem_password_cb *, void *); 592int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, 593 char *kstr, int klen, 594 pem_password_cb *cb, void *u); 595int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, 596 char *kstr, int klen, 597 pem_password_cb *cb, void *u); 598EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u); 599 600int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, 601 char *kstr, int klen, 602 pem_password_cb *cb, void *u); 603int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, 604 char *kstr, int klen, 605 pem_password_cb *cb, void *u); 606int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, 607 char *kstr, int klen, 608 pem_password_cb *cb, void *u); 609 610EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u); 611 612int PEM_write_PKCS8PrivateKey(FILE *fp,EVP_PKEY *x,const EVP_CIPHER *enc, 613 char *kstr,int klen, pem_password_cb *cd, void *u); 614 615#endif /* SSLEAY_MACROS */ 616 617 618/* BEGIN ERROR CODES */ 619/* The following lines are auto generated by the script mkerr.pl. Any changes 620 * made after this point may be overwritten when the script is next run. 621 */ 622void ERR_load_PEM_strings(void); 623 624/* Error codes for the PEM functions. */ 625 626/* Function codes. */ 627#define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 120 628#define PEM_F_D2I_PKCS8PRIVATEKEY_FP 121 629#define PEM_F_DEF_CALLBACK 100 630#define PEM_F_LOAD_IV 101 631#define PEM_F_PEM_ASN1_READ 102 632#define PEM_F_PEM_ASN1_READ_BIO 103 633#define PEM_F_PEM_ASN1_WRITE 104 634#define PEM_F_PEM_ASN1_WRITE_BIO 105 635#define PEM_F_PEM_DO_HEADER 106 636#define PEM_F_PEM_F_DO_PK8KEY_FP 122 637#define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY 118 638#define PEM_F_PEM_GET_EVP_CIPHER_INFO 107 639#define PEM_F_PEM_READ 108 640#define PEM_F_PEM_READ_BIO 109 641#define PEM_F_PEM_SEALFINAL 110 642#define PEM_F_PEM_SEALINIT 111 643#define PEM_F_PEM_SIGNFINAL 112 644#define PEM_F_PEM_WRITE 113 645#define PEM_F_PEM_WRITE_BIO 114 646#define PEM_F_PEM_WRITE_BIO_PKCS8PRIVATEKEY 119 647#define PEM_F_PEM_X509_INFO_READ 115 648#define PEM_F_PEM_X509_INFO_READ_BIO 116 649#define PEM_F_PEM_X509_INFO_WRITE_BIO 117 650 651/* Reason codes. */ 652#define PEM_R_BAD_BASE64_DECODE 100 653#define PEM_R_BAD_DECRYPT 101 654#define PEM_R_BAD_END_LINE 102 655#define PEM_R_BAD_IV_CHARS 103 656#define PEM_R_BAD_PASSWORD_READ 104 657#define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 658#define PEM_R_NOT_DEK_INFO 105 659#define PEM_R_NOT_ENCRYPTED 106 660#define PEM_R_NOT_PROC_TYPE 107 661#define PEM_R_NO_START_LINE 108 662#define PEM_R_PROBLEMS_GETTING_PASSWORD 109 663#define PEM_R_PUBLIC_KEY_NO_RSA 110 664#define PEM_R_READ_KEY 111 665#define PEM_R_SHORT_HEADER 112 666#define PEM_R_UNSUPPORTED_CIPHER 113 667#define PEM_R_UNSUPPORTED_ENCRYPTION 114 668 669#ifdef __cplusplus 670} 671#endif 672#endif 673