diff options
Diffstat (limited to 'src/lib/libcrypto/x509/x509_vfy.c')
-rw-r--r-- | src/lib/libcrypto/x509/x509_vfy.c | 2219 |
1 files changed, 0 insertions, 2219 deletions
diff --git a/src/lib/libcrypto/x509/x509_vfy.c b/src/lib/libcrypto/x509/x509_vfy.c deleted file mode 100644 index 701ec565e9..0000000000 --- a/src/lib/libcrypto/x509/x509_vfy.c +++ /dev/null | |||
@@ -1,2219 +0,0 @@ | |||
1 | /* crypto/x509/x509_vfy.c */ | ||
2 | /* Copyright (C) 1995-1998 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 | #include <stdio.h> | ||
60 | #include <time.h> | ||
61 | #include <errno.h> | ||
62 | |||
63 | #include "cryptlib.h" | ||
64 | #include <openssl/crypto.h> | ||
65 | #include <openssl/lhash.h> | ||
66 | #include <openssl/buffer.h> | ||
67 | #include <openssl/evp.h> | ||
68 | #include <openssl/asn1.h> | ||
69 | #include <openssl/x509.h> | ||
70 | #include <openssl/x509v3.h> | ||
71 | #include <openssl/objects.h> | ||
72 | |||
73 | /* CRL score values */ | ||
74 | |||
75 | /* No unhandled critical extensions */ | ||
76 | |||
77 | #define CRL_SCORE_NOCRITICAL 0x100 | ||
78 | |||
79 | /* certificate is within CRL scope */ | ||
80 | |||
81 | #define CRL_SCORE_SCOPE 0x080 | ||
82 | |||
83 | /* CRL times valid */ | ||
84 | |||
85 | #define CRL_SCORE_TIME 0x040 | ||
86 | |||
87 | /* Issuer name matches certificate */ | ||
88 | |||
89 | #define CRL_SCORE_ISSUER_NAME 0x020 | ||
90 | |||
91 | /* If this score or above CRL is probably valid */ | ||
92 | |||
93 | #define CRL_SCORE_VALID (CRL_SCORE_NOCRITICAL|CRL_SCORE_TIME|CRL_SCORE_SCOPE) | ||
94 | |||
95 | /* CRL issuer is certificate issuer */ | ||
96 | |||
97 | #define CRL_SCORE_ISSUER_CERT 0x018 | ||
98 | |||
99 | /* CRL issuer is on certificate path */ | ||
100 | |||
101 | #define CRL_SCORE_SAME_PATH 0x008 | ||
102 | |||
103 | /* CRL issuer matches CRL AKID */ | ||
104 | |||
105 | #define CRL_SCORE_AKID 0x004 | ||
106 | |||
107 | /* Have a delta CRL with valid times */ | ||
108 | |||
109 | #define CRL_SCORE_TIME_DELTA 0x002 | ||
110 | |||
111 | static int null_callback(int ok,X509_STORE_CTX *e); | ||
112 | static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); | ||
113 | static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x); | ||
114 | static int check_chain_extensions(X509_STORE_CTX *ctx); | ||
115 | static int check_name_constraints(X509_STORE_CTX *ctx); | ||
116 | static int check_trust(X509_STORE_CTX *ctx); | ||
117 | static int check_revocation(X509_STORE_CTX *ctx); | ||
118 | static int check_cert(X509_STORE_CTX *ctx); | ||
119 | static int check_policy(X509_STORE_CTX *ctx); | ||
120 | |||
121 | static int get_crl_score(X509_STORE_CTX *ctx, X509 **pissuer, | ||
122 | unsigned int *preasons, | ||
123 | X509_CRL *crl, X509 *x); | ||
124 | static int get_crl_delta(X509_STORE_CTX *ctx, | ||
125 | X509_CRL **pcrl, X509_CRL **pdcrl, X509 *x); | ||
126 | static void get_delta_sk(X509_STORE_CTX *ctx, X509_CRL **dcrl, int *pcrl_score, | ||
127 | X509_CRL *base, STACK_OF(X509_CRL) *crls); | ||
128 | static void crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl, | ||
129 | X509 **pissuer, int *pcrl_score); | ||
130 | static int crl_crldp_check(X509 *x, X509_CRL *crl, int crl_score, | ||
131 | unsigned int *preasons); | ||
132 | static int check_crl_path(X509_STORE_CTX *ctx, X509 *x); | ||
133 | static int check_crl_chain(X509_STORE_CTX *ctx, | ||
134 | STACK_OF(X509) *cert_path, | ||
135 | STACK_OF(X509) *crl_path); | ||
136 | |||
137 | static int internal_verify(X509_STORE_CTX *ctx); | ||
138 | const char X509_version[]="X.509" OPENSSL_VERSION_PTEXT; | ||
139 | |||
140 | |||
141 | static int null_callback(int ok, X509_STORE_CTX *e) | ||
142 | { | ||
143 | return ok; | ||
144 | } | ||
145 | |||
146 | #if 0 | ||
147 | static int x509_subject_cmp(X509 **a, X509 **b) | ||
148 | { | ||
149 | return X509_subject_name_cmp(*a,*b); | ||
150 | } | ||
151 | #endif | ||
152 | |||
153 | int X509_verify_cert(X509_STORE_CTX *ctx) | ||
154 | { | ||
155 | X509 *x,*xtmp,*chain_ss=NULL; | ||
156 | X509_NAME *xn; | ||
157 | int bad_chain = 0; | ||
158 | X509_VERIFY_PARAM *param = ctx->param; | ||
159 | int depth,i,ok=0; | ||
160 | int num; | ||
161 | int (*cb)(int xok,X509_STORE_CTX *xctx); | ||
162 | STACK_OF(X509) *sktmp=NULL; | ||
163 | if (ctx->cert == NULL) | ||
164 | { | ||
165 | X509err(X509_F_X509_VERIFY_CERT,X509_R_NO_CERT_SET_FOR_US_TO_VERIFY); | ||
166 | return -1; | ||
167 | } | ||
168 | |||
169 | cb=ctx->verify_cb; | ||
170 | |||
171 | /* first we make sure the chain we are going to build is | ||
172 | * present and that the first entry is in place */ | ||
173 | if (ctx->chain == NULL) | ||
174 | { | ||
175 | if ( ((ctx->chain=sk_X509_new_null()) == NULL) || | ||
176 | (!sk_X509_push(ctx->chain,ctx->cert))) | ||
177 | { | ||
178 | X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE); | ||
179 | goto end; | ||
180 | } | ||
181 | CRYPTO_add(&ctx->cert->references,1,CRYPTO_LOCK_X509); | ||
182 | ctx->last_untrusted=1; | ||
183 | } | ||
184 | |||
185 | /* We use a temporary STACK so we can chop and hack at it */ | ||
186 | if (ctx->untrusted != NULL | ||
187 | && (sktmp=sk_X509_dup(ctx->untrusted)) == NULL) | ||
188 | { | ||
189 | X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE); | ||
190 | goto end; | ||
191 | } | ||
192 | |||
193 | num=sk_X509_num(ctx->chain); | ||
194 | x=sk_X509_value(ctx->chain,num-1); | ||
195 | depth=param->depth; | ||
196 | |||
197 | |||
198 | for (;;) | ||
199 | { | ||
200 | /* If we have enough, we break */ | ||
201 | if (depth < num) break; /* FIXME: If this happens, we should take | ||
202 | * note of it and, if appropriate, use the | ||
203 | * X509_V_ERR_CERT_CHAIN_TOO_LONG error | ||
204 | * code later. | ||
205 | */ | ||
206 | |||
207 | /* If we are self signed, we break */ | ||
208 | xn=X509_get_issuer_name(x); | ||
209 | if (ctx->check_issued(ctx, x,x)) break; | ||
210 | |||
211 | /* If we were passed a cert chain, use it first */ | ||
212 | if (ctx->untrusted != NULL) | ||
213 | { | ||
214 | xtmp=find_issuer(ctx, sktmp,x); | ||
215 | if (xtmp != NULL) | ||
216 | { | ||
217 | if (!sk_X509_push(ctx->chain,xtmp)) | ||
218 | { | ||
219 | X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE); | ||
220 | goto end; | ||
221 | } | ||
222 | CRYPTO_add(&xtmp->references,1,CRYPTO_LOCK_X509); | ||
223 | (void)sk_X509_delete_ptr(sktmp,xtmp); | ||
224 | ctx->last_untrusted++; | ||
225 | x=xtmp; | ||
226 | num++; | ||
227 | /* reparse the full chain for | ||
228 | * the next one */ | ||
229 | continue; | ||
230 | } | ||
231 | } | ||
232 | break; | ||
233 | } | ||
234 | |||
235 | /* at this point, chain should contain a list of untrusted | ||
236 | * certificates. We now need to add at least one trusted one, | ||
237 | * if possible, otherwise we complain. */ | ||
238 | |||
239 | /* Examine last certificate in chain and see if it | ||
240 | * is self signed. | ||
241 | */ | ||
242 | |||
243 | i=sk_X509_num(ctx->chain); | ||
244 | x=sk_X509_value(ctx->chain,i-1); | ||
245 | xn = X509_get_subject_name(x); | ||
246 | if (ctx->check_issued(ctx, x, x)) | ||
247 | { | ||
248 | /* we have a self signed certificate */ | ||
249 | if (sk_X509_num(ctx->chain) == 1) | ||
250 | { | ||
251 | /* We have a single self signed certificate: see if | ||
252 | * we can find it in the store. We must have an exact | ||
253 | * match to avoid possible impersonation. | ||
254 | */ | ||
255 | ok = ctx->get_issuer(&xtmp, ctx, x); | ||
256 | if ((ok <= 0) || X509_cmp(x, xtmp)) | ||
257 | { | ||
258 | ctx->error=X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT; | ||
259 | ctx->current_cert=x; | ||
260 | ctx->error_depth=i-1; | ||
261 | if (ok == 1) X509_free(xtmp); | ||
262 | bad_chain = 1; | ||
263 | ok=cb(0,ctx); | ||
264 | if (!ok) goto end; | ||
265 | } | ||
266 | else | ||
267 | { | ||
268 | /* We have a match: replace certificate with store version | ||
269 | * so we get any trust settings. | ||
270 | */ | ||
271 | X509_free(x); | ||
272 | x = xtmp; | ||
273 | (void)sk_X509_set(ctx->chain, i - 1, x); | ||
274 | ctx->last_untrusted=0; | ||
275 | } | ||
276 | } | ||
277 | else | ||
278 | { | ||
279 | /* extract and save self signed certificate for later use */ | ||
280 | chain_ss=sk_X509_pop(ctx->chain); | ||
281 | ctx->last_untrusted--; | ||
282 | num--; | ||
283 | x=sk_X509_value(ctx->chain,num-1); | ||
284 | } | ||
285 | } | ||
286 | |||
287 | /* We now lookup certs from the certificate store */ | ||
288 | for (;;) | ||
289 | { | ||
290 | /* If we have enough, we break */ | ||
291 | if (depth < num) break; | ||
292 | |||
293 | /* If we are self signed, we break */ | ||
294 | xn=X509_get_issuer_name(x); | ||
295 | if (ctx->check_issued(ctx,x,x)) break; | ||
296 | |||
297 | ok = ctx->get_issuer(&xtmp, ctx, x); | ||
298 | |||
299 | if (ok < 0) return ok; | ||
300 | if (ok == 0) break; | ||
301 | |||
302 | x = xtmp; | ||
303 | if (!sk_X509_push(ctx->chain,x)) | ||
304 | { | ||
305 | X509_free(xtmp); | ||
306 | X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE); | ||
307 | return 0; | ||
308 | } | ||
309 | num++; | ||
310 | } | ||
311 | |||
312 | /* we now have our chain, lets check it... */ | ||
313 | xn=X509_get_issuer_name(x); | ||
314 | |||
315 | /* Is last certificate looked up self signed? */ | ||
316 | if (!ctx->check_issued(ctx,x,x)) | ||
317 | { | ||
318 | if ((chain_ss == NULL) || !ctx->check_issued(ctx, x, chain_ss)) | ||
319 | { | ||
320 | if (ctx->last_untrusted >= num) | ||
321 | ctx->error=X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY; | ||
322 | else | ||
323 | ctx->error=X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT; | ||
324 | ctx->current_cert=x; | ||
325 | } | ||
326 | else | ||
327 | { | ||
328 | |||
329 | sk_X509_push(ctx->chain,chain_ss); | ||
330 | num++; | ||
331 | ctx->last_untrusted=num; | ||
332 | ctx->current_cert=chain_ss; | ||
333 | ctx->error=X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN; | ||
334 | chain_ss=NULL; | ||
335 | } | ||
336 | |||
337 | ctx->error_depth=num-1; | ||
338 | bad_chain = 1; | ||
339 | ok=cb(0,ctx); | ||
340 | if (!ok) goto end; | ||
341 | } | ||
342 | |||
343 | /* We have the chain complete: now we need to check its purpose */ | ||
344 | ok = check_chain_extensions(ctx); | ||
345 | |||
346 | if (!ok) goto end; | ||
347 | |||
348 | /* Check name constraints */ | ||
349 | |||
350 | ok = check_name_constraints(ctx); | ||
351 | |||
352 | if (!ok) goto end; | ||
353 | |||
354 | /* The chain extensions are OK: check trust */ | ||
355 | |||
356 | if (param->trust > 0) ok = check_trust(ctx); | ||
357 | |||
358 | if (!ok) goto end; | ||
359 | |||
360 | /* We may as well copy down any DSA parameters that are required */ | ||
361 | X509_get_pubkey_parameters(NULL,ctx->chain); | ||
362 | |||
363 | /* Check revocation status: we do this after copying parameters | ||
364 | * because they may be needed for CRL signature verification. | ||
365 | */ | ||
366 | |||
367 | ok = ctx->check_revocation(ctx); | ||
368 | if(!ok) goto end; | ||
369 | |||
370 | /* At this point, we have a chain and need to verify it */ | ||
371 | if (ctx->verify != NULL) | ||
372 | ok=ctx->verify(ctx); | ||
373 | else | ||
374 | ok=internal_verify(ctx); | ||
375 | if(!ok) goto end; | ||
376 | |||
377 | #ifndef OPENSSL_NO_RFC3779 | ||
378 | /* RFC 3779 path validation, now that CRL check has been done */ | ||
379 | ok = v3_asid_validate_path(ctx); | ||
380 | if (!ok) goto end; | ||
381 | ok = v3_addr_validate_path(ctx); | ||
382 | if (!ok) goto end; | ||
383 | #endif | ||
384 | |||
385 | /* If we get this far evaluate policies */ | ||
386 | if (!bad_chain && (ctx->param->flags & X509_V_FLAG_POLICY_CHECK)) | ||
387 | ok = ctx->check_policy(ctx); | ||
388 | if(!ok) goto end; | ||
389 | if (0) | ||
390 | { | ||
391 | end: | ||
392 | X509_get_pubkey_parameters(NULL,ctx->chain); | ||
393 | } | ||
394 | if (sktmp != NULL) sk_X509_free(sktmp); | ||
395 | if (chain_ss != NULL) X509_free(chain_ss); | ||
396 | return ok; | ||
397 | } | ||
398 | |||
399 | |||
400 | /* Given a STACK_OF(X509) find the issuer of cert (if any) | ||
401 | */ | ||
402 | |||
403 | static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x) | ||
404 | { | ||
405 | int i; | ||
406 | X509 *issuer; | ||
407 | for (i = 0; i < sk_X509_num(sk); i++) | ||
408 | { | ||
409 | issuer = sk_X509_value(sk, i); | ||
410 | if (ctx->check_issued(ctx, x, issuer)) | ||
411 | return issuer; | ||
412 | } | ||
413 | return NULL; | ||
414 | } | ||
415 | |||
416 | /* Given a possible certificate and issuer check them */ | ||
417 | |||
418 | static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer) | ||
419 | { | ||
420 | int ret; | ||
421 | ret = X509_check_issued(issuer, x); | ||
422 | if (ret == X509_V_OK) | ||
423 | return 1; | ||
424 | /* If we haven't asked for issuer errors don't set ctx */ | ||
425 | if (!(ctx->param->flags & X509_V_FLAG_CB_ISSUER_CHECK)) | ||
426 | return 0; | ||
427 | |||
428 | ctx->error = ret; | ||
429 | ctx->current_cert = x; | ||
430 | ctx->current_issuer = issuer; | ||
431 | return ctx->verify_cb(0, ctx); | ||
432 | return 0; | ||
433 | } | ||
434 | |||
435 | /* Alternative lookup method: look from a STACK stored in other_ctx */ | ||
436 | |||
437 | static int get_issuer_sk(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) | ||
438 | { | ||
439 | *issuer = find_issuer(ctx, ctx->other_ctx, x); | ||
440 | if (*issuer) | ||
441 | { | ||
442 | CRYPTO_add(&(*issuer)->references,1,CRYPTO_LOCK_X509); | ||
443 | return 1; | ||
444 | } | ||
445 | else | ||
446 | return 0; | ||
447 | } | ||
448 | |||
449 | |||
450 | /* Check a certificate chains extensions for consistency | ||
451 | * with the supplied purpose | ||
452 | */ | ||
453 | |||
454 | static int check_chain_extensions(X509_STORE_CTX *ctx) | ||
455 | { | ||
456 | #ifdef OPENSSL_NO_CHAIN_VERIFY | ||
457 | return 1; | ||
458 | #else | ||
459 | int i, ok=0, must_be_ca, plen = 0; | ||
460 | X509 *x; | ||
461 | int (*cb)(int xok,X509_STORE_CTX *xctx); | ||
462 | int proxy_path_length = 0; | ||
463 | int purpose; | ||
464 | int allow_proxy_certs; | ||
465 | cb=ctx->verify_cb; | ||
466 | |||
467 | /* must_be_ca can have 1 of 3 values: | ||
468 | -1: we accept both CA and non-CA certificates, to allow direct | ||
469 | use of self-signed certificates (which are marked as CA). | ||
470 | 0: we only accept non-CA certificates. This is currently not | ||
471 | used, but the possibility is present for future extensions. | ||
472 | 1: we only accept CA certificates. This is currently used for | ||
473 | all certificates in the chain except the leaf certificate. | ||
474 | */ | ||
475 | must_be_ca = -1; | ||
476 | |||
477 | /* CRL path validation */ | ||
478 | if (ctx->parent) | ||
479 | { | ||
480 | allow_proxy_certs = 0; | ||
481 | purpose = X509_PURPOSE_CRL_SIGN; | ||
482 | } | ||
483 | else | ||
484 | { | ||
485 | allow_proxy_certs = | ||
486 | !!(ctx->param->flags & X509_V_FLAG_ALLOW_PROXY_CERTS); | ||
487 | /* A hack to keep people who don't want to modify their | ||
488 | software happy */ | ||
489 | if (getenv("OPENSSL_ALLOW_PROXY_CERTS")) | ||
490 | allow_proxy_certs = 1; | ||
491 | purpose = ctx->param->purpose; | ||
492 | } | ||
493 | |||
494 | /* Check all untrusted certificates */ | ||
495 | for (i = 0; i < ctx->last_untrusted; i++) | ||
496 | { | ||
497 | int ret; | ||
498 | x = sk_X509_value(ctx->chain, i); | ||
499 | if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL) | ||
500 | && (x->ex_flags & EXFLAG_CRITICAL)) | ||
501 | { | ||
502 | ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION; | ||
503 | ctx->error_depth = i; | ||
504 | ctx->current_cert = x; | ||
505 | ok=cb(0,ctx); | ||
506 | if (!ok) goto end; | ||
507 | } | ||
508 | if (!allow_proxy_certs && (x->ex_flags & EXFLAG_PROXY)) | ||
509 | { | ||
510 | ctx->error = X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED; | ||
511 | ctx->error_depth = i; | ||
512 | ctx->current_cert = x; | ||
513 | ok=cb(0,ctx); | ||
514 | if (!ok) goto end; | ||
515 | } | ||
516 | ret = X509_check_ca(x); | ||
517 | switch(must_be_ca) | ||
518 | { | ||
519 | case -1: | ||
520 | if ((ctx->param->flags & X509_V_FLAG_X509_STRICT) | ||
521 | && (ret != 1) && (ret != 0)) | ||
522 | { | ||
523 | ret = 0; | ||
524 | ctx->error = X509_V_ERR_INVALID_CA; | ||
525 | } | ||
526 | else | ||
527 | ret = 1; | ||
528 | break; | ||
529 | case 0: | ||
530 | if (ret != 0) | ||
531 | { | ||
532 | ret = 0; | ||
533 | ctx->error = X509_V_ERR_INVALID_NON_CA; | ||
534 | } | ||
535 | else | ||
536 | ret = 1; | ||
537 | break; | ||
538 | default: | ||
539 | if ((ret == 0) | ||
540 | || ((ctx->param->flags & X509_V_FLAG_X509_STRICT) | ||
541 | && (ret != 1))) | ||
542 | { | ||
543 | ret = 0; | ||
544 | ctx->error = X509_V_ERR_INVALID_CA; | ||
545 | } | ||
546 | else | ||
547 | ret = 1; | ||
548 | break; | ||
549 | } | ||
550 | if (ret == 0) | ||
551 | { | ||
552 | ctx->error_depth = i; | ||
553 | ctx->current_cert = x; | ||
554 | ok=cb(0,ctx); | ||
555 | if (!ok) goto end; | ||
556 | } | ||
557 | if (ctx->param->purpose > 0) | ||
558 | { | ||
559 | ret = X509_check_purpose(x, purpose, must_be_ca > 0); | ||
560 | if ((ret == 0) | ||
561 | || ((ctx->param->flags & X509_V_FLAG_X509_STRICT) | ||
562 | && (ret != 1))) | ||
563 | { | ||
564 | ctx->error = X509_V_ERR_INVALID_PURPOSE; | ||
565 | ctx->error_depth = i; | ||
566 | ctx->current_cert = x; | ||
567 | ok=cb(0,ctx); | ||
568 | if (!ok) goto end; | ||
569 | } | ||
570 | } | ||
571 | /* Check pathlen if not self issued */ | ||
572 | if ((i > 1) && !(x->ex_flags & EXFLAG_SI) | ||
573 | && (x->ex_pathlen != -1) | ||
574 | && (plen > (x->ex_pathlen + proxy_path_length + 1))) | ||
575 | { | ||
576 | ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED; | ||
577 | ctx->error_depth = i; | ||
578 | ctx->current_cert = x; | ||
579 | ok=cb(0,ctx); | ||
580 | if (!ok) goto end; | ||
581 | } | ||
582 | /* Increment path length if not self issued */ | ||
583 | if (!(x->ex_flags & EXFLAG_SI)) | ||
584 | plen++; | ||
585 | /* If this certificate is a proxy certificate, the next | ||
586 | certificate must be another proxy certificate or a EE | ||
587 | certificate. If not, the next certificate must be a | ||
588 | CA certificate. */ | ||
589 | if (x->ex_flags & EXFLAG_PROXY) | ||
590 | { | ||
591 | if (x->ex_pcpathlen != -1 && i > x->ex_pcpathlen) | ||
592 | { | ||
593 | ctx->error = | ||
594 | X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED; | ||
595 | ctx->error_depth = i; | ||
596 | ctx->current_cert = x; | ||
597 | ok=cb(0,ctx); | ||
598 | if (!ok) goto end; | ||
599 | } | ||
600 | proxy_path_length++; | ||
601 | must_be_ca = 0; | ||
602 | } | ||
603 | else | ||
604 | must_be_ca = 1; | ||
605 | } | ||
606 | ok = 1; | ||
607 | end: | ||
608 | return ok; | ||
609 | #endif | ||
610 | } | ||
611 | |||
612 | static int check_name_constraints(X509_STORE_CTX *ctx) | ||
613 | { | ||
614 | X509 *x; | ||
615 | int i, j, rv; | ||
616 | /* Check name constraints for all certificates */ | ||
617 | for (i = sk_X509_num(ctx->chain) - 1; i >= 0; i--) | ||
618 | { | ||
619 | x = sk_X509_value(ctx->chain, i); | ||
620 | /* Ignore self issued certs unless last in chain */ | ||
621 | if (i && (x->ex_flags & EXFLAG_SI)) | ||
622 | continue; | ||
623 | /* Check against constraints for all certificates higher in | ||
624 | * chain including trust anchor. Trust anchor not strictly | ||
625 | * speaking needed but if it includes constraints it is to be | ||
626 | * assumed it expects them to be obeyed. | ||
627 | */ | ||
628 | for (j = sk_X509_num(ctx->chain) - 1; j > i; j--) | ||
629 | { | ||
630 | NAME_CONSTRAINTS *nc = sk_X509_value(ctx->chain, j)->nc; | ||
631 | if (nc) | ||
632 | { | ||
633 | rv = NAME_CONSTRAINTS_check(x, nc); | ||
634 | if (rv != X509_V_OK) | ||
635 | { | ||
636 | ctx->error = rv; | ||
637 | ctx->error_depth = i; | ||
638 | ctx->current_cert = x; | ||
639 | if (!ctx->verify_cb(0,ctx)) | ||
640 | return 0; | ||
641 | } | ||
642 | } | ||
643 | } | ||
644 | } | ||
645 | return 1; | ||
646 | } | ||
647 | |||
648 | static int check_trust(X509_STORE_CTX *ctx) | ||
649 | { | ||
650 | #ifdef OPENSSL_NO_CHAIN_VERIFY | ||
651 | return 1; | ||
652 | #else | ||
653 | int i, ok; | ||
654 | X509 *x; | ||
655 | int (*cb)(int xok,X509_STORE_CTX *xctx); | ||
656 | cb=ctx->verify_cb; | ||
657 | /* For now just check the last certificate in the chain */ | ||
658 | i = sk_X509_num(ctx->chain) - 1; | ||
659 | x = sk_X509_value(ctx->chain, i); | ||
660 | ok = X509_check_trust(x, ctx->param->trust, 0); | ||
661 | if (ok == X509_TRUST_TRUSTED) | ||
662 | return 1; | ||
663 | ctx->error_depth = i; | ||
664 | ctx->current_cert = x; | ||
665 | if (ok == X509_TRUST_REJECTED) | ||
666 | ctx->error = X509_V_ERR_CERT_REJECTED; | ||
667 | else | ||
668 | ctx->error = X509_V_ERR_CERT_UNTRUSTED; | ||
669 | ok = cb(0, ctx); | ||
670 | return ok; | ||
671 | #endif | ||
672 | } | ||
673 | |||
674 | static int check_revocation(X509_STORE_CTX *ctx) | ||
675 | { | ||
676 | int i, last, ok; | ||
677 | if (!(ctx->param->flags & X509_V_FLAG_CRL_CHECK)) | ||
678 | return 1; | ||
679 | if (ctx->param->flags & X509_V_FLAG_CRL_CHECK_ALL) | ||
680 | last = sk_X509_num(ctx->chain) - 1; | ||
681 | else | ||
682 | { | ||
683 | /* If checking CRL paths this isn't the EE certificate */ | ||
684 | if (ctx->parent) | ||
685 | return 1; | ||
686 | last = 0; | ||
687 | } | ||
688 | for(i = 0; i <= last; i++) | ||
689 | { | ||
690 | ctx->error_depth = i; | ||
691 | ok = check_cert(ctx); | ||
692 | if (!ok) return ok; | ||
693 | } | ||
694 | return 1; | ||
695 | } | ||
696 | |||
697 | static int check_cert(X509_STORE_CTX *ctx) | ||
698 | { | ||
699 | X509_CRL *crl = NULL, *dcrl = NULL; | ||
700 | X509 *x; | ||
701 | int ok, cnum; | ||
702 | cnum = ctx->error_depth; | ||
703 | x = sk_X509_value(ctx->chain, cnum); | ||
704 | ctx->current_cert = x; | ||
705 | ctx->current_issuer = NULL; | ||
706 | ctx->current_crl_score = 0; | ||
707 | ctx->current_reasons = 0; | ||
708 | while (ctx->current_reasons != CRLDP_ALL_REASONS) | ||
709 | { | ||
710 | /* Try to retrieve relevant CRL */ | ||
711 | if (ctx->get_crl) | ||
712 | ok = ctx->get_crl(ctx, &crl, x); | ||
713 | else | ||
714 | ok = get_crl_delta(ctx, &crl, &dcrl, x); | ||
715 | /* If error looking up CRL, nothing we can do except | ||
716 | * notify callback | ||
717 | */ | ||
718 | if(!ok) | ||
719 | { | ||
720 | ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL; | ||
721 | ok = ctx->verify_cb(0, ctx); | ||
722 | goto err; | ||
723 | } | ||
724 | ctx->current_crl = crl; | ||
725 | ok = ctx->check_crl(ctx, crl); | ||
726 | if (!ok) | ||
727 | goto err; | ||
728 | |||
729 | if (dcrl) | ||
730 | { | ||
731 | ok = ctx->check_crl(ctx, dcrl); | ||
732 | if (!ok) | ||
733 | goto err; | ||
734 | ok = ctx->cert_crl(ctx, dcrl, x); | ||
735 | if (!ok) | ||
736 | goto err; | ||
737 | } | ||
738 | else | ||
739 | ok = 1; | ||
740 | |||
741 | /* Don't look in full CRL if delta reason is removefromCRL */ | ||
742 | if (ok != 2) | ||
743 | { | ||
744 | ok = ctx->cert_crl(ctx, crl, x); | ||
745 | if (!ok) | ||
746 | goto err; | ||
747 | } | ||
748 | |||
749 | X509_CRL_free(crl); | ||
750 | X509_CRL_free(dcrl); | ||
751 | crl = NULL; | ||
752 | dcrl = NULL; | ||
753 | } | ||
754 | err: | ||
755 | X509_CRL_free(crl); | ||
756 | X509_CRL_free(dcrl); | ||
757 | |||
758 | ctx->current_crl = NULL; | ||
759 | return ok; | ||
760 | |||
761 | } | ||
762 | |||
763 | /* Check CRL times against values in X509_STORE_CTX */ | ||
764 | |||
765 | static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify) | ||
766 | { | ||
767 | time_t *ptime; | ||
768 | int i; | ||
769 | if (notify) | ||
770 | ctx->current_crl = crl; | ||
771 | if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME) | ||
772 | ptime = &ctx->param->check_time; | ||
773 | else | ||
774 | ptime = NULL; | ||
775 | |||
776 | i=X509_cmp_time(X509_CRL_get_lastUpdate(crl), ptime); | ||
777 | if (i == 0) | ||
778 | { | ||
779 | if (!notify) | ||
780 | return 0; | ||
781 | ctx->error=X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD; | ||
782 | if (!ctx->verify_cb(0, ctx)) | ||
783 | return 0; | ||
784 | } | ||
785 | |||
786 | if (i > 0) | ||
787 | { | ||
788 | if (!notify) | ||
789 | return 0; | ||
790 | ctx->error=X509_V_ERR_CRL_NOT_YET_VALID; | ||
791 | if (!ctx->verify_cb(0, ctx)) | ||
792 | return 0; | ||
793 | } | ||
794 | |||
795 | if(X509_CRL_get_nextUpdate(crl)) | ||
796 | { | ||
797 | i=X509_cmp_time(X509_CRL_get_nextUpdate(crl), ptime); | ||
798 | |||
799 | if (i == 0) | ||
800 | { | ||
801 | if (!notify) | ||
802 | return 0; | ||
803 | ctx->error=X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD; | ||
804 | if (!ctx->verify_cb(0, ctx)) | ||
805 | return 0; | ||
806 | } | ||
807 | /* Ignore expiry of base CRL is delta is valid */ | ||
808 | if ((i < 0) && !(ctx->current_crl_score & CRL_SCORE_TIME_DELTA)) | ||
809 | { | ||
810 | if (!notify) | ||
811 | return 0; | ||
812 | ctx->error=X509_V_ERR_CRL_HAS_EXPIRED; | ||
813 | if (!ctx->verify_cb(0, ctx)) | ||
814 | return 0; | ||
815 | } | ||
816 | } | ||
817 | |||
818 | if (notify) | ||
819 | ctx->current_crl = NULL; | ||
820 | |||
821 | return 1; | ||
822 | } | ||
823 | |||
824 | static int get_crl_sk(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509_CRL **pdcrl, | ||
825 | X509 **pissuer, int *pscore, unsigned int *preasons, | ||
826 | STACK_OF(X509_CRL) *crls) | ||
827 | { | ||
828 | int i, crl_score, best_score = *pscore; | ||
829 | unsigned int reasons, best_reasons = 0; | ||
830 | X509 *x = ctx->current_cert; | ||
831 | X509_CRL *crl, *best_crl = NULL; | ||
832 | X509 *crl_issuer = NULL, *best_crl_issuer = NULL; | ||
833 | |||
834 | for (i = 0; i < sk_X509_CRL_num(crls); i++) | ||
835 | { | ||
836 | crl = sk_X509_CRL_value(crls, i); | ||
837 | reasons = *preasons; | ||
838 | crl_score = get_crl_score(ctx, &crl_issuer, &reasons, crl, x); | ||
839 | |||
840 | if (crl_score > best_score) | ||
841 | { | ||
842 | best_crl = crl; | ||
843 | best_crl_issuer = crl_issuer; | ||
844 | best_score = crl_score; | ||
845 | best_reasons = reasons; | ||
846 | } | ||
847 | } | ||
848 | |||
849 | if (best_crl) | ||
850 | { | ||
851 | if (*pcrl) | ||
852 | X509_CRL_free(*pcrl); | ||
853 | *pcrl = best_crl; | ||
854 | *pissuer = best_crl_issuer; | ||
855 | *pscore = best_score; | ||
856 | *preasons = best_reasons; | ||
857 | CRYPTO_add(&best_crl->references, 1, CRYPTO_LOCK_X509_CRL); | ||
858 | if (*pdcrl) | ||
859 | { | ||
860 | X509_CRL_free(*pdcrl); | ||
861 | *pdcrl = NULL; | ||
862 | } | ||
863 | get_delta_sk(ctx, pdcrl, pscore, best_crl, crls); | ||
864 | } | ||
865 | |||
866 | if (best_score >= CRL_SCORE_VALID) | ||
867 | return 1; | ||
868 | |||
869 | return 0; | ||
870 | } | ||
871 | |||
872 | /* Compare two CRL extensions for delta checking purposes. They should be | ||
873 | * both present or both absent. If both present all fields must be identical. | ||
874 | */ | ||
875 | |||
876 | static int crl_extension_match(X509_CRL *a, X509_CRL *b, int nid) | ||
877 | { | ||
878 | ASN1_OCTET_STRING *exta, *extb; | ||
879 | int i; | ||
880 | i = X509_CRL_get_ext_by_NID(a, nid, 0); | ||
881 | if (i >= 0) | ||
882 | { | ||
883 | /* Can't have multiple occurrences */ | ||
884 | if (X509_CRL_get_ext_by_NID(a, nid, i) != -1) | ||
885 | return 0; | ||
886 | exta = X509_EXTENSION_get_data(X509_CRL_get_ext(a, i)); | ||
887 | } | ||
888 | else | ||
889 | exta = NULL; | ||
890 | |||
891 | i = X509_CRL_get_ext_by_NID(b, nid, 0); | ||
892 | |||
893 | if (i >= 0) | ||
894 | { | ||
895 | |||
896 | if (X509_CRL_get_ext_by_NID(b, nid, i) != -1) | ||
897 | return 0; | ||
898 | extb = X509_EXTENSION_get_data(X509_CRL_get_ext(b, i)); | ||
899 | } | ||
900 | else | ||
901 | extb = NULL; | ||
902 | |||
903 | if (!exta && !extb) | ||
904 | return 1; | ||
905 | |||
906 | if (!exta || !extb) | ||
907 | return 0; | ||
908 | |||
909 | |||
910 | if (ASN1_OCTET_STRING_cmp(exta, extb)) | ||
911 | return 0; | ||
912 | |||
913 | return 1; | ||
914 | } | ||
915 | |||
916 | /* See if a base and delta are compatible */ | ||
917 | |||
918 | static int check_delta_base(X509_CRL *delta, X509_CRL *base) | ||
919 | { | ||
920 | /* Delta CRL must be a delta */ | ||
921 | if (!delta->base_crl_number) | ||
922 | return 0; | ||
923 | /* Base must have a CRL number */ | ||
924 | if (!base->crl_number) | ||
925 | return 0; | ||
926 | /* Issuer names must match */ | ||
927 | if (X509_NAME_cmp(X509_CRL_get_issuer(base), | ||
928 | X509_CRL_get_issuer(delta))) | ||
929 | return 0; | ||
930 | /* AKID and IDP must match */ | ||
931 | if (!crl_extension_match(delta, base, NID_authority_key_identifier)) | ||
932 | return 0; | ||
933 | if (!crl_extension_match(delta, base, NID_issuing_distribution_point)) | ||
934 | return 0; | ||
935 | /* Delta CRL base number must not exceed Full CRL number. */ | ||
936 | if (ASN1_INTEGER_cmp(delta->base_crl_number, base->crl_number) > 0) | ||
937 | return 0; | ||
938 | /* Delta CRL number must exceed full CRL number */ | ||
939 | if (ASN1_INTEGER_cmp(delta->crl_number, base->crl_number) > 0) | ||
940 | return 1; | ||
941 | return 0; | ||
942 | } | ||
943 | |||
944 | /* For a given base CRL find a delta... maybe extend to delta scoring | ||
945 | * or retrieve a chain of deltas... | ||
946 | */ | ||
947 | |||
948 | static void get_delta_sk(X509_STORE_CTX *ctx, X509_CRL **dcrl, int *pscore, | ||
949 | X509_CRL *base, STACK_OF(X509_CRL) *crls) | ||
950 | { | ||
951 | X509_CRL *delta; | ||
952 | int i; | ||
953 | if (!(ctx->param->flags & X509_V_FLAG_USE_DELTAS)) | ||
954 | return; | ||
955 | if (!((ctx->current_cert->ex_flags | base->flags) & EXFLAG_FRESHEST)) | ||
956 | return; | ||
957 | for (i = 0; i < sk_X509_CRL_num(crls); i++) | ||
958 | { | ||
959 | delta = sk_X509_CRL_value(crls, i); | ||
960 | if (check_delta_base(delta, base)) | ||
961 | { | ||
962 | if (check_crl_time(ctx, delta, 0)) | ||
963 | *pscore |= CRL_SCORE_TIME_DELTA; | ||
964 | CRYPTO_add(&delta->references, 1, CRYPTO_LOCK_X509_CRL); | ||
965 | *dcrl = delta; | ||
966 | return; | ||
967 | } | ||
968 | } | ||
969 | *dcrl = NULL; | ||
970 | } | ||
971 | |||
972 | /* For a given CRL return how suitable it is for the supplied certificate 'x'. | ||
973 | * The return value is a mask of several criteria. | ||
974 | * If the issuer is not the certificate issuer this is returned in *pissuer. | ||
975 | * The reasons mask is also used to determine if the CRL is suitable: if | ||
976 | * no new reasons the CRL is rejected, otherwise reasons is updated. | ||
977 | */ | ||
978 | |||
979 | static int get_crl_score(X509_STORE_CTX *ctx, X509 **pissuer, | ||
980 | unsigned int *preasons, | ||
981 | X509_CRL *crl, X509 *x) | ||
982 | { | ||
983 | |||
984 | int crl_score = 0; | ||
985 | unsigned int tmp_reasons = *preasons, crl_reasons; | ||
986 | |||
987 | /* First see if we can reject CRL straight away */ | ||
988 | |||
989 | /* Invalid IDP cannot be processed */ | ||
990 | if (crl->idp_flags & IDP_INVALID) | ||
991 | return 0; | ||
992 | /* Reason codes or indirect CRLs need extended CRL support */ | ||
993 | if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT)) | ||
994 | { | ||
995 | if (crl->idp_flags & (IDP_INDIRECT | IDP_REASONS)) | ||
996 | return 0; | ||
997 | } | ||
998 | else if (crl->idp_flags & IDP_REASONS) | ||
999 | { | ||
1000 | /* If no new reasons reject */ | ||
1001 | if (!(crl->idp_reasons & ~tmp_reasons)) | ||
1002 | return 0; | ||
1003 | } | ||
1004 | /* Don't process deltas at this stage */ | ||
1005 | else if (crl->base_crl_number) | ||
1006 | return 0; | ||
1007 | /* If issuer name doesn't match certificate need indirect CRL */ | ||
1008 | if (X509_NAME_cmp(X509_get_issuer_name(x), X509_CRL_get_issuer(crl))) | ||
1009 | { | ||
1010 | if (!(crl->idp_flags & IDP_INDIRECT)) | ||
1011 | return 0; | ||
1012 | } | ||
1013 | else | ||
1014 | crl_score |= CRL_SCORE_ISSUER_NAME; | ||
1015 | |||
1016 | if (!(crl->flags & EXFLAG_CRITICAL)) | ||
1017 | crl_score |= CRL_SCORE_NOCRITICAL; | ||
1018 | |||
1019 | /* Check expiry */ | ||
1020 | if (check_crl_time(ctx, crl, 0)) | ||
1021 | crl_score |= CRL_SCORE_TIME; | ||
1022 | |||
1023 | /* Check authority key ID and locate certificate issuer */ | ||
1024 | crl_akid_check(ctx, crl, pissuer, &crl_score); | ||
1025 | |||
1026 | /* If we can't locate certificate issuer at this point forget it */ | ||
1027 | |||
1028 | if (!(crl_score & CRL_SCORE_AKID)) | ||
1029 | return 0; | ||
1030 | |||
1031 | /* Check cert for matching CRL distribution points */ | ||
1032 | |||
1033 | if (crl_crldp_check(x, crl, crl_score, &crl_reasons)) | ||
1034 | { | ||
1035 | /* If no new reasons reject */ | ||
1036 | if (!(crl_reasons & ~tmp_reasons)) | ||
1037 | return 0; | ||
1038 | tmp_reasons |= crl_reasons; | ||
1039 | crl_score |= CRL_SCORE_SCOPE; | ||
1040 | } | ||
1041 | |||
1042 | *preasons = tmp_reasons; | ||
1043 | |||
1044 | return crl_score; | ||
1045 | |||
1046 | } | ||
1047 | |||
1048 | static void crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl, | ||
1049 | X509 **pissuer, int *pcrl_score) | ||
1050 | { | ||
1051 | X509 *crl_issuer = NULL; | ||
1052 | X509_NAME *cnm = X509_CRL_get_issuer(crl); | ||
1053 | int cidx = ctx->error_depth; | ||
1054 | int i; | ||
1055 | |||
1056 | if (cidx != sk_X509_num(ctx->chain) - 1) | ||
1057 | cidx++; | ||
1058 | |||
1059 | crl_issuer = sk_X509_value(ctx->chain, cidx); | ||
1060 | |||
1061 | if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) | ||
1062 | { | ||
1063 | if (*pcrl_score & CRL_SCORE_ISSUER_NAME) | ||
1064 | { | ||
1065 | *pcrl_score |= CRL_SCORE_AKID|CRL_SCORE_ISSUER_CERT; | ||
1066 | *pissuer = crl_issuer; | ||
1067 | return; | ||
1068 | } | ||
1069 | } | ||
1070 | |||
1071 | for (cidx++; cidx < sk_X509_num(ctx->chain); cidx++) | ||
1072 | { | ||
1073 | crl_issuer = sk_X509_value(ctx->chain, cidx); | ||
1074 | if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm)) | ||
1075 | continue; | ||
1076 | if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) | ||
1077 | { | ||
1078 | *pcrl_score |= CRL_SCORE_AKID|CRL_SCORE_SAME_PATH; | ||
1079 | *pissuer = crl_issuer; | ||
1080 | return; | ||
1081 | } | ||
1082 | } | ||
1083 | |||
1084 | /* Anything else needs extended CRL support */ | ||
1085 | |||
1086 | if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT)) | ||
1087 | return; | ||
1088 | |||
1089 | /* Otherwise the CRL issuer is not on the path. Look for it in the | ||
1090 | * set of untrusted certificates. | ||
1091 | */ | ||
1092 | for (i = 0; i < sk_X509_num(ctx->untrusted); i++) | ||
1093 | { | ||
1094 | crl_issuer = sk_X509_value(ctx->untrusted, i); | ||
1095 | if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm)) | ||
1096 | continue; | ||
1097 | if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) | ||
1098 | { | ||
1099 | *pissuer = crl_issuer; | ||
1100 | *pcrl_score |= CRL_SCORE_AKID; | ||
1101 | return; | ||
1102 | } | ||
1103 | } | ||
1104 | } | ||
1105 | |||
1106 | /* Check the path of a CRL issuer certificate. This creates a new | ||
1107 | * X509_STORE_CTX and populates it with most of the parameters from the | ||
1108 | * parent. This could be optimised somewhat since a lot of path checking | ||
1109 | * will be duplicated by the parent, but this will rarely be used in | ||
1110 | * practice. | ||
1111 | */ | ||
1112 | |||
1113 | static int check_crl_path(X509_STORE_CTX *ctx, X509 *x) | ||
1114 | { | ||
1115 | X509_STORE_CTX crl_ctx; | ||
1116 | int ret; | ||
1117 | /* Don't allow recursive CRL path validation */ | ||
1118 | if (ctx->parent) | ||
1119 | return 0; | ||
1120 | if (!X509_STORE_CTX_init(&crl_ctx, ctx->ctx, x, ctx->untrusted)) | ||
1121 | return -1; | ||
1122 | |||
1123 | crl_ctx.crls = ctx->crls; | ||
1124 | /* Copy verify params across */ | ||
1125 | X509_STORE_CTX_set0_param(&crl_ctx, ctx->param); | ||
1126 | |||
1127 | crl_ctx.parent = ctx; | ||
1128 | crl_ctx.verify_cb = ctx->verify_cb; | ||
1129 | |||
1130 | /* Verify CRL issuer */ | ||
1131 | ret = X509_verify_cert(&crl_ctx); | ||
1132 | |||
1133 | if (ret <= 0) | ||
1134 | goto err; | ||
1135 | |||
1136 | /* Check chain is acceptable */ | ||
1137 | |||
1138 | ret = check_crl_chain(ctx, ctx->chain, crl_ctx.chain); | ||
1139 | err: | ||
1140 | X509_STORE_CTX_cleanup(&crl_ctx); | ||
1141 | return ret; | ||
1142 | } | ||
1143 | |||
1144 | /* RFC3280 says nothing about the relationship between CRL path | ||
1145 | * and certificate path, which could lead to situations where a | ||
1146 | * certificate could be revoked or validated by a CA not authorised | ||
1147 | * to do so. RFC5280 is more strict and states that the two paths must | ||
1148 | * end in the same trust anchor, though some discussions remain... | ||
1149 | * until this is resolved we use the RFC5280 version | ||
1150 | */ | ||
1151 | |||
1152 | static int check_crl_chain(X509_STORE_CTX *ctx, | ||
1153 | STACK_OF(X509) *cert_path, | ||
1154 | STACK_OF(X509) *crl_path) | ||
1155 | { | ||
1156 | X509 *cert_ta, *crl_ta; | ||
1157 | cert_ta = sk_X509_value(cert_path, sk_X509_num(cert_path) - 1); | ||
1158 | crl_ta = sk_X509_value(crl_path, sk_X509_num(crl_path) - 1); | ||
1159 | if (!X509_cmp(cert_ta, crl_ta)) | ||
1160 | return 1; | ||
1161 | return 0; | ||
1162 | } | ||
1163 | |||
1164 | /* Check for match between two dist point names: three separate cases. | ||
1165 | * 1. Both are relative names and compare X509_NAME types. | ||
1166 | * 2. One full, one relative. Compare X509_NAME to GENERAL_NAMES. | ||
1167 | * 3. Both are full names and compare two GENERAL_NAMES. | ||
1168 | * 4. One is NULL: automatic match. | ||
1169 | */ | ||
1170 | |||
1171 | |||
1172 | static int idp_check_dp(DIST_POINT_NAME *a, DIST_POINT_NAME *b) | ||
1173 | { | ||
1174 | X509_NAME *nm = NULL; | ||
1175 | GENERAL_NAMES *gens = NULL; | ||
1176 | GENERAL_NAME *gena, *genb; | ||
1177 | int i, j; | ||
1178 | if (!a || !b) | ||
1179 | return 1; | ||
1180 | if (a->type == 1) | ||
1181 | { | ||
1182 | if (!a->dpname) | ||
1183 | return 0; | ||
1184 | /* Case 1: two X509_NAME */ | ||
1185 | if (b->type == 1) | ||
1186 | { | ||
1187 | if (!b->dpname) | ||
1188 | return 0; | ||
1189 | if (!X509_NAME_cmp(a->dpname, b->dpname)) | ||
1190 | return 1; | ||
1191 | else | ||
1192 | return 0; | ||
1193 | } | ||
1194 | /* Case 2: set name and GENERAL_NAMES appropriately */ | ||
1195 | nm = a->dpname; | ||
1196 | gens = b->name.fullname; | ||
1197 | } | ||
1198 | else if (b->type == 1) | ||
1199 | { | ||
1200 | if (!b->dpname) | ||
1201 | return 0; | ||
1202 | /* Case 2: set name and GENERAL_NAMES appropriately */ | ||
1203 | gens = a->name.fullname; | ||
1204 | nm = b->dpname; | ||
1205 | } | ||
1206 | |||
1207 | /* Handle case 2 with one GENERAL_NAMES and one X509_NAME */ | ||
1208 | if (nm) | ||
1209 | { | ||
1210 | for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) | ||
1211 | { | ||
1212 | gena = sk_GENERAL_NAME_value(gens, i); | ||
1213 | if (gena->type != GEN_DIRNAME) | ||
1214 | continue; | ||
1215 | if (!X509_NAME_cmp(nm, gena->d.directoryName)) | ||
1216 | return 1; | ||
1217 | } | ||
1218 | return 0; | ||
1219 | } | ||
1220 | |||
1221 | /* Else case 3: two GENERAL_NAMES */ | ||
1222 | |||
1223 | for (i = 0; i < sk_GENERAL_NAME_num(a->name.fullname); i++) | ||
1224 | { | ||
1225 | gena = sk_GENERAL_NAME_value(a->name.fullname, i); | ||
1226 | for (j = 0; j < sk_GENERAL_NAME_num(b->name.fullname); j++) | ||
1227 | { | ||
1228 | genb = sk_GENERAL_NAME_value(b->name.fullname, j); | ||
1229 | if (!GENERAL_NAME_cmp(gena, genb)) | ||
1230 | return 1; | ||
1231 | } | ||
1232 | } | ||
1233 | |||
1234 | return 0; | ||
1235 | |||
1236 | } | ||
1237 | |||
1238 | static int crldp_check_crlissuer(DIST_POINT *dp, X509_CRL *crl, int crl_score) | ||
1239 | { | ||
1240 | int i; | ||
1241 | X509_NAME *nm = X509_CRL_get_issuer(crl); | ||
1242 | /* If no CRLissuer return is successful iff don't need a match */ | ||
1243 | if (!dp->CRLissuer) | ||
1244 | return !!(crl_score & CRL_SCORE_ISSUER_NAME); | ||
1245 | for (i = 0; i < sk_GENERAL_NAME_num(dp->CRLissuer); i++) | ||
1246 | { | ||
1247 | GENERAL_NAME *gen = sk_GENERAL_NAME_value(dp->CRLissuer, i); | ||
1248 | if (gen->type != GEN_DIRNAME) | ||
1249 | continue; | ||
1250 | if (!X509_NAME_cmp(gen->d.directoryName, nm)) | ||
1251 | return 1; | ||
1252 | } | ||
1253 | return 0; | ||
1254 | } | ||
1255 | |||
1256 | /* Check CRLDP and IDP */ | ||
1257 | |||
1258 | static int crl_crldp_check(X509 *x, X509_CRL *crl, int crl_score, | ||
1259 | unsigned int *preasons) | ||
1260 | { | ||
1261 | int i; | ||
1262 | if (crl->idp_flags & IDP_ONLYATTR) | ||
1263 | return 0; | ||
1264 | if (x->ex_flags & EXFLAG_CA) | ||
1265 | { | ||
1266 | if (crl->idp_flags & IDP_ONLYUSER) | ||
1267 | return 0; | ||
1268 | } | ||
1269 | else | ||
1270 | { | ||
1271 | if (crl->idp_flags & IDP_ONLYCA) | ||
1272 | return 0; | ||
1273 | } | ||
1274 | *preasons = crl->idp_reasons; | ||
1275 | for (i = 0; i < sk_DIST_POINT_num(x->crldp); i++) | ||
1276 | { | ||
1277 | DIST_POINT *dp = sk_DIST_POINT_value(x->crldp, i); | ||
1278 | if (crldp_check_crlissuer(dp, crl, crl_score)) | ||
1279 | { | ||
1280 | if (!crl->idp || | ||
1281 | idp_check_dp(dp->distpoint, crl->idp->distpoint)) | ||
1282 | { | ||
1283 | *preasons &= dp->dp_reasons; | ||
1284 | return 1; | ||
1285 | } | ||
1286 | } | ||
1287 | } | ||
1288 | if ((!crl->idp || !crl->idp->distpoint) && (crl_score & CRL_SCORE_ISSUER_NAME)) | ||
1289 | return 1; | ||
1290 | return 0; | ||
1291 | } | ||
1292 | |||
1293 | /* Retrieve CRL corresponding to current certificate. | ||
1294 | * If deltas enabled try to find a delta CRL too | ||
1295 | */ | ||
1296 | |||
1297 | static int get_crl_delta(X509_STORE_CTX *ctx, | ||
1298 | X509_CRL **pcrl, X509_CRL **pdcrl, X509 *x) | ||
1299 | { | ||
1300 | int ok; | ||
1301 | X509 *issuer = NULL; | ||
1302 | int crl_score = 0; | ||
1303 | unsigned int reasons; | ||
1304 | X509_CRL *crl = NULL, *dcrl = NULL; | ||
1305 | STACK_OF(X509_CRL) *skcrl; | ||
1306 | X509_NAME *nm = X509_get_issuer_name(x); | ||
1307 | reasons = ctx->current_reasons; | ||
1308 | ok = get_crl_sk(ctx, &crl, &dcrl, | ||
1309 | &issuer, &crl_score, &reasons, ctx->crls); | ||
1310 | |||
1311 | if (ok) | ||
1312 | goto done; | ||
1313 | |||
1314 | /* Lookup CRLs from store */ | ||
1315 | |||
1316 | skcrl = ctx->lookup_crls(ctx, nm); | ||
1317 | |||
1318 | /* If no CRLs found and a near match from get_crl_sk use that */ | ||
1319 | if (!skcrl && crl) | ||
1320 | goto done; | ||
1321 | |||
1322 | get_crl_sk(ctx, &crl, &dcrl, &issuer, &crl_score, &reasons, skcrl); | ||
1323 | |||
1324 | sk_X509_CRL_pop_free(skcrl, X509_CRL_free); | ||
1325 | |||
1326 | done: | ||
1327 | |||
1328 | /* If we got any kind of CRL use it and return success */ | ||
1329 | if (crl) | ||
1330 | { | ||
1331 | ctx->current_issuer = issuer; | ||
1332 | ctx->current_crl_score = crl_score; | ||
1333 | ctx->current_reasons = reasons; | ||
1334 | *pcrl = crl; | ||
1335 | *pdcrl = dcrl; | ||
1336 | return 1; | ||
1337 | } | ||
1338 | |||
1339 | return 0; | ||
1340 | } | ||
1341 | |||
1342 | /* Check CRL validity */ | ||
1343 | static int check_crl(X509_STORE_CTX *ctx, X509_CRL *crl) | ||
1344 | { | ||
1345 | X509 *issuer = NULL; | ||
1346 | EVP_PKEY *ikey = NULL; | ||
1347 | int ok = 0, chnum, cnum; | ||
1348 | cnum = ctx->error_depth; | ||
1349 | chnum = sk_X509_num(ctx->chain) - 1; | ||
1350 | /* if we have an alternative CRL issuer cert use that */ | ||
1351 | if (ctx->current_issuer) | ||
1352 | issuer = ctx->current_issuer; | ||
1353 | |||
1354 | /* Else find CRL issuer: if not last certificate then issuer | ||
1355 | * is next certificate in chain. | ||
1356 | */ | ||
1357 | else if (cnum < chnum) | ||
1358 | issuer = sk_X509_value(ctx->chain, cnum + 1); | ||
1359 | else | ||
1360 | { | ||
1361 | issuer = sk_X509_value(ctx->chain, chnum); | ||
1362 | /* If not self signed, can't check signature */ | ||
1363 | if(!ctx->check_issued(ctx, issuer, issuer)) | ||
1364 | { | ||
1365 | ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER; | ||
1366 | ok = ctx->verify_cb(0, ctx); | ||
1367 | if(!ok) goto err; | ||
1368 | } | ||
1369 | } | ||
1370 | |||
1371 | if(issuer) | ||
1372 | { | ||
1373 | /* Skip most tests for deltas because they have already | ||
1374 | * been done | ||
1375 | */ | ||
1376 | if (!crl->base_crl_number) | ||
1377 | { | ||
1378 | /* Check for cRLSign bit if keyUsage present */ | ||
1379 | if ((issuer->ex_flags & EXFLAG_KUSAGE) && | ||
1380 | !(issuer->ex_kusage & KU_CRL_SIGN)) | ||
1381 | { | ||
1382 | ctx->error = X509_V_ERR_KEYUSAGE_NO_CRL_SIGN; | ||
1383 | ok = ctx->verify_cb(0, ctx); | ||
1384 | if(!ok) goto err; | ||
1385 | } | ||
1386 | |||
1387 | if (!(ctx->current_crl_score & CRL_SCORE_SCOPE)) | ||
1388 | { | ||
1389 | ctx->error = X509_V_ERR_DIFFERENT_CRL_SCOPE; | ||
1390 | ok = ctx->verify_cb(0, ctx); | ||
1391 | if(!ok) goto err; | ||
1392 | } | ||
1393 | |||
1394 | if (!(ctx->current_crl_score & CRL_SCORE_SAME_PATH)) | ||
1395 | { | ||
1396 | if (check_crl_path(ctx, ctx->current_issuer) <= 0) | ||
1397 | { | ||
1398 | ctx->error = X509_V_ERR_CRL_PATH_VALIDATION_ERROR; | ||
1399 | ok = ctx->verify_cb(0, ctx); | ||
1400 | if(!ok) goto err; | ||
1401 | } | ||
1402 | } | ||
1403 | |||
1404 | if (crl->idp_flags & IDP_INVALID) | ||
1405 | { | ||
1406 | ctx->error = X509_V_ERR_INVALID_EXTENSION; | ||
1407 | ok = ctx->verify_cb(0, ctx); | ||
1408 | if(!ok) goto err; | ||
1409 | } | ||
1410 | |||
1411 | |||
1412 | } | ||
1413 | |||
1414 | if (!(ctx->current_crl_score & CRL_SCORE_TIME)) | ||
1415 | { | ||
1416 | ok = check_crl_time(ctx, crl, 1); | ||
1417 | if (!ok) | ||
1418 | goto err; | ||
1419 | } | ||
1420 | |||
1421 | /* Attempt to get issuer certificate public key */ | ||
1422 | ikey = X509_get_pubkey(issuer); | ||
1423 | |||
1424 | if(!ikey) | ||
1425 | { | ||
1426 | ctx->error=X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY; | ||
1427 | ok = ctx->verify_cb(0, ctx); | ||
1428 | if (!ok) goto err; | ||
1429 | } | ||
1430 | else | ||
1431 | { | ||
1432 | /* Verify CRL signature */ | ||
1433 | if(X509_CRL_verify(crl, ikey) <= 0) | ||
1434 | { | ||
1435 | ctx->error=X509_V_ERR_CRL_SIGNATURE_FAILURE; | ||
1436 | ok = ctx->verify_cb(0, ctx); | ||
1437 | if (!ok) goto err; | ||
1438 | } | ||
1439 | } | ||
1440 | } | ||
1441 | |||
1442 | ok = 1; | ||
1443 | |||
1444 | err: | ||
1445 | EVP_PKEY_free(ikey); | ||
1446 | return ok; | ||
1447 | } | ||
1448 | |||
1449 | /* Check certificate against CRL */ | ||
1450 | static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x) | ||
1451 | { | ||
1452 | int ok; | ||
1453 | X509_REVOKED *rev; | ||
1454 | /* The rules changed for this... previously if a CRL contained | ||
1455 | * unhandled critical extensions it could still be used to indicate | ||
1456 | * a certificate was revoked. This has since been changed since | ||
1457 | * critical extension can change the meaning of CRL entries. | ||
1458 | */ | ||
1459 | if (crl->flags & EXFLAG_CRITICAL) | ||
1460 | { | ||
1461 | if (ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL) | ||
1462 | return 1; | ||
1463 | ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION; | ||
1464 | ok = ctx->verify_cb(0, ctx); | ||
1465 | if(!ok) | ||
1466 | return 0; | ||
1467 | } | ||
1468 | /* Look for serial number of certificate in CRL | ||
1469 | * If found make sure reason is not removeFromCRL. | ||
1470 | */ | ||
1471 | if (X509_CRL_get0_by_cert(crl, &rev, x)) | ||
1472 | { | ||
1473 | if (rev->reason == CRL_REASON_REMOVE_FROM_CRL) | ||
1474 | return 2; | ||
1475 | ctx->error = X509_V_ERR_CERT_REVOKED; | ||
1476 | ok = ctx->verify_cb(0, ctx); | ||
1477 | if (!ok) | ||
1478 | return 0; | ||
1479 | } | ||
1480 | |||
1481 | return 1; | ||
1482 | } | ||
1483 | |||
1484 | static int check_policy(X509_STORE_CTX *ctx) | ||
1485 | { | ||
1486 | int ret; | ||
1487 | if (ctx->parent) | ||
1488 | return 1; | ||
1489 | ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain, | ||
1490 | ctx->param->policies, ctx->param->flags); | ||
1491 | if (ret == 0) | ||
1492 | { | ||
1493 | X509err(X509_F_CHECK_POLICY,ERR_R_MALLOC_FAILURE); | ||
1494 | return 0; | ||
1495 | } | ||
1496 | /* Invalid or inconsistent extensions */ | ||
1497 | if (ret == -1) | ||
1498 | { | ||
1499 | /* Locate certificates with bad extensions and notify | ||
1500 | * callback. | ||
1501 | */ | ||
1502 | X509 *x; | ||
1503 | int i; | ||
1504 | for (i = 1; i < sk_X509_num(ctx->chain); i++) | ||
1505 | { | ||
1506 | x = sk_X509_value(ctx->chain, i); | ||
1507 | if (!(x->ex_flags & EXFLAG_INVALID_POLICY)) | ||
1508 | continue; | ||
1509 | ctx->current_cert = x; | ||
1510 | ctx->error = X509_V_ERR_INVALID_POLICY_EXTENSION; | ||
1511 | if(!ctx->verify_cb(0, ctx)) | ||
1512 | return 0; | ||
1513 | } | ||
1514 | return 1; | ||
1515 | } | ||
1516 | if (ret == -2) | ||
1517 | { | ||
1518 | ctx->current_cert = NULL; | ||
1519 | ctx->error = X509_V_ERR_NO_EXPLICIT_POLICY; | ||
1520 | return ctx->verify_cb(0, ctx); | ||
1521 | } | ||
1522 | |||
1523 | if (ctx->param->flags & X509_V_FLAG_NOTIFY_POLICY) | ||
1524 | { | ||
1525 | ctx->current_cert = NULL; | ||
1526 | ctx->error = X509_V_OK; | ||
1527 | if (!ctx->verify_cb(2, ctx)) | ||
1528 | return 0; | ||
1529 | } | ||
1530 | |||
1531 | return 1; | ||
1532 | } | ||
1533 | |||
1534 | static int check_cert_time(X509_STORE_CTX *ctx, X509 *x) | ||
1535 | { | ||
1536 | time_t *ptime; | ||
1537 | int i; | ||
1538 | |||
1539 | if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME) | ||
1540 | ptime = &ctx->param->check_time; | ||
1541 | else | ||
1542 | ptime = NULL; | ||
1543 | |||
1544 | i=X509_cmp_time(X509_get_notBefore(x), ptime); | ||
1545 | if (i == 0) | ||
1546 | { | ||
1547 | ctx->error=X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD; | ||
1548 | ctx->current_cert=x; | ||
1549 | if (!ctx->verify_cb(0, ctx)) | ||
1550 | return 0; | ||
1551 | } | ||
1552 | |||
1553 | if (i > 0) | ||
1554 | { | ||
1555 | ctx->error=X509_V_ERR_CERT_NOT_YET_VALID; | ||
1556 | ctx->current_cert=x; | ||
1557 | if (!ctx->verify_cb(0, ctx)) | ||
1558 | return 0; | ||
1559 | } | ||
1560 | |||
1561 | i=X509_cmp_time(X509_get_notAfter(x), ptime); | ||
1562 | if (i == 0) | ||
1563 | { | ||
1564 | ctx->error=X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD; | ||
1565 | ctx->current_cert=x; | ||
1566 | if (!ctx->verify_cb(0, ctx)) | ||
1567 | return 0; | ||
1568 | } | ||
1569 | |||
1570 | if (i < 0) | ||
1571 | { | ||
1572 | ctx->error=X509_V_ERR_CERT_HAS_EXPIRED; | ||
1573 | ctx->current_cert=x; | ||
1574 | if (!ctx->verify_cb(0, ctx)) | ||
1575 | return 0; | ||
1576 | } | ||
1577 | |||
1578 | return 1; | ||
1579 | } | ||
1580 | |||
1581 | static int internal_verify(X509_STORE_CTX *ctx) | ||
1582 | { | ||
1583 | int ok=0,n; | ||
1584 | X509 *xs,*xi; | ||
1585 | EVP_PKEY *pkey=NULL; | ||
1586 | int (*cb)(int xok,X509_STORE_CTX *xctx); | ||
1587 | |||
1588 | cb=ctx->verify_cb; | ||
1589 | |||
1590 | n=sk_X509_num(ctx->chain); | ||
1591 | ctx->error_depth=n-1; | ||
1592 | n--; | ||
1593 | xi=sk_X509_value(ctx->chain,n); | ||
1594 | |||
1595 | if (ctx->check_issued(ctx, xi, xi)) | ||
1596 | xs=xi; | ||
1597 | else | ||
1598 | { | ||
1599 | if (n <= 0) | ||
1600 | { | ||
1601 | ctx->error=X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE; | ||
1602 | ctx->current_cert=xi; | ||
1603 | ok=cb(0,ctx); | ||
1604 | goto end; | ||
1605 | } | ||
1606 | else | ||
1607 | { | ||
1608 | n--; | ||
1609 | ctx->error_depth=n; | ||
1610 | xs=sk_X509_value(ctx->chain,n); | ||
1611 | } | ||
1612 | } | ||
1613 | |||
1614 | /* ctx->error=0; not needed */ | ||
1615 | while (n >= 0) | ||
1616 | { | ||
1617 | ctx->error_depth=n; | ||
1618 | |||
1619 | /* Skip signature check for self signed certificates unless | ||
1620 | * explicitly asked for. It doesn't add any security and | ||
1621 | * just wastes time. | ||
1622 | */ | ||
1623 | if (!xs->valid && (xs != xi || (ctx->param->flags & X509_V_FLAG_CHECK_SS_SIGNATURE))) | ||
1624 | { | ||
1625 | if ((pkey=X509_get_pubkey(xi)) == NULL) | ||
1626 | { | ||
1627 | ctx->error=X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY; | ||
1628 | ctx->current_cert=xi; | ||
1629 | ok=(*cb)(0,ctx); | ||
1630 | if (!ok) goto end; | ||
1631 | } | ||
1632 | else if (X509_verify(xs,pkey) <= 0) | ||
1633 | { | ||
1634 | ctx->error=X509_V_ERR_CERT_SIGNATURE_FAILURE; | ||
1635 | ctx->current_cert=xs; | ||
1636 | ok=(*cb)(0,ctx); | ||
1637 | if (!ok) | ||
1638 | { | ||
1639 | EVP_PKEY_free(pkey); | ||
1640 | goto end; | ||
1641 | } | ||
1642 | } | ||
1643 | EVP_PKEY_free(pkey); | ||
1644 | pkey=NULL; | ||
1645 | } | ||
1646 | |||
1647 | xs->valid = 1; | ||
1648 | |||
1649 | ok = check_cert_time(ctx, xs); | ||
1650 | if (!ok) | ||
1651 | goto end; | ||
1652 | |||
1653 | /* The last error (if any) is still in the error value */ | ||
1654 | ctx->current_issuer=xi; | ||
1655 | ctx->current_cert=xs; | ||
1656 | ok=(*cb)(1,ctx); | ||
1657 | if (!ok) goto end; | ||
1658 | |||
1659 | n--; | ||
1660 | if (n >= 0) | ||
1661 | { | ||
1662 | xi=xs; | ||
1663 | xs=sk_X509_value(ctx->chain,n); | ||
1664 | } | ||
1665 | } | ||
1666 | ok=1; | ||
1667 | end: | ||
1668 | return ok; | ||
1669 | } | ||
1670 | |||
1671 | int X509_cmp_current_time(const ASN1_TIME *ctm) | ||
1672 | { | ||
1673 | return X509_cmp_time(ctm, NULL); | ||
1674 | } | ||
1675 | |||
1676 | int X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time) | ||
1677 | { | ||
1678 | char *str; | ||
1679 | ASN1_TIME atm; | ||
1680 | long offset; | ||
1681 | char buff1[24],buff2[24],*p; | ||
1682 | int i,j; | ||
1683 | |||
1684 | p=buff1; | ||
1685 | i=ctm->length; | ||
1686 | str=(char *)ctm->data; | ||
1687 | if (ctm->type == V_ASN1_UTCTIME) | ||
1688 | { | ||
1689 | if ((i < 11) || (i > 17)) return 0; | ||
1690 | memcpy(p,str,10); | ||
1691 | p+=10; | ||
1692 | str+=10; | ||
1693 | } | ||
1694 | else | ||
1695 | { | ||
1696 | if (i < 13) return 0; | ||
1697 | memcpy(p,str,12); | ||
1698 | p+=12; | ||
1699 | str+=12; | ||
1700 | } | ||
1701 | |||
1702 | if ((*str == 'Z') || (*str == '-') || (*str == '+')) | ||
1703 | { *(p++)='0'; *(p++)='0'; } | ||
1704 | else | ||
1705 | { | ||
1706 | *(p++)= *(str++); | ||
1707 | *(p++)= *(str++); | ||
1708 | /* Skip any fractional seconds... */ | ||
1709 | if (*str == '.') | ||
1710 | { | ||
1711 | str++; | ||
1712 | while ((*str >= '0') && (*str <= '9')) str++; | ||
1713 | } | ||
1714 | |||
1715 | } | ||
1716 | *(p++)='Z'; | ||
1717 | *(p++)='\0'; | ||
1718 | |||
1719 | if (*str == 'Z') | ||
1720 | offset=0; | ||
1721 | else | ||
1722 | { | ||
1723 | if ((*str != '+') && (*str != '-')) | ||
1724 | return 0; | ||
1725 | offset=((str[1]-'0')*10+(str[2]-'0'))*60; | ||
1726 | offset+=(str[3]-'0')*10+(str[4]-'0'); | ||
1727 | if (*str == '-') | ||
1728 | offset= -offset; | ||
1729 | } | ||
1730 | atm.type=ctm->type; | ||
1731 | atm.flags = 0; | ||
1732 | atm.length=sizeof(buff2); | ||
1733 | atm.data=(unsigned char *)buff2; | ||
1734 | |||
1735 | if (X509_time_adj(&atm, offset*60, cmp_time) == NULL) | ||
1736 | return 0; | ||
1737 | |||
1738 | if (ctm->type == V_ASN1_UTCTIME) | ||
1739 | { | ||
1740 | i=(buff1[0]-'0')*10+(buff1[1]-'0'); | ||
1741 | if (i < 50) i+=100; /* cf. RFC 2459 */ | ||
1742 | j=(buff2[0]-'0')*10+(buff2[1]-'0'); | ||
1743 | if (j < 50) j+=100; | ||
1744 | |||
1745 | if (i < j) return -1; | ||
1746 | if (i > j) return 1; | ||
1747 | } | ||
1748 | i=strcmp(buff1,buff2); | ||
1749 | if (i == 0) /* wait a second then return younger :-) */ | ||
1750 | return -1; | ||
1751 | else | ||
1752 | return i; | ||
1753 | } | ||
1754 | |||
1755 | ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj) | ||
1756 | { | ||
1757 | return X509_time_adj(s, adj, NULL); | ||
1758 | } | ||
1759 | |||
1760 | ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec, time_t *in_tm) | ||
1761 | { | ||
1762 | return X509_time_adj_ex(s, 0, offset_sec, in_tm); | ||
1763 | } | ||
1764 | |||
1765 | ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, | ||
1766 | int offset_day, long offset_sec, time_t *in_tm) | ||
1767 | { | ||
1768 | time_t t; | ||
1769 | |||
1770 | if (in_tm) t = *in_tm; | ||
1771 | else time(&t); | ||
1772 | |||
1773 | if (s && !(s->flags & ASN1_STRING_FLAG_MSTRING)) | ||
1774 | { | ||
1775 | if (s->type == V_ASN1_UTCTIME) | ||
1776 | return ASN1_UTCTIME_adj(s,t, offset_day, offset_sec); | ||
1777 | if (s->type == V_ASN1_GENERALIZEDTIME) | ||
1778 | return ASN1_GENERALIZEDTIME_adj(s, t, offset_day, | ||
1779 | offset_sec); | ||
1780 | } | ||
1781 | return ASN1_TIME_adj(s, t, offset_day, offset_sec); | ||
1782 | } | ||
1783 | |||
1784 | int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain) | ||
1785 | { | ||
1786 | EVP_PKEY *ktmp=NULL,*ktmp2; | ||
1787 | int i,j; | ||
1788 | |||
1789 | if ((pkey != NULL) && !EVP_PKEY_missing_parameters(pkey)) return 1; | ||
1790 | |||
1791 | for (i=0; i<sk_X509_num(chain); i++) | ||
1792 | { | ||
1793 | ktmp=X509_get_pubkey(sk_X509_value(chain,i)); | ||
1794 | if (ktmp == NULL) | ||
1795 | { | ||
1796 | X509err(X509_F_X509_GET_PUBKEY_PARAMETERS,X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY); | ||
1797 | return 0; | ||
1798 | } | ||
1799 | if (!EVP_PKEY_missing_parameters(ktmp)) | ||
1800 | break; | ||
1801 | else | ||
1802 | { | ||
1803 | EVP_PKEY_free(ktmp); | ||
1804 | ktmp=NULL; | ||
1805 | } | ||
1806 | } | ||
1807 | if (ktmp == NULL) | ||
1808 | { | ||
1809 | X509err(X509_F_X509_GET_PUBKEY_PARAMETERS,X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN); | ||
1810 | return 0; | ||
1811 | } | ||
1812 | |||
1813 | /* first, populate the other certs */ | ||
1814 | for (j=i-1; j >= 0; j--) | ||
1815 | { | ||
1816 | ktmp2=X509_get_pubkey(sk_X509_value(chain,j)); | ||
1817 | EVP_PKEY_copy_parameters(ktmp2,ktmp); | ||
1818 | EVP_PKEY_free(ktmp2); | ||
1819 | } | ||
1820 | |||
1821 | if (pkey != NULL) EVP_PKEY_copy_parameters(pkey,ktmp); | ||
1822 | EVP_PKEY_free(ktmp); | ||
1823 | return 1; | ||
1824 | } | ||
1825 | |||
1826 | int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, | ||
1827 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) | ||
1828 | { | ||
1829 | /* This function is (usually) called only once, by | ||
1830 | * SSL_get_ex_data_X509_STORE_CTX_idx (ssl/ssl_cert.c). */ | ||
1831 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE_CTX, argl, argp, | ||
1832 | new_func, dup_func, free_func); | ||
1833 | } | ||
1834 | |||
1835 | int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data) | ||
1836 | { | ||
1837 | return CRYPTO_set_ex_data(&ctx->ex_data,idx,data); | ||
1838 | } | ||
1839 | |||
1840 | void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx) | ||
1841 | { | ||
1842 | return CRYPTO_get_ex_data(&ctx->ex_data,idx); | ||
1843 | } | ||
1844 | |||
1845 | int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx) | ||
1846 | { | ||
1847 | return ctx->error; | ||
1848 | } | ||
1849 | |||
1850 | void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int err) | ||
1851 | { | ||
1852 | ctx->error=err; | ||
1853 | } | ||
1854 | |||
1855 | int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx) | ||
1856 | { | ||
1857 | return ctx->error_depth; | ||
1858 | } | ||
1859 | |||
1860 | X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx) | ||
1861 | { | ||
1862 | return ctx->current_cert; | ||
1863 | } | ||
1864 | |||
1865 | STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx) | ||
1866 | { | ||
1867 | return ctx->chain; | ||
1868 | } | ||
1869 | |||
1870 | STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx) | ||
1871 | { | ||
1872 | int i; | ||
1873 | X509 *x; | ||
1874 | STACK_OF(X509) *chain; | ||
1875 | if (!ctx->chain || !(chain = sk_X509_dup(ctx->chain))) return NULL; | ||
1876 | for (i = 0; i < sk_X509_num(chain); i++) | ||
1877 | { | ||
1878 | x = sk_X509_value(chain, i); | ||
1879 | CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); | ||
1880 | } | ||
1881 | return chain; | ||
1882 | } | ||
1883 | |||
1884 | X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx) | ||
1885 | { | ||
1886 | return ctx->current_issuer; | ||
1887 | } | ||
1888 | |||
1889 | X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx) | ||
1890 | { | ||
1891 | return ctx->current_crl; | ||
1892 | } | ||
1893 | |||
1894 | X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx) | ||
1895 | { | ||
1896 | return ctx->parent; | ||
1897 | } | ||
1898 | |||
1899 | void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *x) | ||
1900 | { | ||
1901 | ctx->cert=x; | ||
1902 | } | ||
1903 | |||
1904 | void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *sk) | ||
1905 | { | ||
1906 | ctx->untrusted=sk; | ||
1907 | } | ||
1908 | |||
1909 | void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, STACK_OF(X509_CRL) *sk) | ||
1910 | { | ||
1911 | ctx->crls=sk; | ||
1912 | } | ||
1913 | |||
1914 | int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose) | ||
1915 | { | ||
1916 | return X509_STORE_CTX_purpose_inherit(ctx, 0, purpose, 0); | ||
1917 | } | ||
1918 | |||
1919 | int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust) | ||
1920 | { | ||
1921 | return X509_STORE_CTX_purpose_inherit(ctx, 0, 0, trust); | ||
1922 | } | ||
1923 | |||
1924 | /* This function is used to set the X509_STORE_CTX purpose and trust | ||
1925 | * values. This is intended to be used when another structure has its | ||
1926 | * own trust and purpose values which (if set) will be inherited by | ||
1927 | * the ctx. If they aren't set then we will usually have a default | ||
1928 | * purpose in mind which should then be used to set the trust value. | ||
1929 | * An example of this is SSL use: an SSL structure will have its own | ||
1930 | * purpose and trust settings which the application can set: if they | ||
1931 | * aren't set then we use the default of SSL client/server. | ||
1932 | */ | ||
1933 | |||
1934 | int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, | ||
1935 | int purpose, int trust) | ||
1936 | { | ||
1937 | int idx; | ||
1938 | /* If purpose not set use default */ | ||
1939 | if (!purpose) purpose = def_purpose; | ||
1940 | /* If we have a purpose then check it is valid */ | ||
1941 | if (purpose) | ||
1942 | { | ||
1943 | X509_PURPOSE *ptmp; | ||
1944 | idx = X509_PURPOSE_get_by_id(purpose); | ||
1945 | if (idx == -1) | ||
1946 | { | ||
1947 | X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT, | ||
1948 | X509_R_UNKNOWN_PURPOSE_ID); | ||
1949 | return 0; | ||
1950 | } | ||
1951 | ptmp = X509_PURPOSE_get0(idx); | ||
1952 | if (ptmp->trust == X509_TRUST_DEFAULT) | ||
1953 | { | ||
1954 | idx = X509_PURPOSE_get_by_id(def_purpose); | ||
1955 | if (idx == -1) | ||
1956 | { | ||
1957 | X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT, | ||
1958 | X509_R_UNKNOWN_PURPOSE_ID); | ||
1959 | return 0; | ||
1960 | } | ||
1961 | ptmp = X509_PURPOSE_get0(idx); | ||
1962 | } | ||
1963 | /* If trust not set then get from purpose default */ | ||
1964 | if (!trust) trust = ptmp->trust; | ||
1965 | } | ||
1966 | if (trust) | ||
1967 | { | ||
1968 | idx = X509_TRUST_get_by_id(trust); | ||
1969 | if (idx == -1) | ||
1970 | { | ||
1971 | X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT, | ||
1972 | X509_R_UNKNOWN_TRUST_ID); | ||
1973 | return 0; | ||
1974 | } | ||
1975 | } | ||
1976 | |||
1977 | if (purpose && !ctx->param->purpose) ctx->param->purpose = purpose; | ||
1978 | if (trust && !ctx->param->trust) ctx->param->trust = trust; | ||
1979 | return 1; | ||
1980 | } | ||
1981 | |||
1982 | X509_STORE_CTX *X509_STORE_CTX_new(void) | ||
1983 | { | ||
1984 | X509_STORE_CTX *ctx; | ||
1985 | ctx = (X509_STORE_CTX *)OPENSSL_malloc(sizeof(X509_STORE_CTX)); | ||
1986 | if (!ctx) | ||
1987 | { | ||
1988 | X509err(X509_F_X509_STORE_CTX_NEW,ERR_R_MALLOC_FAILURE); | ||
1989 | return NULL; | ||
1990 | } | ||
1991 | memset(ctx, 0, sizeof(X509_STORE_CTX)); | ||
1992 | return ctx; | ||
1993 | } | ||
1994 | |||
1995 | void X509_STORE_CTX_free(X509_STORE_CTX *ctx) | ||
1996 | { | ||
1997 | X509_STORE_CTX_cleanup(ctx); | ||
1998 | OPENSSL_free(ctx); | ||
1999 | } | ||
2000 | |||
2001 | int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, | ||
2002 | STACK_OF(X509) *chain) | ||
2003 | { | ||
2004 | int ret = 1; | ||
2005 | ctx->ctx=store; | ||
2006 | ctx->current_method=0; | ||
2007 | ctx->cert=x509; | ||
2008 | ctx->untrusted=chain; | ||
2009 | ctx->crls = NULL; | ||
2010 | ctx->last_untrusted=0; | ||
2011 | ctx->other_ctx=NULL; | ||
2012 | ctx->valid=0; | ||
2013 | ctx->chain=NULL; | ||
2014 | ctx->error=0; | ||
2015 | ctx->explicit_policy=0; | ||
2016 | ctx->error_depth=0; | ||
2017 | ctx->current_cert=NULL; | ||
2018 | ctx->current_issuer=NULL; | ||
2019 | ctx->current_crl=NULL; | ||
2020 | ctx->current_crl_score=0; | ||
2021 | ctx->current_reasons=0; | ||
2022 | ctx->tree = NULL; | ||
2023 | ctx->parent = NULL; | ||
2024 | |||
2025 | ctx->param = X509_VERIFY_PARAM_new(); | ||
2026 | |||
2027 | if (!ctx->param) | ||
2028 | { | ||
2029 | X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE); | ||
2030 | return 0; | ||
2031 | } | ||
2032 | |||
2033 | /* Inherit callbacks and flags from X509_STORE if not set | ||
2034 | * use defaults. | ||
2035 | */ | ||
2036 | |||
2037 | |||
2038 | if (store) | ||
2039 | ret = X509_VERIFY_PARAM_inherit(ctx->param, store->param); | ||
2040 | else | ||
2041 | ctx->param->inh_flags |= X509_VP_FLAG_DEFAULT|X509_VP_FLAG_ONCE; | ||
2042 | |||
2043 | if (store) | ||
2044 | { | ||
2045 | ctx->verify_cb = store->verify_cb; | ||
2046 | ctx->cleanup = store->cleanup; | ||
2047 | } | ||
2048 | else | ||
2049 | ctx->cleanup = 0; | ||
2050 | |||
2051 | if (ret) | ||
2052 | ret = X509_VERIFY_PARAM_inherit(ctx->param, | ||
2053 | X509_VERIFY_PARAM_lookup("default")); | ||
2054 | |||
2055 | if (ret == 0) | ||
2056 | { | ||
2057 | X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE); | ||
2058 | return 0; | ||
2059 | } | ||
2060 | |||
2061 | if (store && store->check_issued) | ||
2062 | ctx->check_issued = store->check_issued; | ||
2063 | else | ||
2064 | ctx->check_issued = check_issued; | ||
2065 | |||
2066 | if (store && store->get_issuer) | ||
2067 | ctx->get_issuer = store->get_issuer; | ||
2068 | else | ||
2069 | ctx->get_issuer = X509_STORE_CTX_get1_issuer; | ||
2070 | |||
2071 | if (store && store->verify_cb) | ||
2072 | ctx->verify_cb = store->verify_cb; | ||
2073 | else | ||
2074 | ctx->verify_cb = null_callback; | ||
2075 | |||
2076 | if (store && store->verify) | ||
2077 | ctx->verify = store->verify; | ||
2078 | else | ||
2079 | ctx->verify = internal_verify; | ||
2080 | |||
2081 | if (store && store->check_revocation) | ||
2082 | ctx->check_revocation = store->check_revocation; | ||
2083 | else | ||
2084 | ctx->check_revocation = check_revocation; | ||
2085 | |||
2086 | if (store && store->get_crl) | ||
2087 | ctx->get_crl = store->get_crl; | ||
2088 | else | ||
2089 | ctx->get_crl = NULL; | ||
2090 | |||
2091 | if (store && store->check_crl) | ||
2092 | ctx->check_crl = store->check_crl; | ||
2093 | else | ||
2094 | ctx->check_crl = check_crl; | ||
2095 | |||
2096 | if (store && store->cert_crl) | ||
2097 | ctx->cert_crl = store->cert_crl; | ||
2098 | else | ||
2099 | ctx->cert_crl = cert_crl; | ||
2100 | |||
2101 | if (store && store->lookup_certs) | ||
2102 | ctx->lookup_certs = store->lookup_certs; | ||
2103 | else | ||
2104 | ctx->lookup_certs = X509_STORE_get1_certs; | ||
2105 | |||
2106 | if (store && store->lookup_crls) | ||
2107 | ctx->lookup_crls = store->lookup_crls; | ||
2108 | else | ||
2109 | ctx->lookup_crls = X509_STORE_get1_crls; | ||
2110 | |||
2111 | ctx->check_policy = check_policy; | ||
2112 | |||
2113 | |||
2114 | /* This memset() can't make any sense anyway, so it's removed. As | ||
2115 | * X509_STORE_CTX_cleanup does a proper "free" on the ex_data, we put a | ||
2116 | * corresponding "new" here and remove this bogus initialisation. */ | ||
2117 | /* memset(&(ctx->ex_data),0,sizeof(CRYPTO_EX_DATA)); */ | ||
2118 | if(!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE_CTX, ctx, | ||
2119 | &(ctx->ex_data))) | ||
2120 | { | ||
2121 | OPENSSL_free(ctx); | ||
2122 | X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE); | ||
2123 | return 0; | ||
2124 | } | ||
2125 | return 1; | ||
2126 | } | ||
2127 | |||
2128 | /* Set alternative lookup method: just a STACK of trusted certificates. | ||
2129 | * This avoids X509_STORE nastiness where it isn't needed. | ||
2130 | */ | ||
2131 | |||
2132 | void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk) | ||
2133 | { | ||
2134 | ctx->other_ctx = sk; | ||
2135 | ctx->get_issuer = get_issuer_sk; | ||
2136 | } | ||
2137 | |||
2138 | void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx) | ||
2139 | { | ||
2140 | if (ctx->cleanup) ctx->cleanup(ctx); | ||
2141 | if (ctx->param != NULL) | ||
2142 | { | ||
2143 | if (ctx->parent == NULL) | ||
2144 | X509_VERIFY_PARAM_free(ctx->param); | ||
2145 | ctx->param=NULL; | ||
2146 | } | ||
2147 | if (ctx->tree != NULL) | ||
2148 | { | ||
2149 | X509_policy_tree_free(ctx->tree); | ||
2150 | ctx->tree=NULL; | ||
2151 | } | ||
2152 | if (ctx->chain != NULL) | ||
2153 | { | ||
2154 | sk_X509_pop_free(ctx->chain,X509_free); | ||
2155 | ctx->chain=NULL; | ||
2156 | } | ||
2157 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE_CTX, ctx, &(ctx->ex_data)); | ||
2158 | memset(&ctx->ex_data,0,sizeof(CRYPTO_EX_DATA)); | ||
2159 | } | ||
2160 | |||
2161 | void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth) | ||
2162 | { | ||
2163 | X509_VERIFY_PARAM_set_depth(ctx->param, depth); | ||
2164 | } | ||
2165 | |||
2166 | void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags) | ||
2167 | { | ||
2168 | X509_VERIFY_PARAM_set_flags(ctx->param, flags); | ||
2169 | } | ||
2170 | |||
2171 | void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, time_t t) | ||
2172 | { | ||
2173 | X509_VERIFY_PARAM_set_time(ctx->param, t); | ||
2174 | } | ||
2175 | |||
2176 | void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, | ||
2177 | int (*verify_cb)(int, X509_STORE_CTX *)) | ||
2178 | { | ||
2179 | ctx->verify_cb=verify_cb; | ||
2180 | } | ||
2181 | |||
2182 | X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx) | ||
2183 | { | ||
2184 | return ctx->tree; | ||
2185 | } | ||
2186 | |||
2187 | int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx) | ||
2188 | { | ||
2189 | return ctx->explicit_policy; | ||
2190 | } | ||
2191 | |||
2192 | int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name) | ||
2193 | { | ||
2194 | const X509_VERIFY_PARAM *param; | ||
2195 | param = X509_VERIFY_PARAM_lookup(name); | ||
2196 | if (!param) | ||
2197 | return 0; | ||
2198 | return X509_VERIFY_PARAM_inherit(ctx->param, param); | ||
2199 | } | ||
2200 | |||
2201 | X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx) | ||
2202 | { | ||
2203 | return ctx->param; | ||
2204 | } | ||
2205 | |||
2206 | void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param) | ||
2207 | { | ||
2208 | if (ctx->param) | ||
2209 | X509_VERIFY_PARAM_free(ctx->param); | ||
2210 | ctx->param = param; | ||
2211 | } | ||
2212 | |||
2213 | IMPLEMENT_STACK_OF(X509) | ||
2214 | IMPLEMENT_ASN1_SET_OF(X509) | ||
2215 | |||
2216 | IMPLEMENT_STACK_OF(X509_NAME) | ||
2217 | |||
2218 | IMPLEMENT_STACK_OF(X509_ATTRIBUTE) | ||
2219 | IMPLEMENT_ASN1_SET_OF(X509_ATTRIBUTE) | ||