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