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 NO_BIO 63 #include <openssl/bio.h> 64 #endif 65 #ifndef 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 72 #ifdef __cplusplus 73 extern "C" { 74 #endif 75 76 #define PEM_BUFSIZE 1024 77 78 #define PEM_OBJ_UNDEF 0 79 #define PEM_OBJ_X509 1 80 #define PEM_OBJ_X509_REQ 2 81 #define PEM_OBJ_CRL 3 82 #define PEM_OBJ_SSL_SESSION 4 83 #define PEM_OBJ_PRIV_KEY 10 84 #define PEM_OBJ_PRIV_RSA 11 85 #define PEM_OBJ_PRIV_DSA 12 86 #define PEM_OBJ_PRIV_DH 13 87 #define PEM_OBJ_PUB_RSA 14 88 #define PEM_OBJ_PUB_DSA 15 89 #define PEM_OBJ_PUB_DH 16 90 #define PEM_OBJ_DHPARAMS 17 91 #define PEM_OBJ_DSAPARAMS 18 92 #define PEM_OBJ_PRIV_RSA_PUBLIC 19 93 94 #define PEM_ERROR 30 95 #define PEM_DEK_DES_CBC 40 96 #define PEM_DEK_IDEA_CBC 45 97 #define PEM_DEK_DES_EDE 50 98 #define PEM_DEK_DES_ECB 60 99 #define PEM_DEK_RSA 70 100 #define PEM_DEK_RSA_MD2 80 101 #define PEM_DEK_RSA_MD5 90 102 103 #define PEM_MD_MD2 NID_md2 104 #define PEM_MD_MD5 NID_md5 105 #define PEM_MD_SHA NID_sha 106 #define PEM_MD_MD2_RSA NID_md2WithRSAEncryption 107 #define PEM_MD_MD5_RSA NID_md5WithRSAEncryption 108 #define PEM_MD_SHA_RSA NID_sha1WithRSAEncryption 109 110 #define PEM_STRING_X509_OLD "X509 CERTIFICATE" 111 #define PEM_STRING_X509 "CERTIFICATE" 112 #define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" 113 #define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" 114 #define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" 115 #define PEM_STRING_X509_CRL "X509 CRL" 116 #define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" 117 #define PEM_STRING_PUBLIC "PUBLIC KEY" 118 #define PEM_STRING_RSA "RSA PRIVATE KEY" 119 #define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" 120 #define PEM_STRING_DSA "DSA PRIVATE KEY" 121 #define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" 122 #define PEM_STRING_PKCS7 "PKCS7" 123 #define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" 124 #define PEM_STRING_PKCS8INF "PRIVATE KEY" 125 #define PEM_STRING_DHPARAMS "DH PARAMETERS" 126 #define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" 127 #define PEM_STRING_DSAPARAMS "DSA PARAMETERS" 128 129 130 typedef struct PEM_Encode_Seal_st 131 { 132 EVP_ENCODE_CTX encode; 133 EVP_MD_CTX md; 134 EVP_CIPHER_CTX cipher; 135 } PEM_ENCODE_SEAL_CTX; 136 137 /* enc_type is one off */ 138 #define PEM_TYPE_ENCRYPTED 10 139 #define PEM_TYPE_MIC_ONLY 20 140 #define PEM_TYPE_MIC_CLEAR 30 141 #define PEM_TYPE_CLEAR 40 142 143 typedef struct pem_recip_st 144 { 145 char *name; 146 X509_NAME *dn; 147 148 int cipher; 149 int key_enc; 150 char iv[8]; 151 } PEM_USER; 152 153 typedef struct pem_ctx_st 154 { 155 int type; /* what type of object */ 156 157 struct { 158 int version; 159 int mode; 160 } proc_type; 161 162 char *domain; 163 164 struct { 165 int cipher; 166 unsigned char iv[8]; 167 } DEK_info; 168 169 PEM_USER *originator; 170 171 int num_recipient; 172 PEM_USER **recipient; 173 174 #ifndef NO_STACK 175 STACK *x509_chain; /* certificate chain */ 176 #else 177 char *x509_chain; /* certificate chain */ 178 #endif 179 EVP_MD *md; /* signature type */ 180 181 int md_enc; /* is the md encrypted or not? */ 182 int md_len; /* length of md_data */ 183 char *md_data; /* message digest, could be pkey encrypted */ 184 185 EVP_CIPHER *dec; /* date encryption cipher */ 186 int key_len; /* key length */ 187 unsigned char *key; /* key */ 188 unsigned char iv[8]; /* the iv */ 189 190 191 int data_enc; /* is the data encrypted */ 192 int data_len; 193 unsigned char *data; 194 } PEM_CTX; 195 196 /* These macros make the PEM_read/PEM_write functions easier to maintain and 197 * write. Now they are all implemented with either: 198 * IMPLEMENT_PEM_rw(...) or IMPLEMENT_PEM_rw_cb(...) 199 */ 200 201 #ifdef NO_FP_API 202 203 #define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ 204 #define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ 205 #define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ 206 207 #else 208 209 #define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ 210 type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ 211 { \ 212 return((type *)PEM_ASN1_read((char *(*)())d2i_##asn1, str,fp,(char **)x,\ 213 cb,u)); \ 214 } \ 215 216 #define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ 217 int PEM_write_##name(FILE *fp, type *x) \ 218 { \ 219 return(PEM_ASN1_write((int (*)())i2d_##asn1,str,fp, (char *)x, \ 220 NULL,NULL,0,NULL,NULL)); \ 221 } 222 223 #define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ 224 int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ 225 unsigned char *kstr, int klen, pem_password_cb *cb, \ 226 void *u) \ 227 { \ 228 return(PEM_ASN1_write((int (*)())i2d_##asn1,str,fp, \ 229 (char *)x,enc,kstr,klen,cb,u)); \ 230 } 231 232 #endif 233 234 #define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ 235 type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ 236 { \ 237 return((type *)PEM_ASN1_read_bio((char *(*)())d2i_##asn1, str,bp,\ 238 (char **)x,cb,u)); \ 239 } 240 241 #define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ 242 int PEM_write_bio_##name(BIO *bp, type *x) \ 243 { \ 244 return(PEM_ASN1_write_bio((int (*)())i2d_##asn1,str,bp, (char *)x, \ 245 NULL,NULL,0,NULL,NULL)); \ 246 } 247 248 #define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ 249 int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ 250 unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ 251 { \ 252 return(PEM_ASN1_write_bio((int (*)())i2d_##asn1,str,bp, \ 253 (char *)x,enc,kstr,klen,cb,u)); \ 254 } 255 256 #define IMPLEMENT_PEM_write(name, type, str, asn1) \ 257 IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ 258 IMPLEMENT_PEM_write_fp(name, type, str, asn1) 259 260 #define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ 261 IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ 262 IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) 263 264 #define IMPLEMENT_PEM_read(name, type, str, asn1) \ 265 IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ 266 IMPLEMENT_PEM_read_fp(name, type, str, asn1) 267 268 #define IMPLEMENT_PEM_rw(name, type, str, asn1) \ 269 IMPLEMENT_PEM_read(name, type, str, asn1) \ 270 IMPLEMENT_PEM_write(name, type, str, asn1) 271 272 #define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ 273 IMPLEMENT_PEM_read(name, type, str, asn1) \ 274 IMPLEMENT_PEM_write_cb(name, type, str, asn1) 275 276 /* These are the same except they are for the declarations */ 277 278 #if defined(WIN16) || defined(NO_FP_API) 279 280 #define DECLARE_PEM_read_fp(name, type) /**/ 281 #define DECLARE_PEM_write_fp(name, type) /**/ 282 #define DECLARE_PEM_write_cb_fp(name, type) /**/ 283 284 #else 285 286 #define DECLARE_PEM_read_fp(name, type) \ 287 type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u); 288 289 #define DECLARE_PEM_write_fp(name, type) \ 290 int PEM_write_##name(FILE *fp, type *x); 291 292 #define DECLARE_PEM_write_cb_fp(name, type) \ 293 int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \ 294 unsigned char *kstr, int klen, pem_password_cb *cb, void *u); 295 296 #endif 297 298 #ifndef NO_BIO 299 #define DECLARE_PEM_read_bio(name, type) \ 300 type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u); 301 302 #define DECLARE_PEM_write_bio(name, type) \ 303 int PEM_write_bio_##name(BIO *bp, type *x); 304 305 #define DECLARE_PEM_write_cb_bio(name, type) \ 306 int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ 307 unsigned char *kstr, int klen, pem_password_cb *cb, void *u); 308 309 #else 310 311 #define DECLARE_PEM_read_bio(name, type) /**/ 312 #define DECLARE_PEM_write_bio(name, type) /**/ 313 #define DECLARE_PEM_write_cb_bio(name, type) /**/ 314 315 #endif 316 317 #define DECLARE_PEM_write(name, type) \ 318 DECLARE_PEM_write_bio(name, type) \ 319 DECLARE_PEM_write_fp(name, type) 320 321 #define DECLARE_PEM_write_cb(name, type) \ 322 DECLARE_PEM_write_cb_bio(name, type) \ 323 DECLARE_PEM_write_cb_fp(name, type) 324 325 #define DECLARE_PEM_read(name, type) \ 326 DECLARE_PEM_read_bio(name, type) \ 327 DECLARE_PEM_read_fp(name, type) 328 329 #define DECLARE_PEM_rw(name, type) \ 330 DECLARE_PEM_read(name, type) \ 331 DECLARE_PEM_write(name, type) 332 333 #define DECLARE_PEM_rw_cb(name, type) \ 334 DECLARE_PEM_read(name, type) \ 335 DECLARE_PEM_write_cb(name, type) 336 337 #ifdef SSLEAY_MACROS 338 339 #define PEM_write_SSL_SESSION(fp,x) \ 340 PEM_ASN1_write((int (*)())i2d_SSL_SESSION, \ 341 PEM_STRING_SSL_SESSION,fp, (char *)x, NULL,NULL,0,NULL,NULL) 342 #define PEM_write_X509(fp,x) \ 343 PEM_ASN1_write((int (*)())i2d_X509,PEM_STRING_X509,fp, \ 344 (char *)x, NULL,NULL,0,NULL,NULL) 345 #define PEM_write_X509_REQ(fp,x) PEM_ASN1_write( \ 346 (int (*)())i2d_X509_REQ,PEM_STRING_X509_REQ,fp,(char *)x, \ 347 NULL,NULL,0,NULL,NULL) 348 #define PEM_write_X509_CRL(fp,x) \ 349 PEM_ASN1_write((int (*)())i2d_X509_CRL,PEM_STRING_X509_CRL, \ 350 fp,(char *)x, NULL,NULL,0,NULL,NULL) 351 #define PEM_write_RSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \ 352 PEM_ASN1_write((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,fp,\ 353 (char *)x,enc,kstr,klen,cb,u) 354 #define PEM_write_RSAPublicKey(fp,x) \ 355 PEM_ASN1_write((int (*)())i2d_RSAPublicKey,\ 356 PEM_STRING_RSA_PUBLIC,fp,(char *)x,NULL,NULL,0,NULL,NULL) 357 #define PEM_write_DSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \ 358 PEM_ASN1_write((int (*)())i2d_DSAPrivateKey,PEM_STRING_DSA,fp,\ 359 (char *)x,enc,kstr,klen,cb,u) 360 #define PEM_write_PrivateKey(bp,x,enc,kstr,klen,cb,u) \ 361 PEM_ASN1_write((int (*)())i2d_PrivateKey,\ 362 (((x)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA),\ 363 bp,(char *)x,enc,kstr,klen,cb,u) 364 #define PEM_write_PKCS7(fp,x) \ 365 PEM_ASN1_write((int (*)())i2d_PKCS7,PEM_STRING_PKCS7,fp, \ 366 (char *)x, NULL,NULL,0,NULL,NULL) 367 #define PEM_write_DHparams(fp,x) \ 368 PEM_ASN1_write((int (*)())i2d_DHparams,PEM_STRING_DHPARAMS,fp,\ 369 (char *)x,NULL,NULL,0,NULL,NULL) 370 371 #define PEM_write_NETSCAPE_CERT_SEQUENCE(fp,x) \ 372 PEM_ASN1_write((int (*)())i2d_NETSCAPE_CERT_SEQUENCE, \ 373 PEM_STRING_X509,fp, \ 374 (char *)x, NULL,NULL,0,NULL,NULL) 375 376 #define PEM_read_SSL_SESSION(fp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read( \ 377 (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,fp,(char **)x,cb,u) 378 #define PEM_read_X509(fp,x,cb,u) (X509 *)PEM_ASN1_read( \ 379 (char *(*)())d2i_X509,PEM_STRING_X509,fp,(char **)x,cb,u) 380 #define PEM_read_X509_REQ(fp,x,cb,u) (X509_REQ *)PEM_ASN1_read( \ 381 (char *(*)())d2i_X509_REQ,PEM_STRING_X509_REQ,fp,(char **)x,cb,u) 382 #define PEM_read_X509_CRL(fp,x,cb,u) (X509_CRL *)PEM_ASN1_read( \ 383 (char *(*)())d2i_X509_CRL,PEM_STRING_X509_CRL,fp,(char **)x,cb,u) 384 #define PEM_read_RSAPrivateKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \ 385 (char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,fp,(char **)x,cb,u) 386 #define PEM_read_RSAPublicKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \ 387 (char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,fp,(char **)x,cb,u) 388 #define PEM_read_DSAPrivateKey(fp,x,cb,u) (DSA *)PEM_ASN1_read( \ 389 (char *(*)())d2i_DSAPrivateKey,PEM_STRING_DSA,fp,(char **)x,cb,u) 390 #define PEM_read_PrivateKey(fp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read( \ 391 (char *(*)())d2i_PrivateKey,PEM_STRING_EVP_PKEY,fp,(char **)x,cb,u) 392 #define PEM_read_PKCS7(fp,x,cb,u) (PKCS7 *)PEM_ASN1_read( \ 393 (char *(*)())d2i_PKCS7,PEM_STRING_PKCS7,fp,(char **)x,cb,u) 394 #define PEM_read_DHparams(fp,x,cb,u) (DH *)PEM_ASN1_read( \ 395 (char *(*)())d2i_DHparams,PEM_STRING_DHPARAMS,fp,(char **)x,cb,u) 396 397 #define PEM_read_NETSCAPE_CERT_SEQUENCE(fp,x,cb,u) \ 398 (NETSCAPE_CERT_SEQUENCE *)PEM_ASN1_read( \ 399 (char *(*)())d2i_NETSCAPE_CERT_SEQUENCE,PEM_STRING_X509,fp,\ 400 (char **)x,cb,u) 401 402 #define PEM_write_bio_SSL_SESSION(bp,x) \ 403 PEM_ASN1_write_bio((int (*)())i2d_SSL_SESSION, \ 404 PEM_STRING_SSL_SESSION,bp, (char *)x, NULL,NULL,0,NULL,NULL) 405 #define PEM_write_bio_X509(bp,x) \ 406 PEM_ASN1_write_bio((int (*)())i2d_X509,PEM_STRING_X509,bp, \ 407 (char *)x, NULL,NULL,0,NULL,NULL) 408 #define PEM_write_bio_X509_REQ(bp,x) PEM_ASN1_write_bio( \ 409 (int (*)())i2d_X509_REQ,PEM_STRING_X509_REQ,bp,(char *)x, \ 410 NULL,NULL,0,NULL,NULL) 411 #define PEM_write_bio_X509_CRL(bp,x) \ 412 PEM_ASN1_write_bio((int (*)())i2d_X509_CRL,PEM_STRING_X509_CRL,\ 413 bp,(char *)x, NULL,NULL,0,NULL,NULL) 414 #define PEM_write_bio_RSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \ 415 PEM_ASN1_write_bio((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,\ 416 bp,(char *)x,enc,kstr,klen,cb,u) 417 #define PEM_write_bio_RSAPublicKey(bp,x) \ 418 PEM_ASN1_write_bio((int (*)())i2d_RSAPublicKey, \ 419 PEM_STRING_RSA_PUBLIC,\ 420 bp,(char *)x,NULL,NULL,0,NULL,NULL) 421 #define PEM_write_bio_DSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \ 422 PEM_ASN1_write_bio((int (*)())i2d_DSAPrivateKey,PEM_STRING_DSA,\ 423 bp,(char *)x,enc,kstr,klen,cb,u) 424 #define PEM_write_bio_PrivateKey(bp,x,enc,kstr,klen,cb,u) \ 425 PEM_ASN1_write_bio((int (*)())i2d_PrivateKey,\ 426 (((x)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA),\ 427 bp,(char *)x,enc,kstr,klen,cb,u) 428 #define PEM_write_bio_PKCS7(bp,x) \ 429 PEM_ASN1_write_bio((int (*)())i2d_PKCS7,PEM_STRING_PKCS7,bp, \ 430 (char *)x, NULL,NULL,0,NULL,NULL) 431 #define PEM_write_bio_DHparams(bp,x) \ 432 PEM_ASN1_write_bio((int (*)())i2d_DHparams,PEM_STRING_DHPARAMS,\ 433 bp,(char *)x,NULL,NULL,0,NULL,NULL) 434 #define PEM_write_bio_DSAparams(bp,x) \ 435 PEM_ASN1_write_bio((int (*)())i2d_DSAparams, \ 436 PEM_STRING_DSAPARAMS,bp,(char *)x,NULL,NULL,0,NULL,NULL) 437 438 #define PEM_write_bio_NETSCAPE_CERT_SEQUENCE(bp,x) \ 439 PEM_ASN1_write_bio((int (*)())i2d_NETSCAPE_CERT_SEQUENCE, \ 440 PEM_STRING_X509,bp, \ 441 (char *)x, NULL,NULL,0,NULL,NULL) 442 443 #define PEM_read_bio_SSL_SESSION(bp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read_bio( \ 444 (char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,bp,(char **)x,cb,u) 445 #define PEM_read_bio_X509(bp,x,cb,u) (X509 *)PEM_ASN1_read_bio( \ 446 (char *(*)())d2i_X509,PEM_STRING_X509,bp,(char **)x,cb,u) 447 #define PEM_read_bio_X509_REQ(bp,x,cb,u) (X509_REQ *)PEM_ASN1_read_bio( \ 448 (char *(*)())d2i_X509_REQ,PEM_STRING_X509_REQ,bp,(char **)x,cb,u) 449 #define PEM_read_bio_X509_CRL(bp,x,cb,u) (X509_CRL *)PEM_ASN1_read_bio( \ 450 (char *(*)())d2i_X509_CRL,PEM_STRING_X509_CRL,bp,(char **)x,cb,u) 451 #define PEM_read_bio_RSAPrivateKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \ 452 (char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,bp,(char **)x,cb,u) 453 #define PEM_read_bio_RSAPublicKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \ 454 (char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,bp,(char **)x,cb,u) 455 #define PEM_read_bio_DSAPrivateKey(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \ 456 (char *(*)())d2i_DSAPrivateKey,PEM_STRING_DSA,bp,(char **)x,cb,u) 457 #define PEM_read_bio_PrivateKey(bp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read_bio( \ 458 (char *(*)())d2i_PrivateKey,PEM_STRING_EVP_PKEY,bp,(char **)x,cb,u) 459 460 #define PEM_read_bio_PKCS7(bp,x,cb,u) (PKCS7 *)PEM_ASN1_read_bio( \ 461 (char *(*)())d2i_PKCS7,PEM_STRING_PKCS7,bp,(char **)x,cb,u) 462 #define PEM_read_bio_DHparams(bp,x,cb,u) (DH *)PEM_ASN1_read_bio( \ 463 (char *(*)())d2i_DHparams,PEM_STRING_DHPARAMS,bp,(char **)x,cb,u) 464 #define PEM_read_bio_DSAparams(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \ 465 (char *(*)())d2i_DSAparams,PEM_STRING_DSAPARAMS,bp,(char **)x,cb,u) 466 467 #define PEM_read_bio_NETSCAPE_CERT_SEQUENCE(bp,x,cb,u) \ 468 (NETSCAPE_CERT_SEQUENCE *)PEM_ASN1_read_bio( \ 469 (char *(*)())d2i_NETSCAPE_CERT_SEQUENCE,PEM_STRING_X509,bp,\ 470 (char **)x,cb,u) 471 472 #endif 473 474 #if 1 475 /* "userdata": new with OpenSSL 0.9.4 */ 476 typedef int pem_password_cb(char *buf, int size, int rwflag, void *userdata); 477 #else 478 /* OpenSSL 0.9.3, 0.9.3a */ 479 typedef int pem_password_cb(char *buf, int size, int rwflag); 480 #endif 481 482 int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); 483 int PEM_do_header (EVP_CIPHER_INFO *cipher, unsigned char *data,long *len, 484 pem_password_cb *callback,void *u); 485 486 #ifndef NO_BIO 487 int PEM_read_bio(BIO *bp, char **name, char **header, 488 unsigned char **data,long *len); 489 int PEM_write_bio(BIO *bp,const char *name,char *hdr,unsigned char *data, 490 long len); 491 char * PEM_ASN1_read_bio(char *(*d2i)(),const char *name,BIO *bp,char **x, 492 pem_password_cb *cb, void *u); 493 int PEM_ASN1_write_bio(int (*i2d)(),const char *name,BIO *bp,char *x, 494 const EVP_CIPHER *enc,unsigned char *kstr,int klen, 495 pem_password_cb *cb, void *u); 496 STACK_OF(X509_INFO) * PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u); 497 int PEM_X509_INFO_write_bio(BIO *bp,X509_INFO *xi, EVP_CIPHER *enc, 498 unsigned char *kstr, int klen, pem_password_cb *cd, void *u); 499 #endif 500 501 #ifndef WIN16 502 int PEM_read(FILE *fp, char **name, char **header, 503 unsigned char **data,long *len); 504 int PEM_write(FILE *fp,char *name,char *hdr,unsigned char *data,long len); 505 char * PEM_ASN1_read(char *(*d2i)(),const char *name,FILE *fp,char **x, 506 pem_password_cb *cb, void *u); 507 int PEM_ASN1_write(int (*i2d)(),const char *name,FILE *fp,char *x, 508 const EVP_CIPHER *enc,unsigned char *kstr,int klen, 509 pem_password_cb *callback, void *u); 510 STACK_OF(X509_INFO) * PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, 511 pem_password_cb *cb, void *u); 512 #endif 513 514 int PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type, 515 EVP_MD *md_type, unsigned char **ek, int *ekl, 516 unsigned char *iv, EVP_PKEY **pubk, int npubk); 517 void PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl, 518 unsigned char *in, int inl); 519 int PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig,int *sigl, 520 unsigned char *out, int *outl, EVP_PKEY *priv); 521 522 void PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); 523 void PEM_SignUpdate(EVP_MD_CTX *ctx,unsigned char *d,unsigned int cnt); 524 int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, 525 unsigned int *siglen, EVP_PKEY *pkey); 526 527 void ERR_load_PEM_strings(void); 528 529 void PEM_proc_type(char *buf, int type); 530 void PEM_dek_info(char *buf, const char *type, int len, char *str); 531 532 #ifndef SSLEAY_MACROS 533 534 #include <openssl/symhacks.h> 535 536 DECLARE_PEM_rw(X509, X509) 537 538 DECLARE_PEM_rw(X509_AUX, X509) 539 540 DECLARE_PEM_rw(X509_REQ, X509_REQ) 541 DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) 542 543 DECLARE_PEM_rw(X509_CRL, X509_CRL) 544 545 DECLARE_PEM_rw(PKCS7, PKCS7) 546 547 DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) 548 549 DECLARE_PEM_rw(PKCS8, X509_SIG) 550 551 DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) 552 553 #ifndef NO_RSA 554 555 DECLARE_PEM_rw_cb(RSAPrivateKey, RSA) 556 557 DECLARE_PEM_rw(RSAPublicKey, RSA) 558 DECLARE_PEM_rw(RSA_PUBKEY, RSA) 559 560 #endif 561 562 #ifndef NO_DSA 563 564 DECLARE_PEM_rw_cb(DSAPrivateKey, DSA) 565 566 DECLARE_PEM_rw(DSA_PUBKEY, DSA) 567 568 DECLARE_PEM_rw(DSAparams, DSA) 569 570 #endif 571 572 #ifndef NO_DH 573 574 DECLARE_PEM_rw(DHparams, DH) 575 576 #endif 577 578 DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) 579 580 DECLARE_PEM_rw(PUBKEY, EVP_PKEY) 581 582 int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, 583 char *kstr, int klen, 584 pem_password_cb *cb, void *u); 585 int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, 586 char *, int, pem_password_cb *, void *); 587 int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, 588 char *kstr, int klen, 589 pem_password_cb *cb, void *u); 590 int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, 591 char *kstr, int klen, 592 pem_password_cb *cb, void *u); 593 EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u); 594 595 int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, 596 char *kstr, int klen, 597 pem_password_cb *cb, void *u); 598 int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, 599 char *kstr, int klen, 600 pem_password_cb *cb, void *u); 601 int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, 602 char *kstr, int klen, 603 pem_password_cb *cb, void *u); 604 605 EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u); 606 607 int PEM_write_PKCS8PrivateKey(FILE *fp,EVP_PKEY *x,const EVP_CIPHER *enc, 608 char *kstr,int klen, pem_password_cb *cd, void *u); 609 610 #endif /* SSLEAY_MACROS */ 611 612 613 /* BEGIN ERROR CODES */ 614 /* The following lines are auto generated by the script mkerr.pl. Any changes 615 * made after this point may be overwritten when the script is next run. 616 */ 617 618 /* Error codes for the PEM functions. */ 619 620 /* Function codes. */ 621 #define PEM_F_D2I_PKCS8PRIVATEKEY_BIO 120 622 #define PEM_F_D2I_PKCS8PRIVATEKEY_FP 121 623 #define PEM_F_DEF_CALLBACK 100 624 #define PEM_F_LOAD_IV 101 625 #define PEM_F_PEM_ASN1_READ 102 626 #define PEM_F_PEM_ASN1_READ_BIO 103 627 #define PEM_F_PEM_ASN1_WRITE 104 628 #define PEM_F_PEM_ASN1_WRITE_BIO 105 629 #define PEM_F_PEM_DO_HEADER 106 630 #define PEM_F_PEM_F_DO_PK8KEY_FP 122 631 #define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY 118 632 #define PEM_F_PEM_GET_EVP_CIPHER_INFO 107 633 #define PEM_F_PEM_READ 108 634 #define PEM_F_PEM_READ_BIO 109 635 #define PEM_F_PEM_SEALFINAL 110 636 #define PEM_F_PEM_SEALINIT 111 637 #define PEM_F_PEM_SIGNFINAL 112 638 #define PEM_F_PEM_WRITE 113 639 #define PEM_F_PEM_WRITE_BIO 114 640 #define PEM_F_PEM_WRITE_BIO_PKCS8PRIVATEKEY 119 641 #define PEM_F_PEM_X509_INFO_READ 115 642 #define PEM_F_PEM_X509_INFO_READ_BIO 116 643 #define PEM_F_PEM_X509_INFO_WRITE_BIO 117 644 645 /* Reason codes. */ 646 #define PEM_R_BAD_BASE64_DECODE 100 647 #define PEM_R_BAD_DECRYPT 101 648 #define PEM_R_BAD_END_LINE 102 649 #define PEM_R_BAD_IV_CHARS 103 650 #define PEM_R_BAD_PASSWORD_READ 104 651 #define PEM_R_ERROR_CONVERTING_PRIVATE_KEY 115 652 #define PEM_R_NOT_DEK_INFO 105 653 #define PEM_R_NOT_ENCRYPTED 106 654 #define PEM_R_NOT_PROC_TYPE 107 655 #define PEM_R_NO_START_LINE 108 656 #define PEM_R_PROBLEMS_GETTING_PASSWORD 109 657 #define PEM_R_PUBLIC_KEY_NO_RSA 110 658 #define PEM_R_READ_KEY 111 659 #define PEM_R_SHORT_HEADER 112 660 #define PEM_R_UNSUPPORTED_CIPHER 113 661 #define PEM_R_UNSUPPORTED_ENCRYPTION 114 662 663 #ifdef __cplusplus 664 } 665 #endif 666 #endif 667 668