1e71b7053SJung-uk Kim /* 2*b077aed3SPierre Pronchery * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. 3e71b7053SJung-uk Kim * 4*b077aed3SPierre Pronchery * Licensed under the Apache License 2.0 (the "License"). You may not use 5e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy 6e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at 7e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html 8e71b7053SJung-uk Kim */ 9e71b7053SJung-uk Kim 10*b077aed3SPierre Pronchery #ifndef OPENSSL_PEM_H 11*b077aed3SPierre Pronchery # define OPENSSL_PEM_H 12*b077aed3SPierre Pronchery # pragma once 13*b077aed3SPierre Pronchery 14*b077aed3SPierre Pronchery # include <openssl/macros.h> 15*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 16e71b7053SJung-uk Kim # define HEADER_PEM_H 17*b077aed3SPierre Pronchery # endif 18e71b7053SJung-uk Kim 19e71b7053SJung-uk Kim # include <openssl/e_os2.h> 20e71b7053SJung-uk Kim # include <openssl/bio.h> 21e71b7053SJung-uk Kim # include <openssl/safestack.h> 22e71b7053SJung-uk Kim # include <openssl/evp.h> 23e71b7053SJung-uk Kim # include <openssl/x509.h> 24e71b7053SJung-uk Kim # include <openssl/pemerr.h> 25e71b7053SJung-uk Kim 26e71b7053SJung-uk Kim #ifdef __cplusplus 27e71b7053SJung-uk Kim extern "C" { 28e71b7053SJung-uk Kim #endif 29e71b7053SJung-uk Kim 30e71b7053SJung-uk Kim # define PEM_BUFSIZE 1024 31e71b7053SJung-uk Kim 32e71b7053SJung-uk Kim # define PEM_STRING_X509_OLD "X509 CERTIFICATE" 33e71b7053SJung-uk Kim # define PEM_STRING_X509 "CERTIFICATE" 34e71b7053SJung-uk Kim # define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" 35e71b7053SJung-uk Kim # define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" 36e71b7053SJung-uk Kim # define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" 37e71b7053SJung-uk Kim # define PEM_STRING_X509_CRL "X509 CRL" 38e71b7053SJung-uk Kim # define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" 39e71b7053SJung-uk Kim # define PEM_STRING_PUBLIC "PUBLIC KEY" 40e71b7053SJung-uk Kim # define PEM_STRING_RSA "RSA PRIVATE KEY" 41e71b7053SJung-uk Kim # define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" 42e71b7053SJung-uk Kim # define PEM_STRING_DSA "DSA PRIVATE KEY" 43e71b7053SJung-uk Kim # define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" 44e71b7053SJung-uk Kim # define PEM_STRING_PKCS7 "PKCS7" 45e71b7053SJung-uk Kim # define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" 46e71b7053SJung-uk Kim # define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" 47e71b7053SJung-uk Kim # define PEM_STRING_PKCS8INF "PRIVATE KEY" 48e71b7053SJung-uk Kim # define PEM_STRING_DHPARAMS "DH PARAMETERS" 49e71b7053SJung-uk Kim # define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS" 50e71b7053SJung-uk Kim # define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" 51e71b7053SJung-uk Kim # define PEM_STRING_DSAPARAMS "DSA PARAMETERS" 52e71b7053SJung-uk Kim # define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" 53e71b7053SJung-uk Kim # define PEM_STRING_ECPARAMETERS "EC PARAMETERS" 54e71b7053SJung-uk Kim # define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" 55e71b7053SJung-uk Kim # define PEM_STRING_PARAMETERS "PARAMETERS" 56e71b7053SJung-uk Kim # define PEM_STRING_CMS "CMS" 57e71b7053SJung-uk Kim 58e71b7053SJung-uk Kim # define PEM_TYPE_ENCRYPTED 10 59e71b7053SJung-uk Kim # define PEM_TYPE_MIC_ONLY 20 60e71b7053SJung-uk Kim # define PEM_TYPE_MIC_CLEAR 30 61e71b7053SJung-uk Kim # define PEM_TYPE_CLEAR 40 62e71b7053SJung-uk Kim 63e71b7053SJung-uk Kim /* 64e71b7053SJung-uk Kim * These macros make the PEM_read/PEM_write functions easier to maintain and 65e71b7053SJung-uk Kim * write. Now they are all implemented with either: IMPLEMENT_PEM_rw(...) or 66e71b7053SJung-uk Kim * IMPLEMENT_PEM_rw_cb(...) 67e71b7053SJung-uk Kim */ 68e71b7053SJung-uk Kim 69*b077aed3SPierre Pronchery # define PEM_read_cb_fnsig(name, type, INTYPE, readname) \ 70*b077aed3SPierre Pronchery type *PEM_##readname##_##name(INTYPE *out, type **x, \ 71*b077aed3SPierre Pronchery pem_password_cb *cb, void *u) 72*b077aed3SPierre Pronchery # define PEM_read_cb_ex_fnsig(name, type, INTYPE, readname) \ 73*b077aed3SPierre Pronchery type *PEM_##readname##_##name##_ex(INTYPE *out, type **x, \ 74*b077aed3SPierre Pronchery pem_password_cb *cb, void *u, \ 75*b077aed3SPierre Pronchery OSSL_LIB_CTX *libctx, \ 76*b077aed3SPierre Pronchery const char *propq) 77*b077aed3SPierre Pronchery 78*b077aed3SPierre Pronchery # define PEM_write_fnsig(name, type, OUTTYPE, writename) \ 79*b077aed3SPierre Pronchery int PEM_##writename##_##name(OUTTYPE *out, const type *x) 80*b077aed3SPierre Pronchery # define PEM_write_cb_fnsig(name, type, OUTTYPE, writename) \ 81*b077aed3SPierre Pronchery int PEM_##writename##_##name(OUTTYPE *out, const type *x, \ 82*b077aed3SPierre Pronchery const EVP_CIPHER *enc, \ 83*b077aed3SPierre Pronchery const unsigned char *kstr, int klen, \ 84*b077aed3SPierre Pronchery pem_password_cb *cb, void *u) 85*b077aed3SPierre Pronchery # define PEM_write_ex_fnsig(name, type, OUTTYPE, writename) \ 86*b077aed3SPierre Pronchery int PEM_##writename##_##name##_ex(OUTTYPE *out, const type *x, \ 87*b077aed3SPierre Pronchery OSSL_LIB_CTX *libctx, \ 88*b077aed3SPierre Pronchery const char *propq) 89*b077aed3SPierre Pronchery # define PEM_write_cb_ex_fnsig(name, type, OUTTYPE, writename) \ 90*b077aed3SPierre Pronchery int PEM_##writename##_##name##_ex(OUTTYPE *out, const type *x, \ 91*b077aed3SPierre Pronchery const EVP_CIPHER *enc, \ 92*b077aed3SPierre Pronchery const unsigned char *kstr, int klen, \ 93*b077aed3SPierre Pronchery pem_password_cb *cb, void *u, \ 94*b077aed3SPierre Pronchery OSSL_LIB_CTX *libctx, \ 95*b077aed3SPierre Pronchery const char *propq) 96*b077aed3SPierre Pronchery 97e71b7053SJung-uk Kim # ifdef OPENSSL_NO_STDIO 98e71b7053SJung-uk Kim 99e71b7053SJung-uk Kim # define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/ 100e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/ 101*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 102e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/ 103*b077aed3SPierre Pronchery # endif 104e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/ 105*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 106e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/ 107*b077aed3SPierre Pronchery # endif 108e71b7053SJung-uk Kim # else 109e71b7053SJung-uk Kim 110e71b7053SJung-uk Kim # define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ 111e71b7053SJung-uk Kim type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u) \ 112e71b7053SJung-uk Kim { \ 113*b077aed3SPierre Pronchery return PEM_ASN1_read((d2i_of_void *)d2i_##asn1, str, fp, \ 114*b077aed3SPierre Pronchery (void **)x, cb, u); \ 115e71b7053SJung-uk Kim } 116e71b7053SJung-uk Kim 117e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ 118*b077aed3SPierre Pronchery PEM_write_fnsig(name, type, FILE, write) \ 119e71b7053SJung-uk Kim { \ 120*b077aed3SPierre Pronchery return PEM_ASN1_write((i2d_of_void *)i2d_##asn1, str, out, \ 121*b077aed3SPierre Pronchery x, NULL, NULL, 0, NULL, NULL); \ 122e71b7053SJung-uk Kim } 123e71b7053SJung-uk Kim 124*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 125e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ 126*b077aed3SPierre Pronchery IMPLEMENT_PEM_write_fp(name, type, str, asn1) 127*b077aed3SPierre Pronchery # endif 128e71b7053SJung-uk Kim 129e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ 130*b077aed3SPierre Pronchery PEM_write_cb_fnsig(name, type, FILE, write) \ 131e71b7053SJung-uk Kim { \ 132*b077aed3SPierre Pronchery return PEM_ASN1_write((i2d_of_void *)i2d_##asn1, str, out, \ 133*b077aed3SPierre Pronchery x, enc, kstr, klen, cb, u); \ 134e71b7053SJung-uk Kim } 135e71b7053SJung-uk Kim 136*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 137e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ 138*b077aed3SPierre Pronchery IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) 139*b077aed3SPierre Pronchery # endif 140e71b7053SJung-uk Kim # endif 141e71b7053SJung-uk Kim 142e71b7053SJung-uk Kim # define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ 143*b077aed3SPierre Pronchery type *PEM_read_bio_##name(BIO *bp, type **x, \ 144*b077aed3SPierre Pronchery pem_password_cb *cb, void *u) \ 145e71b7053SJung-uk Kim { \ 146*b077aed3SPierre Pronchery return PEM_ASN1_read_bio((d2i_of_void *)d2i_##asn1, str, bp, \ 147*b077aed3SPierre Pronchery (void **)x, cb, u); \ 148e71b7053SJung-uk Kim } 149e71b7053SJung-uk Kim 150e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ 151*b077aed3SPierre Pronchery PEM_write_fnsig(name, type, BIO, write_bio) \ 152e71b7053SJung-uk Kim { \ 153*b077aed3SPierre Pronchery return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1, str, out, \ 154*b077aed3SPierre Pronchery x, NULL,NULL,0,NULL,NULL); \ 155e71b7053SJung-uk Kim } 156e71b7053SJung-uk Kim 157*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 158e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ 159*b077aed3SPierre Pronchery IMPLEMENT_PEM_write_bio(name, type, str, asn1) 160*b077aed3SPierre Pronchery # endif 161e71b7053SJung-uk Kim 162e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ 163*b077aed3SPierre Pronchery PEM_write_cb_fnsig(name, type, BIO, write_bio) \ 164e71b7053SJung-uk Kim { \ 165*b077aed3SPierre Pronchery return PEM_ASN1_write_bio((i2d_of_void *)i2d_##asn1, str, out, \ 166*b077aed3SPierre Pronchery x, enc, kstr, klen, cb, u); \ 167e71b7053SJung-uk Kim } 168e71b7053SJung-uk Kim 169*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 170e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ 171*b077aed3SPierre Pronchery IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) 172*b077aed3SPierre Pronchery # endif 173e71b7053SJung-uk Kim 174e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write(name, type, str, asn1) \ 175e71b7053SJung-uk Kim IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ 176e71b7053SJung-uk Kim IMPLEMENT_PEM_write_fp(name, type, str, asn1) 177e71b7053SJung-uk Kim 178*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 179e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_const(name, type, str, asn1) \ 180e71b7053SJung-uk Kim IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ 181e71b7053SJung-uk Kim IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) 182*b077aed3SPierre Pronchery # endif 183e71b7053SJung-uk Kim 184e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \ 185e71b7053SJung-uk Kim IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ 186e71b7053SJung-uk Kim IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) 187e71b7053SJung-uk Kim 188*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 189e71b7053SJung-uk Kim # define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \ 190e71b7053SJung-uk Kim IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ 191e71b7053SJung-uk Kim IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) 192*b077aed3SPierre Pronchery # endif 193e71b7053SJung-uk Kim 194e71b7053SJung-uk Kim # define IMPLEMENT_PEM_read(name, type, str, asn1) \ 195e71b7053SJung-uk Kim IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ 196e71b7053SJung-uk Kim IMPLEMENT_PEM_read_fp(name, type, str, asn1) 197e71b7053SJung-uk Kim 198e71b7053SJung-uk Kim # define IMPLEMENT_PEM_rw(name, type, str, asn1) \ 199e71b7053SJung-uk Kim IMPLEMENT_PEM_read(name, type, str, asn1) \ 200e71b7053SJung-uk Kim IMPLEMENT_PEM_write(name, type, str, asn1) 201e71b7053SJung-uk Kim 202*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 203e71b7053SJung-uk Kim # define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \ 204e71b7053SJung-uk Kim IMPLEMENT_PEM_read(name, type, str, asn1) \ 205e71b7053SJung-uk Kim IMPLEMENT_PEM_write_const(name, type, str, asn1) 206*b077aed3SPierre Pronchery # endif 207e71b7053SJung-uk Kim 208e71b7053SJung-uk Kim # define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \ 209e71b7053SJung-uk Kim IMPLEMENT_PEM_read(name, type, str, asn1) \ 210e71b7053SJung-uk Kim IMPLEMENT_PEM_write_cb(name, type, str, asn1) 211e71b7053SJung-uk Kim 212e71b7053SJung-uk Kim /* These are the same except they are for the declarations */ 213e71b7053SJung-uk Kim 214*b077aed3SPierre Pronchery /* 215*b077aed3SPierre Pronchery * The mysterious 'extern' that's passed to some macros is innocuous, 216*b077aed3SPierre Pronchery * and is there to quiet pre-C99 compilers that may complain about empty 217*b077aed3SPierre Pronchery * arguments in macro calls. 218*b077aed3SPierre Pronchery */ 219e71b7053SJung-uk Kim # if defined(OPENSSL_NO_STDIO) 220e71b7053SJung-uk Kim 221*b077aed3SPierre Pronchery # define DECLARE_PEM_read_fp_attr(attr, name, type) /**/ 222*b077aed3SPierre Pronchery # define DECLARE_PEM_read_fp_ex_attr(attr, name, type) /**/ 223*b077aed3SPierre Pronchery # define DECLARE_PEM_write_fp_attr(attr, name, type) /**/ 224*b077aed3SPierre Pronchery # define DECLARE_PEM_write_fp_ex_attr(attr, name, type) /**/ 225*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 226*b077aed3SPierre Pronchery # define DECLARE_PEM_write_fp_const_attr(attr, name, type) /**/ 227*b077aed3SPierre Pronchery # endif 228*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_fp_attr(attr, name, type) /**/ 229*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_fp_ex_attr(attr, name, type) /**/ 230*b077aed3SPierre Pronchery 231e71b7053SJung-uk Kim # else 232e71b7053SJung-uk Kim 233*b077aed3SPierre Pronchery # define DECLARE_PEM_read_fp_attr(attr, name, type) \ 234*b077aed3SPierre Pronchery attr PEM_read_cb_fnsig(name, type, FILE, read); 235*b077aed3SPierre Pronchery # define DECLARE_PEM_read_fp_ex_attr(attr, name, type) \ 236*b077aed3SPierre Pronchery attr PEM_read_cb_fnsig(name, type, FILE, read); \ 237*b077aed3SPierre Pronchery attr PEM_read_cb_ex_fnsig(name, type, FILE, read); 238e71b7053SJung-uk Kim 239*b077aed3SPierre Pronchery # define DECLARE_PEM_write_fp_attr(attr, name, type) \ 240*b077aed3SPierre Pronchery attr PEM_write_fnsig(name, type, FILE, write); 241*b077aed3SPierre Pronchery # define DECLARE_PEM_write_fp_ex_attr(attr, name, type) \ 242*b077aed3SPierre Pronchery attr PEM_write_fnsig(name, type, FILE, write); \ 243*b077aed3SPierre Pronchery attr PEM_write_ex_fnsig(name, type, FILE, write); 244*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 245*b077aed3SPierre Pronchery # define DECLARE_PEM_write_fp_const_attr(attr, name, type) \ 246*b077aed3SPierre Pronchery attr PEM_write_fnsig(name, type, FILE, write); 247*b077aed3SPierre Pronchery # endif 248*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_fp_attr(attr, name, type) \ 249*b077aed3SPierre Pronchery attr PEM_write_cb_fnsig(name, type, FILE, write); 250*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_fp_ex_attr(attr, name, type) \ 251*b077aed3SPierre Pronchery attr PEM_write_cb_fnsig(name, type, FILE, write); \ 252*b077aed3SPierre Pronchery attr PEM_write_cb_ex_fnsig(name, type, FILE, write); 253e71b7053SJung-uk Kim 254e71b7053SJung-uk Kim # endif 255e71b7053SJung-uk Kim 256*b077aed3SPierre Pronchery # define DECLARE_PEM_read_fp(name, type) \ 257*b077aed3SPierre Pronchery DECLARE_PEM_read_fp_attr(extern, name, type) 258*b077aed3SPierre Pronchery # define DECLARE_PEM_write_fp(name, type) \ 259*b077aed3SPierre Pronchery DECLARE_PEM_write_fp_attr(extern, name, type) 260*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 261*b077aed3SPierre Pronchery # define DECLARE_PEM_write_fp_const(name, type) \ 262*b077aed3SPierre Pronchery DECLARE_PEM_write_fp_const_attr(extern, name, type) 263*b077aed3SPierre Pronchery # endif 264*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_fp(name, type) \ 265*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_fp_attr(extern, name, type) 266*b077aed3SPierre Pronchery 267*b077aed3SPierre Pronchery # define DECLARE_PEM_read_bio_attr(attr, name, type) \ 268*b077aed3SPierre Pronchery attr PEM_read_cb_fnsig(name, type, BIO, read_bio); 269*b077aed3SPierre Pronchery # define DECLARE_PEM_read_bio_ex_attr(attr, name, type) \ 270*b077aed3SPierre Pronchery attr PEM_read_cb_fnsig(name, type, BIO, read_bio); \ 271*b077aed3SPierre Pronchery attr PEM_read_cb_ex_fnsig(name, type, BIO, read_bio); 272e71b7053SJung-uk Kim # define DECLARE_PEM_read_bio(name, type) \ 273*b077aed3SPierre Pronchery DECLARE_PEM_read_bio_attr(extern, name, type) 274*b077aed3SPierre Pronchery # define DECLARE_PEM_read_bio_ex(name, type) \ 275*b077aed3SPierre Pronchery DECLARE_PEM_read_bio_ex_attr(extern, name, type) 276e71b7053SJung-uk Kim 277*b077aed3SPierre Pronchery # define DECLARE_PEM_write_bio_attr(attr, name, type) \ 278*b077aed3SPierre Pronchery attr PEM_write_fnsig(name, type, BIO, write_bio); 279*b077aed3SPierre Pronchery # define DECLARE_PEM_write_bio_ex_attr(attr, name, type) \ 280*b077aed3SPierre Pronchery attr PEM_write_fnsig(name, type, BIO, write_bio); \ 281*b077aed3SPierre Pronchery attr PEM_write_ex_fnsig(name, type, BIO, write_bio); 282e71b7053SJung-uk Kim # define DECLARE_PEM_write_bio(name, type) \ 283*b077aed3SPierre Pronchery DECLARE_PEM_write_bio_attr(extern, name, type) 284*b077aed3SPierre Pronchery # define DECLARE_PEM_write_bio_ex(name, type) \ 285*b077aed3SPierre Pronchery DECLARE_PEM_write_bio_ex_attr(extern, name, type) 286e71b7053SJung-uk Kim 287*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 288*b077aed3SPierre Pronchery # define DECLARE_PEM_write_bio_const_attr(attr, name, type) \ 289*b077aed3SPierre Pronchery attr PEM_write_fnsig(name, type, BIO, write_bio); 290e71b7053SJung-uk Kim # define DECLARE_PEM_write_bio_const(name, type) \ 291*b077aed3SPierre Pronchery DECLARE_PEM_write_bio_const_attr(extern, name, type) 292*b077aed3SPierre Pronchery # endif 293e71b7053SJung-uk Kim 294*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_bio_attr(attr, name, type) \ 295*b077aed3SPierre Pronchery attr PEM_write_cb_fnsig(name, type, BIO, write_bio); 296*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_bio_ex_attr(attr, name, type) \ 297*b077aed3SPierre Pronchery attr PEM_write_cb_fnsig(name, type, BIO, write_bio); \ 298*b077aed3SPierre Pronchery attr PEM_write_cb_ex_fnsig(name, type, BIO, write_bio); 299e71b7053SJung-uk Kim # define DECLARE_PEM_write_cb_bio(name, type) \ 300*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_bio_attr(extern, name, type) 301*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_ex_bio(name, type) \ 302*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_bio_ex_attr(extern, name, type) 303e71b7053SJung-uk Kim 304*b077aed3SPierre Pronchery # define DECLARE_PEM_write_attr(attr, name, type) \ 305*b077aed3SPierre Pronchery DECLARE_PEM_write_bio_attr(attr, name, type) \ 306*b077aed3SPierre Pronchery DECLARE_PEM_write_fp_attr(attr, name, type) 307*b077aed3SPierre Pronchery # define DECLARE_PEM_write_ex_attr(attr, name, type) \ 308*b077aed3SPierre Pronchery DECLARE_PEM_write_bio_ex_attr(attr, name, type) \ 309*b077aed3SPierre Pronchery DECLARE_PEM_write_fp_ex_attr(attr, name, type) 310e71b7053SJung-uk Kim # define DECLARE_PEM_write(name, type) \ 311*b077aed3SPierre Pronchery DECLARE_PEM_write_attr(extern, name, type) 312*b077aed3SPierre Pronchery # define DECLARE_PEM_write_ex(name, type) \ 313*b077aed3SPierre Pronchery DECLARE_PEM_write_ex_attr(extern, name, type) 314*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 315*b077aed3SPierre Pronchery # define DECLARE_PEM_write_const_attr(attr, name, type) \ 316*b077aed3SPierre Pronchery DECLARE_PEM_write_bio_const_attr(attr, name, type) \ 317*b077aed3SPierre Pronchery DECLARE_PEM_write_fp_const_attr(attr, name, type) 318e71b7053SJung-uk Kim # define DECLARE_PEM_write_const(name, type) \ 319*b077aed3SPierre Pronchery DECLARE_PEM_write_const_attr(extern, name, type) 320*b077aed3SPierre Pronchery # endif 321*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_attr(attr, name, type) \ 322*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_bio_attr(attr, name, type) \ 323*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_fp_attr(attr, name, type) 324*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_ex_attr(attr, name, type) \ 325*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_bio_ex_attr(attr, name, type) \ 326*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_fp_ex_attr(attr, name, type) 327e71b7053SJung-uk Kim # define DECLARE_PEM_write_cb(name, type) \ 328*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_attr(extern, name, type) 329*b077aed3SPierre Pronchery # define DECLARE_PEM_write_cb_ex(name, type) \ 330*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_ex_attr(extern, name, type) 331*b077aed3SPierre Pronchery # define DECLARE_PEM_read_attr(attr, name, type) \ 332*b077aed3SPierre Pronchery DECLARE_PEM_read_bio_attr(attr, name, type) \ 333*b077aed3SPierre Pronchery DECLARE_PEM_read_fp_attr(attr, name, type) 334*b077aed3SPierre Pronchery # define DECLARE_PEM_read_ex_attr(attr, name, type) \ 335*b077aed3SPierre Pronchery DECLARE_PEM_read_bio_ex_attr(attr, name, type) \ 336*b077aed3SPierre Pronchery DECLARE_PEM_read_fp_ex_attr(attr, name, type) 337e71b7053SJung-uk Kim # define DECLARE_PEM_read(name, type) \ 338*b077aed3SPierre Pronchery DECLARE_PEM_read_attr(extern, name, type) 339*b077aed3SPierre Pronchery # define DECLARE_PEM_read_ex(name, type) \ 340*b077aed3SPierre Pronchery DECLARE_PEM_read_ex_attr(extern, name, type) 341*b077aed3SPierre Pronchery # define DECLARE_PEM_rw_attr(attr, name, type) \ 342*b077aed3SPierre Pronchery DECLARE_PEM_read_attr(attr, name, type) \ 343*b077aed3SPierre Pronchery DECLARE_PEM_write_attr(attr, name, type) 344*b077aed3SPierre Pronchery # define DECLARE_PEM_rw_ex_attr(attr, name, type) \ 345*b077aed3SPierre Pronchery DECLARE_PEM_read_ex_attr(attr, name, type) \ 346*b077aed3SPierre Pronchery DECLARE_PEM_write_ex_attr(attr, name, type) 347e71b7053SJung-uk Kim # define DECLARE_PEM_rw(name, type) \ 348*b077aed3SPierre Pronchery DECLARE_PEM_rw_attr(extern, name, type) 349*b077aed3SPierre Pronchery # define DECLARE_PEM_rw_ex(name, type) \ 350*b077aed3SPierre Pronchery DECLARE_PEM_rw_ex_attr(extern, name, type) 351*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 352*b077aed3SPierre Pronchery # define DECLARE_PEM_rw_const_attr(attr, name, type) \ 353*b077aed3SPierre Pronchery DECLARE_PEM_read_attr(attr, name, type) \ 354*b077aed3SPierre Pronchery DECLARE_PEM_write_const_attr(attr, name, type) 355e71b7053SJung-uk Kim # define DECLARE_PEM_rw_const(name, type) \ 356*b077aed3SPierre Pronchery DECLARE_PEM_rw_const_attr(extern, name, type) 357*b077aed3SPierre Pronchery # endif 358*b077aed3SPierre Pronchery # define DECLARE_PEM_rw_cb_attr(attr, name, type) \ 359*b077aed3SPierre Pronchery DECLARE_PEM_read_attr(attr, name, type) \ 360*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_attr(attr, name, type) 361*b077aed3SPierre Pronchery # define DECLARE_PEM_rw_cb_ex_attr(attr, name, type) \ 362*b077aed3SPierre Pronchery DECLARE_PEM_read_ex_attr(attr, name, type) \ 363*b077aed3SPierre Pronchery DECLARE_PEM_write_cb_ex_attr(attr, name, type) 364e71b7053SJung-uk Kim # define DECLARE_PEM_rw_cb(name, type) \ 365*b077aed3SPierre Pronchery DECLARE_PEM_rw_cb_attr(extern, name, type) 366*b077aed3SPierre Pronchery # define DECLARE_PEM_rw_cb_ex(name, type) \ 367*b077aed3SPierre Pronchery DECLARE_PEM_rw_cb_ex_attr(extern, name, type) 368e71b7053SJung-uk Kim 369e71b7053SJung-uk Kim int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher); 370e71b7053SJung-uk Kim int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *len, 371e71b7053SJung-uk Kim pem_password_cb *callback, void *u); 372e71b7053SJung-uk Kim 373e71b7053SJung-uk Kim int PEM_read_bio(BIO *bp, char **name, char **header, 374e71b7053SJung-uk Kim unsigned char **data, long *len); 375e71b7053SJung-uk Kim # define PEM_FLAG_SECURE 0x1 376e71b7053SJung-uk Kim # define PEM_FLAG_EAY_COMPATIBLE 0x2 377e71b7053SJung-uk Kim # define PEM_FLAG_ONLY_B64 0x4 378e71b7053SJung-uk Kim int PEM_read_bio_ex(BIO *bp, char **name, char **header, 379e71b7053SJung-uk Kim unsigned char **data, long *len, unsigned int flags); 380e71b7053SJung-uk Kim int PEM_bytes_read_bio_secmem(unsigned char **pdata, long *plen, char **pnm, 381e71b7053SJung-uk Kim const char *name, BIO *bp, pem_password_cb *cb, 382e71b7053SJung-uk Kim void *u); 383e71b7053SJung-uk Kim int PEM_write_bio(BIO *bp, const char *name, const char *hdr, 384e71b7053SJung-uk Kim const unsigned char *data, long len); 385e71b7053SJung-uk Kim int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, 386e71b7053SJung-uk Kim const char *name, BIO *bp, pem_password_cb *cb, 387e71b7053SJung-uk Kim void *u); 388e71b7053SJung-uk Kim void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x, 389e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 390*b077aed3SPierre Pronchery int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, 391*b077aed3SPierre Pronchery const void *x, const EVP_CIPHER *enc, 392*b077aed3SPierre Pronchery const unsigned char *kstr, int klen, 393e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 394e71b7053SJung-uk Kim 395e71b7053SJung-uk Kim STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, 396e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 397*b077aed3SPierre Pronchery STACK_OF(X509_INFO) 398*b077aed3SPierre Pronchery *PEM_X509_INFO_read_bio_ex(BIO *bp, STACK_OF(X509_INFO) *sk, 399*b077aed3SPierre Pronchery pem_password_cb *cb, void *u, OSSL_LIB_CTX *libctx, 400*b077aed3SPierre Pronchery const char *propq); 401*b077aed3SPierre Pronchery 402*b077aed3SPierre Pronchery int PEM_X509_INFO_write_bio(BIO *bp, const X509_INFO *xi, EVP_CIPHER *enc, 403*b077aed3SPierre Pronchery const unsigned char *kstr, int klen, 404e71b7053SJung-uk Kim pem_password_cb *cd, void *u); 405e71b7053SJung-uk Kim 406e71b7053SJung-uk Kim #ifndef OPENSSL_NO_STDIO 407e71b7053SJung-uk Kim int PEM_read(FILE *fp, char **name, char **header, 408e71b7053SJung-uk Kim unsigned char **data, long *len); 409e71b7053SJung-uk Kim int PEM_write(FILE *fp, const char *name, const char *hdr, 410e71b7053SJung-uk Kim const unsigned char *data, long len); 411e71b7053SJung-uk Kim void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, 412e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 413e71b7053SJung-uk Kim int PEM_ASN1_write(i2d_of_void *i2d, const char *name, FILE *fp, 414*b077aed3SPierre Pronchery const void *x, const EVP_CIPHER *enc, 415*b077aed3SPierre Pronchery const unsigned char *kstr, int klen, 416*b077aed3SPierre Pronchery pem_password_cb *callback, void *u); 417e71b7053SJung-uk Kim STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk, 418e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 419*b077aed3SPierre Pronchery STACK_OF(X509_INFO) 420*b077aed3SPierre Pronchery *PEM_X509_INFO_read_ex(FILE *fp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, 421*b077aed3SPierre Pronchery void *u, OSSL_LIB_CTX *libctx, const char *propq); 422e71b7053SJung-uk Kim #endif 423e71b7053SJung-uk Kim 424e71b7053SJung-uk Kim int PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type); 425*b077aed3SPierre Pronchery int PEM_SignUpdate(EVP_MD_CTX *ctx, const unsigned char *d, unsigned int cnt); 426e71b7053SJung-uk Kim int PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, 427e71b7053SJung-uk Kim unsigned int *siglen, EVP_PKEY *pkey); 428e71b7053SJung-uk Kim 429e71b7053SJung-uk Kim /* The default pem_password_cb that's used internally */ 430e71b7053SJung-uk Kim int PEM_def_callback(char *buf, int num, int rwflag, void *userdata); 431e71b7053SJung-uk Kim void PEM_proc_type(char *buf, int type); 432*b077aed3SPierre Pronchery void PEM_dek_info(char *buf, const char *type, int len, const char *str); 433e71b7053SJung-uk Kim 434e71b7053SJung-uk Kim # include <openssl/symhacks.h> 435e71b7053SJung-uk Kim 436e71b7053SJung-uk Kim DECLARE_PEM_rw(X509, X509) 437e71b7053SJung-uk Kim DECLARE_PEM_rw(X509_AUX, X509) 438e71b7053SJung-uk Kim DECLARE_PEM_rw(X509_REQ, X509_REQ) 439e71b7053SJung-uk Kim DECLARE_PEM_write(X509_REQ_NEW, X509_REQ) 440e71b7053SJung-uk Kim DECLARE_PEM_rw(X509_CRL, X509_CRL) 441*b077aed3SPierre Pronchery DECLARE_PEM_rw(X509_PUBKEY, X509_PUBKEY) 442e71b7053SJung-uk Kim DECLARE_PEM_rw(PKCS7, PKCS7) 443e71b7053SJung-uk Kim DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE) 444e71b7053SJung-uk Kim DECLARE_PEM_rw(PKCS8, X509_SIG) 445e71b7053SJung-uk Kim DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO) 446*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 447*b077aed3SPierre Pronchery DECLARE_PEM_rw_cb_attr(OSSL_DEPRECATEDIN_3_0, RSAPrivateKey, RSA) 448*b077aed3SPierre Pronchery DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, RSAPublicKey, RSA) 449*b077aed3SPierre Pronchery DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, RSA_PUBKEY, RSA) 450e71b7053SJung-uk Kim # endif 451*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 452e71b7053SJung-uk Kim # ifndef OPENSSL_NO_DSA 453*b077aed3SPierre Pronchery DECLARE_PEM_rw_cb_attr(OSSL_DEPRECATEDIN_3_0, DSAPrivateKey, DSA) 454*b077aed3SPierre Pronchery DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, DSA_PUBKEY, DSA) 455*b077aed3SPierre Pronchery DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, DSAparams, DSA) 456e71b7053SJung-uk Kim # endif 457*b077aed3SPierre Pronchery # endif 458*b077aed3SPierre Pronchery 459*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 460e71b7053SJung-uk Kim # ifndef OPENSSL_NO_EC 461*b077aed3SPierre Pronchery DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, ECPKParameters, EC_GROUP) 462*b077aed3SPierre Pronchery DECLARE_PEM_rw_cb_attr(OSSL_DEPRECATEDIN_3_0, ECPrivateKey, EC_KEY) 463*b077aed3SPierre Pronchery DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, EC_PUBKEY, EC_KEY) 464e71b7053SJung-uk Kim # endif 465*b077aed3SPierre Pronchery # endif 466*b077aed3SPierre Pronchery 467e71b7053SJung-uk Kim # ifndef OPENSSL_NO_DH 468*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_DEPRECATED_3_0 469*b077aed3SPierre Pronchery DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, DHparams, DH) 470*b077aed3SPierre Pronchery DECLARE_PEM_write_attr(OSSL_DEPRECATEDIN_3_0, DHxparams, DH) 471e71b7053SJung-uk Kim # endif 472*b077aed3SPierre Pronchery # endif 473*b077aed3SPierre Pronchery DECLARE_PEM_rw_cb_ex(PrivateKey, EVP_PKEY) 474*b077aed3SPierre Pronchery DECLARE_PEM_rw_ex(PUBKEY, EVP_PKEY) 475e71b7053SJung-uk Kim 476*b077aed3SPierre Pronchery int PEM_write_bio_PrivateKey_traditional(BIO *bp, const EVP_PKEY *x, 477e71b7053SJung-uk Kim const EVP_CIPHER *enc, 478*b077aed3SPierre Pronchery const unsigned char *kstr, int klen, 479e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 480e71b7053SJung-uk Kim 481*b077aed3SPierre Pronchery /* Why do these take a signed char *kstr? */ 482*b077aed3SPierre Pronchery int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, const EVP_PKEY *x, int nid, 483*b077aed3SPierre Pronchery const char *kstr, int klen, 484e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 485*b077aed3SPierre Pronchery int PEM_write_bio_PKCS8PrivateKey(BIO *, const EVP_PKEY *, const EVP_CIPHER *, 486*b077aed3SPierre Pronchery const char *kstr, int klen, 487e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 488*b077aed3SPierre Pronchery int i2d_PKCS8PrivateKey_bio(BIO *bp, const EVP_PKEY *x, const EVP_CIPHER *enc, 489*b077aed3SPierre Pronchery const char *kstr, int klen, 490*b077aed3SPierre Pronchery pem_password_cb *cb, void *u); 491*b077aed3SPierre Pronchery int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, const EVP_PKEY *x, int nid, 492*b077aed3SPierre Pronchery const char *kstr, int klen, 493e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 494e71b7053SJung-uk Kim EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, 495e71b7053SJung-uk Kim void *u); 496e71b7053SJung-uk Kim 497e71b7053SJung-uk Kim # ifndef OPENSSL_NO_STDIO 498*b077aed3SPierre Pronchery int i2d_PKCS8PrivateKey_fp(FILE *fp, const EVP_PKEY *x, const EVP_CIPHER *enc, 499*b077aed3SPierre Pronchery const char *kstr, int klen, 500e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 501*b077aed3SPierre Pronchery int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, const EVP_PKEY *x, int nid, 502*b077aed3SPierre Pronchery const char *kstr, int klen, 503e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 504*b077aed3SPierre Pronchery int PEM_write_PKCS8PrivateKey_nid(FILE *fp, const EVP_PKEY *x, int nid, 505*b077aed3SPierre Pronchery const char *kstr, int klen, 506e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 507e71b7053SJung-uk Kim 508e71b7053SJung-uk Kim EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, 509e71b7053SJung-uk Kim void *u); 510e71b7053SJung-uk Kim 511*b077aed3SPierre Pronchery int PEM_write_PKCS8PrivateKey(FILE *fp, const EVP_PKEY *x, const EVP_CIPHER *enc, 512*b077aed3SPierre Pronchery const char *kstr, int klen, 513*b077aed3SPierre Pronchery pem_password_cb *cd, void *u); 514e71b7053SJung-uk Kim # endif 515*b077aed3SPierre Pronchery EVP_PKEY *PEM_read_bio_Parameters_ex(BIO *bp, EVP_PKEY **x, 516*b077aed3SPierre Pronchery OSSL_LIB_CTX *libctx, const char *propq); 517e71b7053SJung-uk Kim EVP_PKEY *PEM_read_bio_Parameters(BIO *bp, EVP_PKEY **x); 518*b077aed3SPierre Pronchery int PEM_write_bio_Parameters(BIO *bp, const EVP_PKEY *x); 519e71b7053SJung-uk Kim 520e71b7053SJung-uk Kim EVP_PKEY *b2i_PrivateKey(const unsigned char **in, long length); 521e71b7053SJung-uk Kim EVP_PKEY *b2i_PublicKey(const unsigned char **in, long length); 522e71b7053SJung-uk Kim EVP_PKEY *b2i_PrivateKey_bio(BIO *in); 523e71b7053SJung-uk Kim EVP_PKEY *b2i_PublicKey_bio(BIO *in); 524*b077aed3SPierre Pronchery int i2b_PrivateKey_bio(BIO *out, const EVP_PKEY *pk); 525*b077aed3SPierre Pronchery int i2b_PublicKey_bio(BIO *out, const EVP_PKEY *pk); 526e71b7053SJung-uk Kim EVP_PKEY *b2i_PVK_bio(BIO *in, pem_password_cb *cb, void *u); 527*b077aed3SPierre Pronchery EVP_PKEY *b2i_PVK_bio_ex(BIO *in, pem_password_cb *cb, void *u, 528*b077aed3SPierre Pronchery OSSL_LIB_CTX *libctx, const char *propq); 529*b077aed3SPierre Pronchery int i2b_PVK_bio(BIO *out, const EVP_PKEY *pk, int enclevel, 530e71b7053SJung-uk Kim pem_password_cb *cb, void *u); 531*b077aed3SPierre Pronchery int i2b_PVK_bio_ex(BIO *out, const EVP_PKEY *pk, int enclevel, 532*b077aed3SPierre Pronchery pem_password_cb *cb, void *u, 533*b077aed3SPierre Pronchery OSSL_LIB_CTX *libctx, const char *propq); 534e71b7053SJung-uk Kim 535e71b7053SJung-uk Kim # ifdef __cplusplus 536e71b7053SJung-uk Kim } 537e71b7053SJung-uk Kim # endif 538e71b7053SJung-uk Kim #endif 539