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