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_X509_H
00060 #include <openssl/x509.h>
00061
00062
00063 #endif
00064
00065 #ifndef HEADER_X509_VFY_H
00066 #define HEADER_X509_VFY_H
00067
00068 #include <openssl/opensslconf.h>
00069 #ifndef OPENSSL_NO_LHASH
00070 #include <openssl/lhash.h>
00071 #endif
00072 #include <openssl/bio.h>
00073 #include <openssl/crypto.h>
00074 #include <openssl/symhacks.h>
00075
00076 #ifdef __cplusplus
00077 extern "C" {
00078 #endif
00079
00080
00081 typedef struct x509_hash_dir_st
00082 {
00083 int num_dirs;
00084 char **dirs;
00085 int *dirs_type;
00086 int num_dirs_alloced;
00087 } X509_HASH_DIR_CTX;
00088
00089 typedef struct x509_file_st
00090 {
00091 int num_paths;
00092 int num_alloced;
00093 char **paths;
00094 int *path_type;
00095 } X509_CERT_FILE_CTX;
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 #define X509_LU_RETRY -1
00116 #define X509_LU_FAIL 0
00117 #define X509_LU_X509 1
00118 #define X509_LU_CRL 2
00119 #define X509_LU_PKEY 3
00120
00121 typedef struct x509_object_st
00122 {
00123
00124 int type;
00125 union {
00126 char *ptr;
00127 X509 *x509;
00128 X509_CRL *crl;
00129 EVP_PKEY *pkey;
00130 } data;
00131 } X509_OBJECT;
00132
00133 typedef struct x509_lookup_st X509_LOOKUP;
00134
00135 DECLARE_STACK_OF(X509_LOOKUP)
00136 DECLARE_STACK_OF(X509_OBJECT)
00137
00138
00139 typedef struct x509_lookup_method_st
00140 {
00141 const char *name;
00142 int (*new_item)(X509_LOOKUP *ctx);
00143 void (*free)(X509_LOOKUP *ctx);
00144 int (*init)(X509_LOOKUP *ctx);
00145 int (*shutdown)(X509_LOOKUP *ctx);
00146 int (*ctrl)(X509_LOOKUP *ctx,int cmd,const char *argc,long argl,
00147 char **ret);
00148 int (*get_by_subject)(X509_LOOKUP *ctx,int type,X509_NAME *name,
00149 X509_OBJECT *ret);
00150 int (*get_by_issuer_serial)(X509_LOOKUP *ctx,int type,X509_NAME *name,
00151 ASN1_INTEGER *serial,X509_OBJECT *ret);
00152 int (*get_by_fingerprint)(X509_LOOKUP *ctx,int type,
00153 unsigned char *bytes,int len,
00154 X509_OBJECT *ret);
00155 int (*get_by_alias)(X509_LOOKUP *ctx,int type,char *str,int len,
00156 X509_OBJECT *ret);
00157 } X509_LOOKUP_METHOD;
00158
00159
00160
00161
00162
00163
00164 typedef struct X509_VERIFY_PARAM_st
00165 {
00166 char *name;
00167 time_t check_time;
00168 unsigned long inh_flags;
00169 unsigned long flags;
00170 int purpose;
00171 int trust;
00172 int depth;
00173 STACK_OF(ASN1_OBJECT) *policies;
00174 } X509_VERIFY_PARAM;
00175
00176 DECLARE_STACK_OF(X509_VERIFY_PARAM)
00177
00178
00179
00180
00181 struct x509_store_st
00182 {
00183
00184 int cache;
00185 STACK_OF(X509_OBJECT) *objs;
00186
00187
00188 STACK_OF(X509_LOOKUP) *get_cert_methods;
00189
00190 X509_VERIFY_PARAM *param;
00191
00192
00193 int (*verify)(X509_STORE_CTX *ctx);
00194 int (*verify_cb)(int ok,X509_STORE_CTX *ctx);
00195 int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x);
00196 int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
00197 int (*check_revocation)(X509_STORE_CTX *ctx);
00198 int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x);
00199 int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl);
00200 int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x);
00201 int (*cleanup)(X509_STORE_CTX *ctx);
00202
00203 CRYPTO_EX_DATA ex_data;
00204 int references;
00205 } ;
00206
00207 int X509_STORE_set_depth(X509_STORE *store, int depth);
00208
00209 #define X509_STORE_set_verify_cb_func(ctx,func) ((ctx)->verify_cb=(func))
00210 #define X509_STORE_set_verify_func(ctx,func) ((ctx)->verify=(func))
00211
00212
00213 struct x509_lookup_st
00214 {
00215 int init;
00216 int skip;
00217 X509_LOOKUP_METHOD *method;
00218 char *method_data;
00219
00220 X509_STORE *store_ctx;
00221 } ;
00222
00223
00224
00225
00226 struct x509_store_ctx_st
00227 {
00228 X509_STORE *ctx;
00229 int current_method;
00230
00231
00232 X509 *cert;
00233 STACK_OF(X509) *untrusted;
00234 STACK_OF(X509_CRL) *crls;
00235
00236 X509_VERIFY_PARAM *param;
00237 void *other_ctx;
00238
00239
00240 int (*verify)(X509_STORE_CTX *ctx);
00241 int (*verify_cb)(int ok,X509_STORE_CTX *ctx);
00242 int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x);
00243 int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
00244 int (*check_revocation)(X509_STORE_CTX *ctx);
00245 int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x);
00246 int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl);
00247 int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x);
00248 int (*check_policy)(X509_STORE_CTX *ctx);
00249 int (*cleanup)(X509_STORE_CTX *ctx);
00250
00251
00252 int valid;
00253 int last_untrusted;
00254 STACK_OF(X509) *chain;
00255 X509_POLICY_TREE *tree;
00256
00257 int explicit_policy;
00258
00259
00260 int error_depth;
00261 int error;
00262 X509 *current_cert;
00263 X509 *current_issuer;
00264 X509_CRL *current_crl;
00265
00266 CRYPTO_EX_DATA ex_data;
00267 } ;
00268
00269 void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth);
00270
00271 #define X509_STORE_CTX_set_app_data(ctx,data) \
00272 X509_STORE_CTX_set_ex_data(ctx,0,data)
00273 #define X509_STORE_CTX_get_app_data(ctx) \
00274 X509_STORE_CTX_get_ex_data(ctx,0)
00275
00276 #define X509_L_FILE_LOAD 1
00277 #define X509_L_ADD_DIR 2
00278
00279 #define X509_LOOKUP_load_file(x,name,type) \
00280 X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL)
00281
00282 #define X509_LOOKUP_add_dir(x,name,type) \
00283 X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL)
00284
00285 #define X509_V_OK 0
00286
00287
00288 #define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2
00289 #define X509_V_ERR_UNABLE_TO_GET_CRL 3
00290 #define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4
00291 #define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5
00292 #define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6
00293 #define X509_V_ERR_CERT_SIGNATURE_FAILURE 7
00294 #define X509_V_ERR_CRL_SIGNATURE_FAILURE 8
00295 #define X509_V_ERR_CERT_NOT_YET_VALID 9
00296 #define X509_V_ERR_CERT_HAS_EXPIRED 10
00297 #define X509_V_ERR_CRL_NOT_YET_VALID 11
00298 #define X509_V_ERR_CRL_HAS_EXPIRED 12
00299 #define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13
00300 #define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14
00301 #define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15
00302 #define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16
00303 #define X509_V_ERR_OUT_OF_MEM 17
00304 #define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18
00305 #define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19
00306 #define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20
00307 #define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21
00308 #define X509_V_ERR_CERT_CHAIN_TOO_LONG 22
00309 #define X509_V_ERR_CERT_REVOKED 23
00310 #define X509_V_ERR_INVALID_CA 24
00311 #define X509_V_ERR_PATH_LENGTH_EXCEEDED 25
00312 #define X509_V_ERR_INVALID_PURPOSE 26
00313 #define X509_V_ERR_CERT_UNTRUSTED 27
00314 #define X509_V_ERR_CERT_REJECTED 28
00315
00316 #define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29
00317 #define X509_V_ERR_AKID_SKID_MISMATCH 30
00318 #define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31
00319 #define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32
00320
00321 #define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33
00322 #define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34
00323 #define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35
00324 #define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36
00325 #define X509_V_ERR_INVALID_NON_CA 37
00326 #define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38
00327 #define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39
00328 #define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40
00329
00330 #define X509_V_ERR_INVALID_EXTENSION 41
00331 #define X509_V_ERR_INVALID_POLICY_EXTENSION 42
00332 #define X509_V_ERR_NO_EXPLICIT_POLICY 43
00333
00334 #define X509_V_ERR_UNNESTED_RESOURCE 44
00335
00336
00337 #define X509_V_ERR_APPLICATION_VERIFICATION 50
00338
00339
00340
00341
00342 #define X509_V_FLAG_CB_ISSUER_CHECK 0x1
00343
00344 #define X509_V_FLAG_USE_CHECK_TIME 0x2
00345
00346 #define X509_V_FLAG_CRL_CHECK 0x4
00347
00348 #define X509_V_FLAG_CRL_CHECK_ALL 0x8
00349
00350 #define X509_V_FLAG_IGNORE_CRITICAL 0x10
00351
00352 #define X509_V_FLAG_X509_STRICT 0x20
00353
00354 #define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40
00355
00356 #define X509_V_FLAG_POLICY_CHECK 0x80
00357
00358 #define X509_V_FLAG_EXPLICIT_POLICY 0x100
00359
00360 #define X509_V_FLAG_INHIBIT_ANY 0x200
00361
00362 #define X509_V_FLAG_INHIBIT_MAP 0x400
00363
00364 #define X509_V_FLAG_NOTIFY_POLICY 0x800
00365
00366 #define X509_VP_FLAG_DEFAULT 0x1
00367 #define X509_VP_FLAG_OVERWRITE 0x2
00368 #define X509_VP_FLAG_RESET_FLAGS 0x4
00369 #define X509_VP_FLAG_LOCKED 0x8
00370 #define X509_VP_FLAG_ONCE 0x10
00371
00372
00373 #define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \
00374 | X509_V_FLAG_EXPLICIT_POLICY \
00375 | X509_V_FLAG_INHIBIT_ANY \
00376 | X509_V_FLAG_INHIBIT_MAP)
00377
00378 int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type,
00379 X509_NAME *name);
00380 X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h,int type,X509_NAME *name);
00381 X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, X509_OBJECT *x);
00382 void X509_OBJECT_up_ref_count(X509_OBJECT *a);
00383 void X509_OBJECT_free_contents(X509_OBJECT *a);
00384 X509_STORE *X509_STORE_new(void );
00385 void X509_STORE_free(X509_STORE *v);
00386
00387 int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags);
00388 int X509_STORE_set_purpose(X509_STORE *ctx, int purpose);
00389 int X509_STORE_set_trust(X509_STORE *ctx, int trust);
00390 int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *pm);
00391
00392 X509_STORE_CTX *X509_STORE_CTX_new(void);
00393
00394 int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x);
00395
00396 void X509_STORE_CTX_free(X509_STORE_CTX *ctx);
00397 int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store,
00398 X509 *x509, STACK_OF(X509) *chain);
00399 void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk);
00400 void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx);
00401
00402 X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m);
00403
00404 X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void);
00405 X509_LOOKUP_METHOD *X509_LOOKUP_file(void);
00406
00407 int X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
00408 int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);
00409
00410 int X509_STORE_get_by_subject(X509_STORE_CTX *vs,int type,X509_NAME *name,
00411 X509_OBJECT *ret);
00412
00413 int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc,
00414 long argl, char **ret);
00415
00416 #ifndef OPENSSL_NO_STDIO
00417 int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type);
00418 int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type);
00419 int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type);
00420 #endif
00421
00422
00423 X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method);
00424 void X509_LOOKUP_free(X509_LOOKUP *ctx);
00425 int X509_LOOKUP_init(X509_LOOKUP *ctx);
00426 int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name,
00427 X509_OBJECT *ret);
00428 int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name,
00429 ASN1_INTEGER *serial, X509_OBJECT *ret);
00430 int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type,
00431 unsigned char *bytes, int len, X509_OBJECT *ret);
00432 int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str,
00433 int len, X509_OBJECT *ret);
00434 int X509_LOOKUP_shutdown(X509_LOOKUP *ctx);
00435
00436 #ifndef OPENSSL_NO_STDIO
00437 int X509_STORE_load_locations (X509_STORE *ctx,
00438 const char *file, const char *dir);
00439 int X509_STORE_set_default_paths(X509_STORE *ctx);
00440 #endif
00441
00442 int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
00443 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
00444 int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx,int idx,void *data);
00445 void * X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx,int idx);
00446 int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx);
00447 void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx,int s);
00448 int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx);
00449 X509 * X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx);
00450 STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx);
00451 STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx);
00452 void X509_STORE_CTX_set_cert(X509_STORE_CTX *c,X509 *x);
00453 void X509_STORE_CTX_set_chain(X509_STORE_CTX *c,STACK_OF(X509) *sk);
00454 void X509_STORE_CTX_set0_crls(X509_STORE_CTX *c,STACK_OF(X509_CRL) *sk);
00455 int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose);
00456 int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust);
00457 int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
00458 int purpose, int trust);
00459 void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags);
00460 void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags,
00461 time_t t);
00462 void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx,
00463 int (*verify_cb)(int, X509_STORE_CTX *));
00464
00465 X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx);
00466 int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx);
00467
00468 X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx);
00469 void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param);
00470 int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name);
00471
00472
00473
00474 X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void);
00475 void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param);
00476 int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to,
00477 const X509_VERIFY_PARAM *from);
00478 int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to,
00479 const X509_VERIFY_PARAM *from);
00480 int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name);
00481 int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags);
00482 int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param,
00483 unsigned long flags);
00484 unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param);
00485 int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose);
00486 int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust);
00487 void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth);
00488 void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t);
00489 int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param,
00490 ASN1_OBJECT *policy);
00491 int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param,
00492 STACK_OF(ASN1_OBJECT) *policies);
00493 int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param);
00494
00495 int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param);
00496 const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name);
00497 void X509_VERIFY_PARAM_table_cleanup(void);
00498
00499 int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy,
00500 STACK_OF(X509) *certs,
00501 STACK_OF(ASN1_OBJECT) *policy_oids,
00502 unsigned int flags);
00503
00504 void X509_policy_tree_free(X509_POLICY_TREE *tree);
00505
00506 int X509_policy_tree_level_count(const X509_POLICY_TREE *tree);
00507 X509_POLICY_LEVEL *
00508 X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, int i);
00509
00510 STACK_OF(X509_POLICY_NODE) *
00511 X509_policy_tree_get0_policies(const X509_POLICY_TREE *tree);
00512
00513 STACK_OF(X509_POLICY_NODE) *
00514 X509_policy_tree_get0_user_policies(const X509_POLICY_TREE *tree);
00515
00516 int X509_policy_level_node_count(X509_POLICY_LEVEL *level);
00517
00518 X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level, int i);
00519
00520 const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node);
00521
00522 STACK_OF(POLICYQUALINFO) *
00523 X509_policy_node_get0_qualifiers(const X509_POLICY_NODE *node);
00524 const X509_POLICY_NODE *
00525 X509_policy_node_get0_parent(const X509_POLICY_NODE *node);
00526
00527 #ifdef __cplusplus
00528 }
00529 #endif
00530 #endif
00531