00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #ifndef HEADER_PKCS12_H
00060 #define HEADER_PKCS12_H
00061
00062 #include <openssl/bio.h>
00063 #include <openssl/x509.h>
00064
00065 #ifdef __cplusplus
00066 extern "C" {
00067 #endif
00068
00069 #define PKCS12_KEY_ID 1
00070 #define PKCS12_IV_ID 2
00071 #define PKCS12_MAC_ID 3
00072
00073
00074 #ifndef PKCS12_DEFAULT_ITER
00075 #define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER
00076 #endif
00077
00078 #define PKCS12_MAC_KEY_LENGTH 20
00079
00080 #define PKCS12_SALT_LEN 8
00081
00082
00083
00084
00085
00086 #ifdef PBE_UNICODE
00087 #define PKCS12_key_gen PKCS12_key_gen_uni
00088 #define PKCS12_add_friendlyname PKCS12_add_friendlyname_uni
00089 #else
00090 #define PKCS12_key_gen PKCS12_key_gen_asc
00091 #define PKCS12_add_friendlyname PKCS12_add_friendlyname_asc
00092 #endif
00093
00094
00095
00096 #define KEY_EX 0x10
00097 #define KEY_SIG 0x80
00098
00099 typedef struct {
00100 X509_SIG *dinfo;
00101 ASN1_OCTET_STRING *salt;
00102 ASN1_INTEGER *iter;
00103 } PKCS12_MAC_DATA;
00104
00105 typedef struct {
00106 ASN1_INTEGER *version;
00107 PKCS12_MAC_DATA *mac;
00108 PKCS7 *authsafes;
00109 } PKCS12;
00110
00111 PREDECLARE_STACK_OF(PKCS12_SAFEBAG)
00112
00113 typedef struct {
00114 ASN1_OBJECT *type;
00115 union {
00116 struct pkcs12_bag_st *bag;
00117 struct pkcs8_priv_key_info_st *keybag;
00118 X509_SIG *shkeybag;
00119 STACK_OF(PKCS12_SAFEBAG) *safes;
00120 ASN1_TYPE *other;
00121 }value;
00122 STACK_OF(X509_ATTRIBUTE) *attrib;
00123 } PKCS12_SAFEBAG;
00124
00125 DECLARE_STACK_OF(PKCS12_SAFEBAG)
00126 DECLARE_ASN1_SET_OF(PKCS12_SAFEBAG)
00127 DECLARE_PKCS12_STACK_OF(PKCS12_SAFEBAG)
00128
00129 typedef struct pkcs12_bag_st {
00130 ASN1_OBJECT *type;
00131 union {
00132 ASN1_OCTET_STRING *x509cert;
00133 ASN1_OCTET_STRING *x509crl;
00134 ASN1_OCTET_STRING *octet;
00135 ASN1_IA5STRING *sdsicert;
00136 ASN1_TYPE *other;
00137 }value;
00138 } PKCS12_BAGS;
00139
00140 #define PKCS12_ERROR 0
00141 #define PKCS12_OK 1
00142
00143
00144
00145 #define M_PKCS12_x5092certbag PKCS12_x5092certbag
00146 #define M_PKCS12_x509crl2certbag PKCS12_x509crl2certbag
00147
00148 #define M_PKCS12_certbag2x509 PKCS12_certbag2x509
00149 #define M_PKCS12_certbag2x509crl PKCS12_certbag2x509crl
00150
00151 #define M_PKCS12_unpack_p7data PKCS12_unpack_p7data
00152 #define M_PKCS12_pack_authsafes PKCS12_pack_authsafes
00153 #define M_PKCS12_unpack_authsafes PKCS12_unpack_authsafes
00154 #define M_PKCS12_unpack_p7encdata PKCS12_unpack_p7encdata
00155
00156 #define M_PKCS12_decrypt_skey PKCS12_decrypt_skey
00157 #define M_PKCS8_decrypt PKCS8_decrypt
00158
00159 #define M_PKCS12_bag_type(bg) OBJ_obj2nid((bg)->type)
00160 #define M_PKCS12_cert_bag_type(bg) OBJ_obj2nid((bg)->value.bag->type)
00161 #define M_PKCS12_crl_bag_type M_PKCS12_cert_bag_type
00162
00163 #define PKCS12_get_attr(bag, attr_nid) \
00164 PKCS12_get_attr_gen(bag->attrib, attr_nid)
00165
00166 #define PKCS8_get_attr(p8, attr_nid) \
00167 PKCS12_get_attr_gen(p8->attributes, attr_nid)
00168
00169 #define PKCS12_mac_present(p12) ((p12)->mac ? 1 : 0)
00170
00171
00172 PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509);
00173 PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl);
00174 X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag);
00175 X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag);
00176
00177 PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, int nid1,
00178 int nid2);
00179 PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8);
00180 PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(X509_SIG *p8, const char *pass, int passlen);
00181 PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(PKCS12_SAFEBAG *bag, const char *pass,
00182 int passlen);
00183 X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher,
00184 const char *pass, int passlen,
00185 unsigned char *salt, int saltlen, int iter,
00186 PKCS8_PRIV_KEY_INFO *p8);
00187 PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass,
00188 int passlen, unsigned char *salt,
00189 int saltlen, int iter,
00190 PKCS8_PRIV_KEY_INFO *p8);
00191 PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk);
00192 STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7);
00193 PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen,
00194 unsigned char *salt, int saltlen, int iter,
00195 STACK_OF(PKCS12_SAFEBAG) *bags);
00196 STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, int passlen);
00197
00198 int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes);
00199 STACK_OF(PKCS7) *PKCS12_unpack_authsafes(PKCS12 *p12);
00200
00201 int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, int namelen);
00202 int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name,
00203 int namelen);
00204 int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name,
00205 int namelen);
00206 int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, const unsigned char *name,
00207 int namelen);
00208 int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage);
00209 ASN1_TYPE *PKCS12_get_attr_gen(STACK_OF(X509_ATTRIBUTE) *attrs, int attr_nid);
00210 char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag);
00211 unsigned char *PKCS12_pbe_crypt(X509_ALGOR *algor, const char *pass,
00212 int passlen, unsigned char *in, int inlen,
00213 unsigned char **data, int *datalen, int en_de);
00214 void * PKCS12_item_decrypt_d2i(X509_ALGOR *algor, const ASN1_ITEM *it,
00215 const char *pass, int passlen, ASN1_OCTET_STRING *oct, int zbuf);
00216 ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, const ASN1_ITEM *it,
00217 const char *pass, int passlen,
00218 void *obj, int zbuf);
00219 PKCS12 *PKCS12_init(int mode);
00220 int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt,
00221 int saltlen, int id, int iter, int n,
00222 unsigned char *out, const EVP_MD *md_type);
00223 int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, int saltlen, int id, int iter, int n, unsigned char *out, const EVP_MD *md_type);
00224 int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
00225 ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md_type,
00226 int en_de);
00227 int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen,
00228 unsigned char *mac, unsigned int *maclen);
00229 int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen);
00230 int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen,
00231 unsigned char *salt, int saltlen, int iter,
00232 const EVP_MD *md_type);
00233 int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt,
00234 int saltlen, const EVP_MD *md_type);
00235 unsigned char *asc2uni(const char *asc, int asclen, unsigned char **uni, int *unilen);
00236 char *uni2asc(unsigned char *uni, int unilen);
00237
00238 DECLARE_ASN1_FUNCTIONS(PKCS12)
00239 DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA)
00240 DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG)
00241 DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS)
00242
00243 DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS)
00244 DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES)
00245
00246 void PKCS12_PBE_add(void);
00247 int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert,
00248 STACK_OF(X509) **ca);
00249 PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
00250 STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter,
00251 int mac_iter, int keytype);
00252
00253 PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert);
00254 PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, EVP_PKEY *key,
00255 int key_usage, int iter,
00256 int key_nid, char *pass);
00257 int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags,
00258 int safe_nid, int iter, char *pass);
00259 PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid);
00260
00261 int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12);
00262 int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12);
00263 PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12);
00264 PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12);
00265 int PKCS12_newpass(PKCS12 *p12, char *oldpass, char *newpass);
00266
00267
00268
00269
00270
00271 void ERR_load_PKCS12_strings(void);
00272
00273
00274
00275
00276 #define PKCS12_F_PARSE_BAG 129
00277 #define PKCS12_F_PARSE_BAGS 103
00278 #define PKCS12_F_PKCS12_ADD_FRIENDLYNAME 100
00279 #define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_ASC 127
00280 #define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_UNI 102
00281 #define PKCS12_F_PKCS12_ADD_LOCALKEYID 104
00282 #define PKCS12_F_PKCS12_CREATE 105
00283 #define PKCS12_F_PKCS12_GEN_MAC 107
00284 #define PKCS12_F_PKCS12_INIT 109
00285 #define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I 106
00286 #define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT 108
00287 #define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG 117
00288 #define PKCS12_F_PKCS12_KEY_GEN_ASC 110
00289 #define PKCS12_F_PKCS12_KEY_GEN_UNI 111
00290 #define PKCS12_F_PKCS12_MAKE_KEYBAG 112
00291 #define PKCS12_F_PKCS12_MAKE_SHKEYBAG 113
00292 #define PKCS12_F_PKCS12_NEWPASS 128
00293 #define PKCS12_F_PKCS12_PACK_P7DATA 114
00294 #define PKCS12_F_PKCS12_PACK_P7ENCDATA 115
00295 #define PKCS12_F_PKCS12_PARSE 118
00296 #define PKCS12_F_PKCS12_PBE_CRYPT 119
00297 #define PKCS12_F_PKCS12_PBE_KEYIVGEN 120
00298 #define PKCS12_F_PKCS12_SETUP_MAC 122
00299 #define PKCS12_F_PKCS12_SET_MAC 123
00300 #define PKCS12_F_PKCS12_UNPACK_AUTHSAFES 130
00301 #define PKCS12_F_PKCS12_UNPACK_P7DATA 131
00302 #define PKCS12_F_PKCS12_VERIFY_MAC 126
00303 #define PKCS12_F_PKCS8_ADD_KEYUSAGE 124
00304 #define PKCS12_F_PKCS8_ENCRYPT 125
00305
00306
00307 #define PKCS12_R_CANT_PACK_STRUCTURE 100
00308 #define PKCS12_R_CONTENT_TYPE_NOT_DATA 121
00309 #define PKCS12_R_DECODE_ERROR 101
00310 #define PKCS12_R_ENCODE_ERROR 102
00311 #define PKCS12_R_ENCRYPT_ERROR 103
00312 #define PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE 120
00313 #define PKCS12_R_INVALID_NULL_ARGUMENT 104
00314 #define PKCS12_R_INVALID_NULL_PKCS12_POINTER 105
00315 #define PKCS12_R_IV_GEN_ERROR 106
00316 #define PKCS12_R_KEY_GEN_ERROR 107
00317 #define PKCS12_R_MAC_ABSENT 108
00318 #define PKCS12_R_MAC_GENERATION_ERROR 109
00319 #define PKCS12_R_MAC_SETUP_ERROR 110
00320 #define PKCS12_R_MAC_STRING_SET_ERROR 111
00321 #define PKCS12_R_MAC_VERIFY_ERROR 112
00322 #define PKCS12_R_MAC_VERIFY_FAILURE 113
00323 #define PKCS12_R_PARSE_ERROR 114
00324 #define PKCS12_R_PKCS12_ALGOR_CIPHERINIT_ERROR 115
00325 #define PKCS12_R_PKCS12_CIPHERFINAL_ERROR 116
00326 #define PKCS12_R_PKCS12_PBE_CRYPT_ERROR 117
00327 #define PKCS12_R_UNKNOWN_DIGEST_ALGORITHM 118
00328 #define PKCS12_R_UNSUPPORTED_PKCS12_MODE 119
00329
00330 #ifdef __cplusplus
00331 }
00332 #endif
00333 #endif