Initial support for alternative CRL issuing certificates.
[openssl.git] / crypto / x509 / x509_vfy.c
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 static int null_callback(int ok,X509_STORE_CTX *e);
74 static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
75 static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x);
76 static int check_chain_extensions(X509_STORE_CTX *ctx);
77 static int check_trust(X509_STORE_CTX *ctx);
78 static int check_revocation(X509_STORE_CTX *ctx);
79 static int check_cert(X509_STORE_CTX *ctx);
80 static int check_policy(X509_STORE_CTX *ctx);
81 static int crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl, X509 **pissuer);
82 static int idp_check_scope(X509 *x, X509_CRL *crl);
83 static int internal_verify(X509_STORE_CTX *ctx);
84 const char X509_version[]="X.509" OPENSSL_VERSION_PTEXT;
85
86
87 static int null_callback(int ok, X509_STORE_CTX *e)
88         {
89         return ok;
90         }
91
92 #if 0
93 static int x509_subject_cmp(X509 **a, X509 **b)
94         {
95         return X509_subject_name_cmp(*a,*b);
96         }
97 #endif
98
99 int X509_verify_cert(X509_STORE_CTX *ctx)
100         {
101         X509 *x,*xtmp,*chain_ss=NULL;
102         X509_NAME *xn;
103         int bad_chain = 0;
104         X509_VERIFY_PARAM *param = ctx->param;
105         int depth,i,ok=0;
106         int num;
107         int (*cb)(int xok,X509_STORE_CTX *xctx);
108         STACK_OF(X509) *sktmp=NULL;
109         if (ctx->cert == NULL)
110                 {
111                 X509err(X509_F_X509_VERIFY_CERT,X509_R_NO_CERT_SET_FOR_US_TO_VERIFY);
112                 return -1;
113                 }
114
115         cb=ctx->verify_cb;
116
117         /* first we make sure the chain we are going to build is
118          * present and that the first entry is in place */
119         if (ctx->chain == NULL)
120                 {
121                 if (    ((ctx->chain=sk_X509_new_null()) == NULL) ||
122                         (!sk_X509_push(ctx->chain,ctx->cert)))
123                         {
124                         X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
125                         goto end;
126                         }
127                 CRYPTO_add(&ctx->cert->references,1,CRYPTO_LOCK_X509);
128                 ctx->last_untrusted=1;
129                 }
130
131         /* We use a temporary STACK so we can chop and hack at it */
132         if (ctx->untrusted != NULL
133             && (sktmp=sk_X509_dup(ctx->untrusted)) == NULL)
134                 {
135                 X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
136                 goto end;
137                 }
138
139         num=sk_X509_num(ctx->chain);
140         x=sk_X509_value(ctx->chain,num-1);
141         depth=param->depth;
142
143
144         for (;;)
145                 {
146                 /* If we have enough, we break */
147                 if (depth < num) break; /* FIXME: If this happens, we should take
148                                          * note of it and, if appropriate, use the
149                                          * X509_V_ERR_CERT_CHAIN_TOO_LONG error
150                                          * code later.
151                                          */
152
153                 /* If we are self signed, we break */
154                 xn=X509_get_issuer_name(x);
155                 if (ctx->check_issued(ctx, x,x)) break;
156
157                 /* If we were passed a cert chain, use it first */
158                 if (ctx->untrusted != NULL)
159                         {
160                         xtmp=find_issuer(ctx, sktmp,x);
161                         if (xtmp != NULL)
162                                 {
163                                 if (!sk_X509_push(ctx->chain,xtmp))
164                                         {
165                                         X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
166                                         goto end;
167                                         }
168                                 CRYPTO_add(&xtmp->references,1,CRYPTO_LOCK_X509);
169                                 (void)sk_X509_delete_ptr(sktmp,xtmp);
170                                 ctx->last_untrusted++;
171                                 x=xtmp;
172                                 num++;
173                                 /* reparse the full chain for
174                                  * the next one */
175                                 continue;
176                                 }
177                         }
178                 break;
179                 }
180
181         /* at this point, chain should contain a list of untrusted
182          * certificates.  We now need to add at least one trusted one,
183          * if possible, otherwise we complain. */
184
185         /* Examine last certificate in chain and see if it
186          * is self signed.
187          */
188
189         i=sk_X509_num(ctx->chain);
190         x=sk_X509_value(ctx->chain,i-1);
191         xn = X509_get_subject_name(x);
192         if (ctx->check_issued(ctx, x, x))
193                 {
194                 /* we have a self signed certificate */
195                 if (sk_X509_num(ctx->chain) == 1)
196                         {
197                         /* We have a single self signed certificate: see if
198                          * we can find it in the store. We must have an exact
199                          * match to avoid possible impersonation.
200                          */
201                         ok = ctx->get_issuer(&xtmp, ctx, x);
202                         if ((ok <= 0) || X509_cmp(x, xtmp)) 
203                                 {
204                                 ctx->error=X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
205                                 ctx->current_cert=x;
206                                 ctx->error_depth=i-1;
207                                 if (ok == 1) X509_free(xtmp);
208                                 bad_chain = 1;
209                                 ok=cb(0,ctx);
210                                 if (!ok) goto end;
211                                 }
212                         else 
213                                 {
214                                 /* We have a match: replace certificate with store version
215                                  * so we get any trust settings.
216                                  */
217                                 X509_free(x);
218                                 x = xtmp;
219                                 (void)sk_X509_set(ctx->chain, i - 1, x);
220                                 ctx->last_untrusted=0;
221                                 }
222                         }
223                 else
224                         {
225                         /* extract and save self signed certificate for later use */
226                         chain_ss=sk_X509_pop(ctx->chain);
227                         ctx->last_untrusted--;
228                         num--;
229                         x=sk_X509_value(ctx->chain,num-1);
230                         }
231                 }
232
233         /* We now lookup certs from the certificate store */
234         for (;;)
235                 {
236                 /* If we have enough, we break */
237                 if (depth < num) break;
238
239                 /* If we are self signed, we break */
240                 xn=X509_get_issuer_name(x);
241                 if (ctx->check_issued(ctx,x,x)) break;
242
243                 ok = ctx->get_issuer(&xtmp, ctx, x);
244
245                 if (ok < 0) return ok;
246                 if (ok == 0) break;
247
248                 x = xtmp;
249                 if (!sk_X509_push(ctx->chain,x))
250                         {
251                         X509_free(xtmp);
252                         X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
253                         return 0;
254                         }
255                 num++;
256                 }
257
258         /* we now have our chain, lets check it... */
259         xn=X509_get_issuer_name(x);
260
261         /* Is last certificate looked up self signed? */
262         if (!ctx->check_issued(ctx,x,x))
263                 {
264                 if ((chain_ss == NULL) || !ctx->check_issued(ctx, x, chain_ss))
265                         {
266                         if (ctx->last_untrusted >= num)
267                                 ctx->error=X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY;
268                         else
269                                 ctx->error=X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
270                         ctx->current_cert=x;
271                         }
272                 else
273                         {
274
275                         sk_X509_push(ctx->chain,chain_ss);
276                         num++;
277                         ctx->last_untrusted=num;
278                         ctx->current_cert=chain_ss;
279                         ctx->error=X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN;
280                         chain_ss=NULL;
281                         }
282
283                 ctx->error_depth=num-1;
284                 bad_chain = 1;
285                 ok=cb(0,ctx);
286                 if (!ok) goto end;
287                 }
288
289         /* We have the chain complete: now we need to check its purpose */
290         ok = check_chain_extensions(ctx);
291
292         if (!ok) goto end;
293
294         /* The chain extensions are OK: check trust */
295
296         if (param->trust > 0) ok = check_trust(ctx);
297
298         if (!ok) goto end;
299
300         /* We may as well copy down any DSA parameters that are required */
301         X509_get_pubkey_parameters(NULL,ctx->chain);
302
303         /* Check revocation status: we do this after copying parameters
304          * because they may be needed for CRL signature verification.
305          */
306
307         ok = ctx->check_revocation(ctx);
308         if(!ok) goto end;
309
310         /* At this point, we have a chain and need to verify it */
311         if (ctx->verify != NULL)
312                 ok=ctx->verify(ctx);
313         else
314                 ok=internal_verify(ctx);
315         if(!ok) goto end;
316
317 #ifndef OPENSSL_NO_RFC3779
318         /* RFC 3779 path validation, now that CRL check has been done */
319         ok = v3_asid_validate_path(ctx);
320         if (!ok) goto end;
321         ok = v3_addr_validate_path(ctx);
322         if (!ok) goto end;
323 #endif
324
325         /* If we get this far evaluate policies */
326         if (!bad_chain && (ctx->param->flags & X509_V_FLAG_POLICY_CHECK))
327                 ok = ctx->check_policy(ctx);
328         if(!ok) goto end;
329         if (0)
330                 {
331 end:
332                 X509_get_pubkey_parameters(NULL,ctx->chain);
333                 }
334         if (sktmp != NULL) sk_X509_free(sktmp);
335         if (chain_ss != NULL) X509_free(chain_ss);
336         return ok;
337         }
338
339
340 /* Given a STACK_OF(X509) find the issuer of cert (if any)
341  */
342
343 static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x)
344 {
345         int i;
346         X509 *issuer;
347         for (i = 0; i < sk_X509_num(sk); i++)
348                 {
349                 issuer = sk_X509_value(sk, i);
350                 if (ctx->check_issued(ctx, x, issuer))
351                         return issuer;
352                 }
353         return NULL;
354 }
355
356 /* Given a possible certificate and issuer check them */
357
358 static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer)
359 {
360         int ret;
361         ret = X509_check_issued(issuer, x);
362         if (ret == X509_V_OK)
363                 return 1;
364         /* If we haven't asked for issuer errors don't set ctx */
365         if (!(ctx->param->flags & X509_V_FLAG_CB_ISSUER_CHECK))
366                 return 0;
367
368         ctx->error = ret;
369         ctx->current_cert = x;
370         ctx->current_issuer = issuer;
371         return ctx->verify_cb(0, ctx);
372         return 0;
373 }
374
375 /* Alternative lookup method: look from a STACK stored in other_ctx */
376
377 static int get_issuer_sk(X509 **issuer, X509_STORE_CTX *ctx, X509 *x)
378 {
379         *issuer = find_issuer(ctx, ctx->other_ctx, x);
380         if (*issuer)
381                 {
382                 CRYPTO_add(&(*issuer)->references,1,CRYPTO_LOCK_X509);
383                 return 1;
384                 }
385         else
386                 return 0;
387 }
388         
389
390 /* Check a certificate chains extensions for consistency
391  * with the supplied purpose
392  */
393
394 static int check_chain_extensions(X509_STORE_CTX *ctx)
395 {
396 #ifdef OPENSSL_NO_CHAIN_VERIFY
397         return 1;
398 #else
399         int i, ok=0, must_be_ca, plen = 0;
400         X509 *x;
401         int (*cb)(int xok,X509_STORE_CTX *xctx);
402         int proxy_path_length = 0;
403         int allow_proxy_certs =
404                 !!(ctx->param->flags & X509_V_FLAG_ALLOW_PROXY_CERTS);
405         cb=ctx->verify_cb;
406
407         /* must_be_ca can have 1 of 3 values:
408            -1: we accept both CA and non-CA certificates, to allow direct
409                use of self-signed certificates (which are marked as CA).
410            0:  we only accept non-CA certificates.  This is currently not
411                used, but the possibility is present for future extensions.
412            1:  we only accept CA certificates.  This is currently used for
413                all certificates in the chain except the leaf certificate.
414         */
415         must_be_ca = -1;
416
417         /* A hack to keep people who don't want to modify their software
418            happy */
419         if (getenv("OPENSSL_ALLOW_PROXY_CERTS"))
420                 allow_proxy_certs = 1;
421
422         /* Check all untrusted certificates */
423         for (i = 0; i < ctx->last_untrusted; i++)
424                 {
425                 int ret;
426                 x = sk_X509_value(ctx->chain, i);
427                 if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL)
428                         && (x->ex_flags & EXFLAG_CRITICAL))
429                         {
430                         ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION;
431                         ctx->error_depth = i;
432                         ctx->current_cert = x;
433                         ok=cb(0,ctx);
434                         if (!ok) goto end;
435                         }
436                 if (!allow_proxy_certs && (x->ex_flags & EXFLAG_PROXY))
437                         {
438                         ctx->error = X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED;
439                         ctx->error_depth = i;
440                         ctx->current_cert = x;
441                         ok=cb(0,ctx);
442                         if (!ok) goto end;
443                         }
444                 ret = X509_check_ca(x);
445                 switch(must_be_ca)
446                         {
447                 case -1:
448                         if ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
449                                 && (ret != 1) && (ret != 0))
450                                 {
451                                 ret = 0;
452                                 ctx->error = X509_V_ERR_INVALID_CA;
453                                 }
454                         else
455                                 ret = 1;
456                         break;
457                 case 0:
458                         if (ret != 0)
459                                 {
460                                 ret = 0;
461                                 ctx->error = X509_V_ERR_INVALID_NON_CA;
462                                 }
463                         else
464                                 ret = 1;
465                         break;
466                 default:
467                         if ((ret == 0)
468                                 || ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
469                                         && (ret != 1)))
470                                 {
471                                 ret = 0;
472                                 ctx->error = X509_V_ERR_INVALID_CA;
473                                 }
474                         else
475                                 ret = 1;
476                         break;
477                         }
478                 if (ret == 0)
479                         {
480                         ctx->error_depth = i;
481                         ctx->current_cert = x;
482                         ok=cb(0,ctx);
483                         if (!ok) goto end;
484                         }
485                 if (ctx->param->purpose > 0)
486                         {
487                         ret = X509_check_purpose(x, ctx->param->purpose,
488                                 must_be_ca > 0);
489                         if ((ret == 0)
490                                 || ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
491                                         && (ret != 1)))
492                                 {
493                                 ctx->error = X509_V_ERR_INVALID_PURPOSE;
494                                 ctx->error_depth = i;
495                                 ctx->current_cert = x;
496                                 ok=cb(0,ctx);
497                                 if (!ok) goto end;
498                                 }
499                         }
500                 /* Check pathlen if not self issued */
501                 if ((i > 1) && !(x->ex_flags & EXFLAG_SI)
502                            && (x->ex_pathlen != -1)
503                            && (plen > (x->ex_pathlen + proxy_path_length + 1)))
504                         {
505                         ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED;
506                         ctx->error_depth = i;
507                         ctx->current_cert = x;
508                         ok=cb(0,ctx);
509                         if (!ok) goto end;
510                         }
511                 /* Increment path length if not self issued */
512                 if (!(x->ex_flags & EXFLAG_SI))
513                         plen++;
514                 /* If this certificate is a proxy certificate, the next
515                    certificate must be another proxy certificate or a EE
516                    certificate.  If not, the next certificate must be a
517                    CA certificate.  */
518                 if (x->ex_flags & EXFLAG_PROXY)
519                         {
520                         if (x->ex_pcpathlen != -1 && i > x->ex_pcpathlen)
521                                 {
522                                 ctx->error =
523                                         X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED;
524                                 ctx->error_depth = i;
525                                 ctx->current_cert = x;
526                                 ok=cb(0,ctx);
527                                 if (!ok) goto end;
528                                 }
529                         proxy_path_length++;
530                         must_be_ca = 0;
531                         }
532                 else
533                         must_be_ca = 1;
534                 }
535         ok = 1;
536  end:
537         return ok;
538 #endif
539 }
540
541 static int check_trust(X509_STORE_CTX *ctx)
542 {
543 #ifdef OPENSSL_NO_CHAIN_VERIFY
544         return 1;
545 #else
546         int i, ok;
547         X509 *x;
548         int (*cb)(int xok,X509_STORE_CTX *xctx);
549         cb=ctx->verify_cb;
550 /* For now just check the last certificate in the chain */
551         i = sk_X509_num(ctx->chain) - 1;
552         x = sk_X509_value(ctx->chain, i);
553         ok = X509_check_trust(x, ctx->param->trust, 0);
554         if (ok == X509_TRUST_TRUSTED)
555                 return 1;
556         ctx->error_depth = i;
557         ctx->current_cert = x;
558         if (ok == X509_TRUST_REJECTED)
559                 ctx->error = X509_V_ERR_CERT_REJECTED;
560         else
561                 ctx->error = X509_V_ERR_CERT_UNTRUSTED;
562         ok = cb(0, ctx);
563         return ok;
564 #endif
565 }
566
567 static int check_revocation(X509_STORE_CTX *ctx)
568         {
569         int i, last, ok;
570         if (!(ctx->param->flags & X509_V_FLAG_CRL_CHECK))
571                 return 1;
572         if (ctx->param->flags & X509_V_FLAG_CRL_CHECK_ALL)
573                 last = sk_X509_num(ctx->chain) - 1;
574         else
575                 last = 0;
576         for(i = 0; i <= last; i++)
577                 {
578                 ctx->error_depth = i;
579                 ok = check_cert(ctx);
580                 if (!ok) return ok;
581                 }
582         return 1;
583         }
584
585 static int check_cert(X509_STORE_CTX *ctx)
586         {
587         X509_CRL *crl = NULL;
588         X509 *x;
589         int ok, cnum;
590         cnum = ctx->error_depth;
591         x = sk_X509_value(ctx->chain, cnum);
592         ctx->current_cert = x;
593         ctx->current_issuer = NULL;
594         /* Try to retrieve relevant CRL */
595         ok = ctx->get_crl(ctx, &crl, x);
596         /* If error looking up CRL, nothing we can do except
597          * notify callback
598          */
599         if(!ok)
600                 {
601                 ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
602                 ok = ctx->verify_cb(0, ctx);
603                 goto err;
604                 }
605         ctx->current_crl = crl;
606         ok = ctx->check_crl(ctx, crl);
607         if (!ok) goto err;
608         ok = ctx->cert_crl(ctx, crl, x);
609         err:
610         ctx->current_crl = NULL;
611         X509_CRL_free(crl);
612         return ok;
613
614         }
615
616 /* Check CRL times against values in X509_STORE_CTX */
617
618 static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify)
619         {
620         time_t *ptime;
621         int i;
622         ctx->current_crl = crl;
623         if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME)
624                 ptime = &ctx->param->check_time;
625         else
626                 ptime = NULL;
627
628         i=X509_cmp_time(X509_CRL_get_lastUpdate(crl), ptime);
629         if (i == 0)
630                 {
631                 ctx->error=X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD;
632                 if (!notify || !ctx->verify_cb(0, ctx))
633                         return 0;
634                 }
635
636         if (i > 0)
637                 {
638                 ctx->error=X509_V_ERR_CRL_NOT_YET_VALID;
639                 if (!notify || !ctx->verify_cb(0, ctx))
640                         return 0;
641                 }
642
643         if(X509_CRL_get_nextUpdate(crl))
644                 {
645                 i=X509_cmp_time(X509_CRL_get_nextUpdate(crl), ptime);
646
647                 if (i == 0)
648                         {
649                         ctx->error=X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD;
650                         if (!notify || !ctx->verify_cb(0, ctx))
651                                 return 0;
652                         }
653
654                 if (i < 0)
655                         {
656                         ctx->error=X509_V_ERR_CRL_HAS_EXPIRED;
657                         if (!notify || !ctx->verify_cb(0, ctx))
658                                 return 0;
659                         }
660                 }
661
662         ctx->current_crl = NULL;
663
664         return 1;
665         }
666
667 /* Based on a set of possible CRLs decide which one is best suited
668  * to handle the current certificate. This is determined by a number
669  * of criteria. If any of the "must" criteria is not satisfied then
670  * the candidate CRL is rejected. If all "must" and all "should" are
671  * satisfied the CRL is accepted. If no CRL satisfies all criteria then
672  * a "best CRL" is used to provide some meaningful error information.
673  *
674  * CRL issuer name must match "nm" if not NULL.
675  * If IDP is present:
676  *   a. it must be consistent.
677  *   b. onlyuser, onlyCA, onlyAA should match certificate being checked.
678  *   c. indirectCRL must be FALSE.
679  *   d. onlysomereason must be absent.
680  *   e. if name present a DP in certificate CRLDP must match.
681  * If AKID present it should match certificate AKID.
682  * Check time should fall between lastUpdate and nextUpdate.
683  */
684
685 /* IDP name field matches CRLDP or IDP name not present */
686 #define CRL_SCORE_SCOPE         4
687 /* AKID present and matches cert, or AKID not present */
688 #define CRL_SCORE_AKID          2
689 /* times OK */
690 #define CRL_SCORE_TIME          1
691
692 #define CRL_SCORE_ALL           7
693
694 /* IDP flags which cause a CRL to be rejected */
695
696 #define IDP_REJECT      (IDP_INVALID|IDP_INDIRECT|IDP_REASONS)
697
698 static int get_crl_sk(X509_STORE_CTX *ctx, X509_CRL **pcrl,
699                         X509_NAME *nm, STACK_OF(X509_CRL) *crls)
700         {
701         int i, crl_score, best_score = -1;
702         X509_CRL *crl, *best_crl = NULL;
703         X509 *crl_issuer, *best_crl_issuer = NULL;
704         for (i = 0; i < sk_X509_CRL_num(crls); i++)
705                 {
706                 crl_score = 0;
707                 crl_issuer = NULL;
708                 crl = sk_X509_CRL_value(crls, i);
709                 if (nm && X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)))
710                         continue;
711                 if (check_crl_time(ctx, crl, 0))
712                         crl_score |= CRL_SCORE_TIME;
713
714                 if (crl->idp_flags & IDP_PRESENT)
715                         {
716                         if (crl->idp_flags & IDP_REJECT)
717                                 continue;
718                         if (idp_check_scope(ctx->current_cert, crl))
719                                 crl_score |= CRL_SCORE_SCOPE;
720                         }
721                 else
722                         crl_score |= CRL_SCORE_SCOPE;
723
724                 if (crl_akid_check(ctx, crl, &crl_issuer))
725                         crl_score |= CRL_SCORE_AKID;
726                 /* If CRL matches criteria and issuer is not different use it */
727                 if (crl_score == CRL_SCORE_ALL && !crl_issuer)
728                         {
729                         *pcrl = crl;
730                         CRYPTO_add(&crl->references, 1, CRYPTO_LOCK_X509_CRL);
731                         return 1;
732                         }
733
734                 if (crl_score > best_score)
735                         {
736                         best_crl = crl;
737                         best_crl_issuer = crl_issuer;
738                         best_score = crl_score;
739                         }
740                 }
741         if (best_crl)
742                 {
743                 *pcrl = best_crl;
744                 ctx->current_issuer = best_crl_issuer;
745                 CRYPTO_add(&best_crl->references, 1, CRYPTO_LOCK_X509);
746                 }
747
748         return 0;
749         }
750
751 static int crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl, X509 **pissuer)
752         {
753         X509 *crl_issuer;
754         int cidx = ctx->error_depth;
755         if (!crl->akid)
756                 return 1;
757         if (cidx != sk_X509_num(ctx->chain) - 1)
758                 cidx++;
759         crl_issuer = sk_X509_value(ctx->chain, cidx);
760         if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK)
761                 return 1;
762         /* If crl_issuer is self issued we may get a match further along the
763          * chain.
764          */
765         if (crl_issuer->ex_flags & EXFLAG_SI)
766                 {
767                 for (cidx++; cidx < sk_X509_num(ctx->chain); cidx++)
768                         {
769                         crl_issuer = sk_X509_value(ctx->chain, cidx);
770                         if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK)
771                                 {
772                                 *pissuer = crl_issuer;
773                                 return 1;
774                                 }
775                         if (!(crl_issuer->ex_flags & EXFLAG_SI))
776                                 break;
777                         }
778                 }
779                 
780         return 0;
781         }
782
783
784 /* Check IDP name matches at least one CRLDP name */
785
786 static int idp_check_scope(X509 *x, X509_CRL *crl)
787         {
788         int i, j, k;
789         GENERAL_NAMES *inames, *dnames;
790         if (crl->idp_flags & IDP_ONLYATTR)
791                 return 0;
792         if (x->ex_flags & EXFLAG_CA)
793                 {
794                 if (crl->idp_flags & IDP_ONLYUSER)
795                         return 0;
796                 }
797         else
798                 {
799                 if (crl->idp_flags & IDP_ONLYCA)
800                         return 0;
801                 }
802         if (!crl->idp->distpoint)
803                 return 1;
804         if (crl->idp->distpoint->type != 0)
805                 return 1;
806         if (!x->crldp)
807                 return 0;
808         inames = crl->idp->distpoint->name.fullname;
809         for (i = 0; i < sk_GENERAL_NAME_num(inames); i++)
810                 {
811                 GENERAL_NAME *igen = sk_GENERAL_NAME_value(inames, i);
812                 for (j = 0; j < sk_DIST_POINT_num(x->crldp); j++)
813                         {
814                         DIST_POINT *dp = sk_DIST_POINT_value(x->crldp, j);
815                         /* We don't handle these at present */
816                         if (dp->reasons || dp->CRLissuer)
817                                 continue;
818                         if (!dp->distpoint || (dp->distpoint->type != 0))
819                                 continue;
820                         dnames = dp->distpoint->name.fullname;
821                         for (k = 0; k < sk_GENERAL_NAME_num(dnames); k++)
822                                 {
823                                 GENERAL_NAME *cgen =
824                                         sk_GENERAL_NAME_value(dnames, k);
825                                 if (!GENERAL_NAME_cmp(igen, cgen))
826                                         return 1;
827                                 }
828                         }
829                 }
830         return 0;
831         }
832
833 /* Retrieve CRL corresponding to current certificate. Currently only
834  * one CRL is retrieved. Multiple CRLs may be needed if we handle
835  * CRLs partitioned on reason code later.
836  */
837         
838 static int get_crl(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509 *x)
839         {
840         int ok;
841         X509_CRL *crl = NULL;
842         STACK_OF(X509_CRL) *skcrl;
843         X509_NAME *nm;
844         nm = X509_get_issuer_name(x);
845         ok = get_crl_sk(ctx, &crl, nm, ctx->crls);
846         if (ok)
847                 {
848                 *pcrl = crl;
849                 return 1;
850                 }
851
852         /* Lookup CRLs from store */
853
854         skcrl = ctx->lookup_crls(ctx, nm);
855
856         /* If no CRLs found and a near match from get_crl_sk use that */
857         if (!skcrl)
858                 {
859                 if (crl)
860                         {
861                         *pcrl = crl;
862                         return 1;
863                         }
864                 return 0;
865                 }
866
867         get_crl_sk(ctx, &crl, NULL, skcrl);
868
869         sk_X509_CRL_pop_free(skcrl, X509_CRL_free);
870
871         /* If we got any kind of CRL use it and return success */
872         if (crl)
873                 {
874                 *pcrl = crl;
875                 return 1;
876                 }
877
878         return 0;
879         }
880
881 /* Check CRL validity */
882 static int check_crl(X509_STORE_CTX *ctx, X509_CRL *crl)
883         {
884         X509 *issuer = NULL;
885         EVP_PKEY *ikey = NULL;
886         int ok = 0, chnum, cnum;
887         cnum = ctx->error_depth;
888         chnum = sk_X509_num(ctx->chain) - 1;
889         /* if we have an alternative CRL issuer cert use that */
890         if (ctx->current_issuer)
891                 issuer = ctx->current_issuer;
892         /* Else find CRL issuer: if not last certificate then issuer
893          * is next certificate in chain.
894          */
895         else if (cnum < chnum)
896                 issuer = sk_X509_value(ctx->chain, cnum + 1);
897         else
898                 {
899                 issuer = sk_X509_value(ctx->chain, chnum);
900                 /* If not self signed, can't check signature */
901                 if(!ctx->check_issued(ctx, issuer, issuer))
902                         {
903                         ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER;
904                         ok = ctx->verify_cb(0, ctx);
905                         if(!ok) goto err;
906                         }
907                 }
908
909         if(issuer)
910                 {
911                 /* Check for cRLSign bit if keyUsage present */
912                 if ((issuer->ex_flags & EXFLAG_KUSAGE) &&
913                         !(issuer->ex_kusage & KU_CRL_SIGN))
914                         {
915                         ctx->error = X509_V_ERR_KEYUSAGE_NO_CRL_SIGN;
916                         ok = ctx->verify_cb(0, ctx);
917                         if(!ok) goto err;
918                         }
919
920                 if (crl->idp_flags & IDP_PRESENT)
921                         {
922                         if (crl->idp_flags & IDP_INVALID)
923                                 {
924                                 ctx->error = X509_V_ERR_INVALID_EXTENSION;
925                                 ok = ctx->verify_cb(0, ctx);
926                                 if(!ok) goto err;
927                                 }
928                         if (crl->idp_flags & (IDP_REASONS|IDP_INDIRECT))
929                                 {
930                                 ctx->error = X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE;
931                                 ok = ctx->verify_cb(0, ctx);
932                                 if(!ok) goto err;
933                                 }
934                         if (!idp_check_scope(ctx->current_cert, crl))
935                                 {
936                                 ctx->error = X509_V_ERR_DIFFERENT_CRL_SCOPE;
937                                 ok = ctx->verify_cb(0, ctx);
938                                 if(!ok) goto err;
939                                 }
940                         }
941
942                 /* Attempt to get issuer certificate public key */
943                 ikey = X509_get_pubkey(issuer);
944
945                 if(!ikey)
946                         {
947                         ctx->error=X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
948                         ok = ctx->verify_cb(0, ctx);
949                         if (!ok) goto err;
950                         }
951                 else
952                         {
953                         /* Verify CRL signature */
954                         if(X509_CRL_verify(crl, ikey) <= 0)
955                                 {
956                                 ctx->error=X509_V_ERR_CRL_SIGNATURE_FAILURE;
957                                 ok = ctx->verify_cb(0, ctx);
958                                 if (!ok) goto err;
959                                 }
960                         }
961                 }
962
963         ok = check_crl_time(ctx, crl, 1);
964         if (!ok)
965                 goto err;
966
967         ok = 1;
968
969         err:
970         EVP_PKEY_free(ikey);
971         return ok;
972         }
973
974 /* Check certificate against CRL */
975 static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x)
976         {
977         int ok;
978         /* Look for serial number of certificate in CRL
979          * If found assume revoked: want something cleverer than
980          * this to handle entry extensions in V2 CRLs.
981          */
982         if (X509_CRL_get0_by_serial(crl, NULL, X509_get_serialNumber(x)) > 0)
983                 {
984                 ctx->error = X509_V_ERR_CERT_REVOKED;
985                 ok = ctx->verify_cb(0, ctx);
986                 if (!ok)
987                         return 0;
988                 }
989
990         if (crl->flags & EXFLAG_CRITICAL)
991                 {
992                 if (ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL)
993                         return 1;
994                 ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION;
995                 ok = ctx->verify_cb(0, ctx);
996                 if(!ok)
997                         return 0;
998                 }
999
1000         return 1;
1001         }
1002
1003 static int check_policy(X509_STORE_CTX *ctx)
1004         {
1005         int ret;
1006         ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain,
1007                                 ctx->param->policies, ctx->param->flags);
1008         if (ret == 0)
1009                 {
1010                 X509err(X509_F_CHECK_POLICY,ERR_R_MALLOC_FAILURE);
1011                 return 0;
1012                 }
1013         /* Invalid or inconsistent extensions */
1014         if (ret == -1)
1015                 {
1016                 /* Locate certificates with bad extensions and notify
1017                  * callback.
1018                  */
1019                 X509 *x;
1020                 int i;
1021                 for (i = 1; i < sk_X509_num(ctx->chain); i++)
1022                         {
1023                         x = sk_X509_value(ctx->chain, i);
1024                         if (!(x->ex_flags & EXFLAG_INVALID_POLICY))
1025                                 continue;
1026                         ctx->current_cert = x;
1027                         ctx->error = X509_V_ERR_INVALID_POLICY_EXTENSION;
1028                         ret = ctx->verify_cb(0, ctx);
1029                         }
1030                 return 1;
1031                 }
1032         if (ret == -2)
1033                 {
1034                 ctx->current_cert = NULL;
1035                 ctx->error = X509_V_ERR_NO_EXPLICIT_POLICY;
1036                 return ctx->verify_cb(0, ctx);
1037                 }
1038
1039         if (ctx->param->flags & X509_V_FLAG_NOTIFY_POLICY)
1040                 {
1041                 ctx->current_cert = NULL;
1042                 ctx->error = X509_V_OK;
1043                 if (!ctx->verify_cb(2, ctx))
1044                         return 0;
1045                 }
1046
1047         return 1;
1048         }
1049
1050 static int check_cert_time(X509_STORE_CTX *ctx, X509 *x)
1051         {
1052         time_t *ptime;
1053         int i;
1054
1055         if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME)
1056                 ptime = &ctx->param->check_time;
1057         else
1058                 ptime = NULL;
1059
1060         i=X509_cmp_time(X509_get_notBefore(x), ptime);
1061         if (i == 0)
1062                 {
1063                 ctx->error=X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
1064                 ctx->current_cert=x;
1065                 if (!ctx->verify_cb(0, ctx))
1066                         return 0;
1067                 }
1068
1069         if (i > 0)
1070                 {
1071                 ctx->error=X509_V_ERR_CERT_NOT_YET_VALID;
1072                 ctx->current_cert=x;
1073                 if (!ctx->verify_cb(0, ctx))
1074                         return 0;
1075                 }
1076
1077         i=X509_cmp_time(X509_get_notAfter(x), ptime);
1078         if (i == 0)
1079                 {
1080                 ctx->error=X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
1081                 ctx->current_cert=x;
1082                 if (!ctx->verify_cb(0, ctx))
1083                         return 0;
1084                 }
1085
1086         if (i < 0)
1087                 {
1088                 ctx->error=X509_V_ERR_CERT_HAS_EXPIRED;
1089                 ctx->current_cert=x;
1090                 if (!ctx->verify_cb(0, ctx))
1091                         return 0;
1092                 }
1093
1094         return 1;
1095         }
1096
1097 static int internal_verify(X509_STORE_CTX *ctx)
1098         {
1099         int ok=0,n;
1100         X509 *xs,*xi;
1101         EVP_PKEY *pkey=NULL;
1102         int (*cb)(int xok,X509_STORE_CTX *xctx);
1103
1104         cb=ctx->verify_cb;
1105
1106         n=sk_X509_num(ctx->chain);
1107         ctx->error_depth=n-1;
1108         n--;
1109         xi=sk_X509_value(ctx->chain,n);
1110
1111         if (ctx->check_issued(ctx, xi, xi))
1112                 xs=xi;
1113         else
1114                 {
1115                 if (n <= 0)
1116                         {
1117                         ctx->error=X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
1118                         ctx->current_cert=xi;
1119                         ok=cb(0,ctx);
1120                         goto end;
1121                         }
1122                 else
1123                         {
1124                         n--;
1125                         ctx->error_depth=n;
1126                         xs=sk_X509_value(ctx->chain,n);
1127                         }
1128                 }
1129
1130 /*      ctx->error=0;  not needed */
1131         while (n >= 0)
1132                 {
1133                 ctx->error_depth=n;
1134                 if (!xs->valid)
1135                         {
1136                         if ((pkey=X509_get_pubkey(xi)) == NULL)
1137                                 {
1138                                 ctx->error=X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
1139                                 ctx->current_cert=xi;
1140                                 ok=(*cb)(0,ctx);
1141                                 if (!ok) goto end;
1142                                 }
1143                         else if (X509_verify(xs,pkey) <= 0)
1144                                 /* XXX  For the final trusted self-signed cert,
1145                                  * this is a waste of time.  That check should
1146                                  * optional so that e.g. 'openssl x509' can be
1147                                  * used to detect invalid self-signatures, but
1148                                  * we don't verify again and again in SSL
1149                                  * handshakes and the like once the cert has
1150                                  * been declared trusted. */
1151                                 {
1152                                 ctx->error=X509_V_ERR_CERT_SIGNATURE_FAILURE;
1153                                 ctx->current_cert=xs;
1154                                 ok=(*cb)(0,ctx);
1155                                 if (!ok)
1156                                         {
1157                                         EVP_PKEY_free(pkey);
1158                                         goto end;
1159                                         }
1160                                 }
1161                         EVP_PKEY_free(pkey);
1162                         pkey=NULL;
1163                         }
1164
1165                 xs->valid = 1;
1166
1167                 ok = check_cert_time(ctx, xs);
1168                 if (!ok)
1169                         goto end;
1170
1171                 /* The last error (if any) is still in the error value */
1172                 ctx->current_issuer=xi;
1173                 ctx->current_cert=xs;
1174                 ok=(*cb)(1,ctx);
1175                 if (!ok) goto end;
1176
1177                 n--;
1178                 if (n >= 0)
1179                         {
1180                         xi=xs;
1181                         xs=sk_X509_value(ctx->chain,n);
1182                         }
1183                 }
1184         ok=1;
1185 end:
1186         return ok;
1187         }
1188
1189 int X509_cmp_current_time(const ASN1_TIME *ctm)
1190 {
1191         return X509_cmp_time(ctm, NULL);
1192 }
1193
1194 int X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time)
1195         {
1196         char *str;
1197         ASN1_TIME atm;
1198         long offset;
1199         char buff1[24],buff2[24],*p;
1200         int i,j;
1201
1202         p=buff1;
1203         i=ctm->length;
1204         str=(char *)ctm->data;
1205         if (ctm->type == V_ASN1_UTCTIME)
1206                 {
1207                 if ((i < 11) || (i > 17)) return 0;
1208                 memcpy(p,str,10);
1209                 p+=10;
1210                 str+=10;
1211                 }
1212         else
1213                 {
1214                 if (i < 13) return 0;
1215                 memcpy(p,str,12);
1216                 p+=12;
1217                 str+=12;
1218                 }
1219
1220         if ((*str == 'Z') || (*str == '-') || (*str == '+'))
1221                 { *(p++)='0'; *(p++)='0'; }
1222         else
1223                 { 
1224                 *(p++)= *(str++);
1225                 *(p++)= *(str++);
1226                 /* Skip any fractional seconds... */
1227                 if (*str == '.')
1228                         {
1229                         str++;
1230                         while ((*str >= '0') && (*str <= '9')) str++;
1231                         }
1232                 
1233                 }
1234         *(p++)='Z';
1235         *(p++)='\0';
1236
1237         if (*str == 'Z')
1238                 offset=0;
1239         else
1240                 {
1241                 if ((*str != '+') && (*str != '-'))
1242                         return 0;
1243                 offset=((str[1]-'0')*10+(str[2]-'0'))*60;
1244                 offset+=(str[3]-'0')*10+(str[4]-'0');
1245                 if (*str == '-')
1246                         offset= -offset;
1247                 }
1248         atm.type=ctm->type;
1249         atm.length=sizeof(buff2);
1250         atm.data=(unsigned char *)buff2;
1251
1252         if (X509_time_adj(&atm,-offset*60, cmp_time) == NULL)
1253                 return 0;
1254
1255         if (ctm->type == V_ASN1_UTCTIME)
1256                 {
1257                 i=(buff1[0]-'0')*10+(buff1[1]-'0');
1258                 if (i < 50) i+=100; /* cf. RFC 2459 */
1259                 j=(buff2[0]-'0')*10+(buff2[1]-'0');
1260                 if (j < 50) j+=100;
1261
1262                 if (i < j) return -1;
1263                 if (i > j) return 1;
1264                 }
1265         i=strcmp(buff1,buff2);
1266         if (i == 0) /* wait a second then return younger :-) */
1267                 return -1;
1268         else
1269                 return i;
1270         }
1271
1272 ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj)
1273 {
1274         return X509_time_adj(s, adj, NULL);
1275 }
1276
1277 ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *in_tm)
1278         {
1279         time_t t;
1280         int type = -1;
1281
1282         if (in_tm) t = *in_tm;
1283         else time(&t);
1284
1285         t+=adj;
1286         if (s) type = s->type;
1287         if (type == V_ASN1_UTCTIME) return ASN1_UTCTIME_set(s,t);
1288         if (type == V_ASN1_GENERALIZEDTIME) return ASN1_GENERALIZEDTIME_set(s, t);
1289         return ASN1_TIME_set(s, t);
1290         }
1291
1292 int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain)
1293         {
1294         EVP_PKEY *ktmp=NULL,*ktmp2;
1295         int i,j;
1296
1297         if ((pkey != NULL) && !EVP_PKEY_missing_parameters(pkey)) return 1;
1298
1299         for (i=0; i<sk_X509_num(chain); i++)
1300                 {
1301                 ktmp=X509_get_pubkey(sk_X509_value(chain,i));
1302                 if (ktmp == NULL)
1303                         {
1304                         X509err(X509_F_X509_GET_PUBKEY_PARAMETERS,X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY);
1305                         return 0;
1306                         }
1307                 if (!EVP_PKEY_missing_parameters(ktmp))
1308                         break;
1309                 else
1310                         {
1311                         EVP_PKEY_free(ktmp);
1312                         ktmp=NULL;
1313                         }
1314                 }
1315         if (ktmp == NULL)
1316                 {
1317                 X509err(X509_F_X509_GET_PUBKEY_PARAMETERS,X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN);
1318                 return 0;
1319                 }
1320
1321         /* first, populate the other certs */
1322         for (j=i-1; j >= 0; j--)
1323                 {
1324                 ktmp2=X509_get_pubkey(sk_X509_value(chain,j));
1325                 EVP_PKEY_copy_parameters(ktmp2,ktmp);
1326                 EVP_PKEY_free(ktmp2);
1327                 }
1328         
1329         if (pkey != NULL) EVP_PKEY_copy_parameters(pkey,ktmp);
1330         EVP_PKEY_free(ktmp);
1331         return 1;
1332         }
1333
1334 int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
1335              CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
1336         {
1337         /* This function is (usually) called only once, by
1338          * SSL_get_ex_data_X509_STORE_CTX_idx (ssl/ssl_cert.c). */
1339         return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE_CTX, argl, argp,
1340                         new_func, dup_func, free_func);
1341         }
1342
1343 int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data)
1344         {
1345         return CRYPTO_set_ex_data(&ctx->ex_data,idx,data);
1346         }
1347
1348 void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx)
1349         {
1350         return CRYPTO_get_ex_data(&ctx->ex_data,idx);
1351         }
1352
1353 int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx)
1354         {
1355         return ctx->error;
1356         }
1357
1358 void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int err)
1359         {
1360         ctx->error=err;
1361         }
1362
1363 int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx)
1364         {
1365         return ctx->error_depth;
1366         }
1367
1368 X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx)
1369         {
1370         return ctx->current_cert;
1371         }
1372
1373 STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx)
1374         {
1375         return ctx->chain;
1376         }
1377
1378 STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx)
1379         {
1380         int i;
1381         X509 *x;
1382         STACK_OF(X509) *chain;
1383         if (!ctx->chain || !(chain = sk_X509_dup(ctx->chain))) return NULL;
1384         for (i = 0; i < sk_X509_num(chain); i++)
1385                 {
1386                 x = sk_X509_value(chain, i);
1387                 CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509);
1388                 }
1389         return chain;
1390         }
1391
1392 void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *x)
1393         {
1394         ctx->cert=x;
1395         }
1396
1397 void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
1398         {
1399         ctx->untrusted=sk;
1400         }
1401
1402 void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, STACK_OF(X509_CRL) *sk)
1403         {
1404         ctx->crls=sk;
1405         }
1406
1407 int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose)
1408         {
1409         return X509_STORE_CTX_purpose_inherit(ctx, 0, purpose, 0);
1410         }
1411
1412 int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust)
1413         {
1414         return X509_STORE_CTX_purpose_inherit(ctx, 0, 0, trust);
1415         }
1416
1417 /* This function is used to set the X509_STORE_CTX purpose and trust
1418  * values. This is intended to be used when another structure has its
1419  * own trust and purpose values which (if set) will be inherited by
1420  * the ctx. If they aren't set then we will usually have a default
1421  * purpose in mind which should then be used to set the trust value.
1422  * An example of this is SSL use: an SSL structure will have its own
1423  * purpose and trust settings which the application can set: if they
1424  * aren't set then we use the default of SSL client/server.
1425  */
1426
1427 int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
1428                                 int purpose, int trust)
1429 {
1430         int idx;
1431         /* If purpose not set use default */
1432         if (!purpose) purpose = def_purpose;
1433         /* If we have a purpose then check it is valid */
1434         if (purpose)
1435                 {
1436                 X509_PURPOSE *ptmp;
1437                 idx = X509_PURPOSE_get_by_id(purpose);
1438                 if (idx == -1)
1439                         {
1440                         X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
1441                                                 X509_R_UNKNOWN_PURPOSE_ID);
1442                         return 0;
1443                         }
1444                 ptmp = X509_PURPOSE_get0(idx);
1445                 if (ptmp->trust == X509_TRUST_DEFAULT)
1446                         {
1447                         idx = X509_PURPOSE_get_by_id(def_purpose);
1448                         if (idx == -1)
1449                                 {
1450                                 X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
1451                                                 X509_R_UNKNOWN_PURPOSE_ID);
1452                                 return 0;
1453                                 }
1454                         ptmp = X509_PURPOSE_get0(idx);
1455                         }
1456                 /* If trust not set then get from purpose default */
1457                 if (!trust) trust = ptmp->trust;
1458                 }
1459         if (trust)
1460                 {
1461                 idx = X509_TRUST_get_by_id(trust);
1462                 if (idx == -1)
1463                         {
1464                         X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
1465                                                 X509_R_UNKNOWN_TRUST_ID);
1466                         return 0;
1467                         }
1468                 }
1469
1470         if (purpose && !ctx->param->purpose) ctx->param->purpose = purpose;
1471         if (trust && !ctx->param->trust) ctx->param->trust = trust;
1472         return 1;
1473 }
1474
1475 X509_STORE_CTX *X509_STORE_CTX_new(void)
1476 {
1477         X509_STORE_CTX *ctx;
1478         ctx = (X509_STORE_CTX *)OPENSSL_malloc(sizeof(X509_STORE_CTX));
1479         if (!ctx)
1480                 {
1481                 X509err(X509_F_X509_STORE_CTX_NEW,ERR_R_MALLOC_FAILURE);
1482                 return NULL;
1483                 }
1484         memset(ctx, 0, sizeof(X509_STORE_CTX));
1485         return ctx;
1486 }
1487
1488 void X509_STORE_CTX_free(X509_STORE_CTX *ctx)
1489 {
1490         X509_STORE_CTX_cleanup(ctx);
1491         OPENSSL_free(ctx);
1492 }
1493
1494 int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509,
1495              STACK_OF(X509) *chain)
1496         {
1497         int ret = 1;
1498         ctx->ctx=store;
1499         ctx->current_method=0;
1500         ctx->cert=x509;
1501         ctx->untrusted=chain;
1502         ctx->crls = NULL;
1503         ctx->last_untrusted=0;
1504         ctx->other_ctx=NULL;
1505         ctx->valid=0;
1506         ctx->chain=NULL;
1507         ctx->error=0;
1508         ctx->explicit_policy=0;
1509         ctx->error_depth=0;
1510         ctx->current_cert=NULL;
1511         ctx->current_issuer=NULL;
1512         ctx->tree = NULL;
1513
1514         ctx->param = X509_VERIFY_PARAM_new();
1515
1516         if (!ctx->param)
1517                 {
1518                 X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
1519                 return 0;
1520                 }
1521
1522         /* Inherit callbacks and flags from X509_STORE if not set
1523          * use defaults.
1524          */
1525
1526
1527         if (store)
1528                 ret = X509_VERIFY_PARAM_inherit(ctx->param, store->param);
1529         else
1530                 ctx->param->flags |= X509_VP_FLAG_DEFAULT|X509_VP_FLAG_ONCE;
1531
1532         if (store)
1533                 {
1534                 ctx->verify_cb = store->verify_cb;
1535                 ctx->cleanup = store->cleanup;
1536                 }
1537         else
1538                 ctx->cleanup = 0;
1539
1540         if (ret)
1541                 ret = X509_VERIFY_PARAM_inherit(ctx->param,
1542                                         X509_VERIFY_PARAM_lookup("default"));
1543
1544         if (ret == 0)
1545                 {
1546                 X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
1547                 return 0;
1548                 }
1549
1550         if (store && store->check_issued)
1551                 ctx->check_issued = store->check_issued;
1552         else
1553                 ctx->check_issued = check_issued;
1554
1555         if (store && store->get_issuer)
1556                 ctx->get_issuer = store->get_issuer;
1557         else
1558                 ctx->get_issuer = X509_STORE_CTX_get1_issuer;
1559
1560         if (store && store->verify_cb)
1561                 ctx->verify_cb = store->verify_cb;
1562         else
1563                 ctx->verify_cb = null_callback;
1564
1565         if (store && store->verify)
1566                 ctx->verify = store->verify;
1567         else
1568                 ctx->verify = internal_verify;
1569
1570         if (store && store->check_revocation)
1571                 ctx->check_revocation = store->check_revocation;
1572         else
1573                 ctx->check_revocation = check_revocation;
1574
1575         if (store && store->get_crl)
1576                 ctx->get_crl = store->get_crl;
1577         else
1578                 ctx->get_crl = get_crl;
1579
1580         if (store && store->check_crl)
1581                 ctx->check_crl = store->check_crl;
1582         else
1583                 ctx->check_crl = check_crl;
1584
1585         if (store && store->cert_crl)
1586                 ctx->cert_crl = store->cert_crl;
1587         else
1588                 ctx->cert_crl = cert_crl;
1589
1590         if (store && store->lookup_certs)
1591                 ctx->lookup_certs = store->lookup_certs;
1592         else
1593                 ctx->lookup_certs = X509_STORE_get1_certs;
1594
1595         if (store && store->lookup_crls)
1596                 ctx->lookup_crls = store->lookup_crls;
1597         else
1598                 ctx->lookup_crls = X509_STORE_get1_crls;
1599
1600         ctx->check_policy = check_policy;
1601
1602
1603         /* This memset() can't make any sense anyway, so it's removed. As
1604          * X509_STORE_CTX_cleanup does a proper "free" on the ex_data, we put a
1605          * corresponding "new" here and remove this bogus initialisation. */
1606         /* memset(&(ctx->ex_data),0,sizeof(CRYPTO_EX_DATA)); */
1607         if(!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE_CTX, ctx,
1608                                 &(ctx->ex_data)))
1609                 {
1610                 OPENSSL_free(ctx);
1611                 X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
1612                 return 0;
1613                 }
1614         return 1;
1615         }
1616
1617 /* Set alternative lookup method: just a STACK of trusted certificates.
1618  * This avoids X509_STORE nastiness where it isn't needed.
1619  */
1620
1621 void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
1622 {
1623         ctx->other_ctx = sk;
1624         ctx->get_issuer = get_issuer_sk;
1625 }
1626
1627 void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx)
1628         {
1629         if (ctx->cleanup) ctx->cleanup(ctx);
1630         if (ctx->param != NULL)
1631                 {
1632                 X509_VERIFY_PARAM_free(ctx->param);
1633                 ctx->param=NULL;
1634                 }
1635         if (ctx->tree != NULL)
1636                 {
1637                 X509_policy_tree_free(ctx->tree);
1638                 ctx->tree=NULL;
1639                 }
1640         if (ctx->chain != NULL)
1641                 {
1642                 sk_X509_pop_free(ctx->chain,X509_free);
1643                 ctx->chain=NULL;
1644                 }
1645         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE_CTX, ctx, &(ctx->ex_data));
1646         memset(&ctx->ex_data,0,sizeof(CRYPTO_EX_DATA));
1647         }
1648
1649 void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth)
1650         {
1651         X509_VERIFY_PARAM_set_depth(ctx->param, depth);
1652         }
1653
1654 void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags)
1655         {
1656         X509_VERIFY_PARAM_set_flags(ctx->param, flags);
1657         }
1658
1659 void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, time_t t)
1660         {
1661         X509_VERIFY_PARAM_set_time(ctx->param, t);
1662         }
1663
1664 void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx,
1665                                   int (*verify_cb)(int, X509_STORE_CTX *))
1666         {
1667         ctx->verify_cb=verify_cb;
1668         }
1669
1670 X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx)
1671         {
1672         return ctx->tree;
1673         }
1674
1675 int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx)
1676         {
1677         return ctx->explicit_policy;
1678         }
1679
1680 int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name)
1681         {
1682         const X509_VERIFY_PARAM *param;
1683         param = X509_VERIFY_PARAM_lookup(name);
1684         if (!param)
1685                 return 0;
1686         return X509_VERIFY_PARAM_inherit(ctx->param, param);
1687         }
1688
1689 X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx)
1690         {
1691         return ctx->param;
1692         }
1693
1694 void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param)
1695         {
1696         if (ctx->param)
1697                 X509_VERIFY_PARAM_free(ctx->param);
1698         ctx->param = param;
1699         }
1700
1701 IMPLEMENT_STACK_OF(X509)
1702 IMPLEMENT_ASN1_SET_OF(X509)
1703
1704 IMPLEMENT_STACK_OF(X509_NAME)
1705
1706 IMPLEMENT_STACK_OF(X509_ATTRIBUTE)
1707 IMPLEMENT_ASN1_SET_OF(X509_ATTRIBUTE)