431a620618debf144fcfd71b84086cb40aac3748
[openssl.git] / crypto / x509 / x509_vfy.c
1 /* crypto/x509/x509_vfy.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  * 
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  * 
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  * 
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from 
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  * 
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  * 
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58
59 #include <stdio.h>
60 #include <time.h>
61 #include <errno.h>
62
63 #include "cryptlib.h"
64 #include <openssl/crypto.h>
65 #include <openssl/lhash.h>
66 #include <openssl/buffer.h>
67 #include <openssl/evp.h>
68 #include <openssl/asn1.h>
69 #include <openssl/x509.h>
70 #include <openssl/x509v3.h>
71 #include <openssl/objects.h>
72
73 static int null_callback(int ok,X509_STORE_CTX *e);
74 static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
75 static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x);
76 static int check_chain_extensions(X509_STORE_CTX *ctx);
77 static int check_trust(X509_STORE_CTX *ctx);
78 static int check_revocation(X509_STORE_CTX *ctx);
79 static int check_cert(X509_STORE_CTX *ctx);
80 static int check_policy(X509_STORE_CTX *ctx);
81 static int internal_verify(X509_STORE_CTX *ctx);
82 const char *X509_version="X.509" OPENSSL_VERSION_PTEXT;
83
84
85 static int null_callback(int ok, X509_STORE_CTX *e)
86         {
87         return ok;
88         }
89
90 #if 0
91 static int x509_subject_cmp(X509 **a, X509 **b)
92         {
93         return X509_subject_name_cmp(*a,*b);
94         }
95 #endif
96
97 int X509_verify_cert(X509_STORE_CTX *ctx)
98         {
99         X509 *x,*xtmp,*chain_ss=NULL;
100         X509_NAME *xn;
101         int bad_chain = 0;
102         X509_VERIFY_PARAM *param = ctx->param;
103         int depth,i,ok=0;
104         int num;
105         int (*cb)(int ok,X509_STORE_CTX *ctx);
106         STACK_OF(X509) *sktmp=NULL;
107         if (ctx->cert == NULL)
108                 {
109                 X509err(X509_F_X509_VERIFY_CERT,X509_R_NO_CERT_SET_FOR_US_TO_VERIFY);
110                 return -1;
111                 }
112
113         cb=ctx->verify_cb;
114
115         /* first we make sure the chain we are going to build is
116          * present and that the first entry is in place */
117         if (ctx->chain == NULL)
118                 {
119                 if (    ((ctx->chain=sk_X509_new_null()) == NULL) ||
120                         (!sk_X509_push(ctx->chain,ctx->cert)))
121                         {
122                         X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
123                         goto end;
124                         }
125                 CRYPTO_add(&ctx->cert->references,1,CRYPTO_LOCK_X509);
126                 ctx->last_untrusted=1;
127                 }
128
129         /* We use a temporary STACK so we can chop and hack at it */
130         if (ctx->untrusted != NULL
131             && (sktmp=sk_X509_dup(ctx->untrusted)) == NULL)
132                 {
133                 X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
134                 goto end;
135                 }
136
137         num=sk_X509_num(ctx->chain);
138         x=sk_X509_value(ctx->chain,num-1);
139         depth=param->depth;
140
141
142         for (;;)
143                 {
144                 /* If we have enough, we break */
145                 if (depth < num) break; /* FIXME: If this happens, we should take
146                                          * note of it and, if appropriate, use the
147                                          * X509_V_ERR_CERT_CHAIN_TOO_LONG error
148                                          * code later.
149                                          */
150
151                 /* If we are self signed, we break */
152                 xn=X509_get_issuer_name(x);
153                 if (ctx->check_issued(ctx, x,x)) break;
154
155                 /* If we were passed a cert chain, use it first */
156                 if (ctx->untrusted != NULL)
157                         {
158                         xtmp=find_issuer(ctx, sktmp,x);
159                         if (xtmp != NULL)
160                                 {
161                                 if (!sk_X509_push(ctx->chain,xtmp))
162                                         {
163                                         X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
164                                         goto end;
165                                         }
166                                 CRYPTO_add(&xtmp->references,1,CRYPTO_LOCK_X509);
167                                 sk_X509_delete_ptr(sktmp,xtmp);
168                                 ctx->last_untrusted++;
169                                 x=xtmp;
170                                 num++;
171                                 /* reparse the full chain for
172                                  * the next one */
173                                 continue;
174                                 }
175                         }
176                 break;
177                 }
178
179         /* at this point, chain should contain a list of untrusted
180          * certificates.  We now need to add at least one trusted one,
181          * if possible, otherwise we complain. */
182
183         /* Examine last certificate in chain and see if it
184          * is self signed.
185          */
186
187         i=sk_X509_num(ctx->chain);
188         x=sk_X509_value(ctx->chain,i-1);
189         xn = X509_get_subject_name(x);
190         if (ctx->check_issued(ctx, x, x))
191                 {
192                 /* we have a self signed certificate */
193                 if (sk_X509_num(ctx->chain) == 1)
194                         {
195                         /* We have a single self signed certificate: see if
196                          * we can find it in the store. We must have an exact
197                          * match to avoid possible impersonation.
198                          */
199                         ok = ctx->get_issuer(&xtmp, ctx, x);
200                         if ((ok <= 0) || X509_cmp(x, xtmp)) 
201                                 {
202                                 ctx->error=X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT;
203                                 ctx->current_cert=x;
204                                 ctx->error_depth=i-1;
205                                 if (ok == 1) X509_free(xtmp);
206                                 bad_chain = 1;
207                                 ok=cb(0,ctx);
208                                 if (!ok) goto end;
209                                 }
210                         else 
211                                 {
212                                 /* We have a match: replace certificate with store version
213                                  * so we get any trust settings.
214                                  */
215                                 X509_free(x);
216                                 x = xtmp;
217                                 sk_X509_set(ctx->chain, i - 1, x);
218                                 ctx->last_untrusted=0;
219                                 }
220                         }
221                 else
222                         {
223                         /* extract and save self signed certificate for later use */
224                         chain_ss=sk_X509_pop(ctx->chain);
225                         ctx->last_untrusted--;
226                         num--;
227                         x=sk_X509_value(ctx->chain,num-1);
228                         }
229                 }
230
231         /* We now lookup certs from the certificate store */
232         for (;;)
233                 {
234                 /* If we have enough, we break */
235                 if (depth < num) break;
236
237                 /* If we are self signed, we break */
238                 xn=X509_get_issuer_name(x);
239                 if (ctx->check_issued(ctx,x,x)) break;
240
241                 ok = ctx->get_issuer(&xtmp, ctx, x);
242
243                 if (ok < 0) return ok;
244                 if (ok == 0) break;
245
246                 x = xtmp;
247                 if (!sk_X509_push(ctx->chain,x))
248                         {
249                         X509_free(xtmp);
250                         X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
251                         return 0;
252                         }
253                 num++;
254                 }
255
256         /* we now have our chain, lets check it... */
257         xn=X509_get_issuer_name(x);
258
259         /* Is last certificate looked up self signed? */
260         if (!ctx->check_issued(ctx,x,x))
261                 {
262                 if ((chain_ss == NULL) || !ctx->check_issued(ctx, x, chain_ss))
263                         {
264                         if (ctx->last_untrusted >= num)
265                                 ctx->error=X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY;
266                         else
267                                 ctx->error=X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
268                         ctx->current_cert=x;
269                         }
270                 else
271                         {
272
273                         sk_X509_push(ctx->chain,chain_ss);
274                         num++;
275                         ctx->last_untrusted=num;
276                         ctx->current_cert=chain_ss;
277                         ctx->error=X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN;
278                         chain_ss=NULL;
279                         }
280
281                 ctx->error_depth=num-1;
282                 bad_chain = 1;
283                 ok=cb(0,ctx);
284                 if (!ok) goto end;
285                 }
286
287         /* We have the chain complete: now we need to check its purpose */
288         ok = check_chain_extensions(ctx);
289
290         if (!ok) goto end;
291
292         /* The chain extensions are OK: check trust */
293
294         if (param->trust > 0) ok = check_trust(ctx);
295
296         if (!ok) goto end;
297
298         /* We may as well copy down any DSA parameters that are required */
299         X509_get_pubkey_parameters(NULL,ctx->chain);
300
301         /* Check revocation status: we do this after copying parameters
302          * because they may be needed for CRL signature verification.
303          */
304
305         ok = ctx->check_revocation(ctx);
306         if(!ok) goto end;
307
308         /* At this point, we have a chain and need to verify it */
309         if (ctx->verify != NULL)
310                 ok=ctx->verify(ctx);
311         else
312                 ok=internal_verify(ctx);
313         if(!ok) goto end;
314
315         /* If we get this far evaluate policies */
316         if (!bad_chain && (ctx->param->flags & X509_V_FLAG_POLICY_CHECK))
317                 ok = ctx->check_policy(ctx);
318         if(!ok) goto end;
319         if (0)
320                 {
321 end:
322                 X509_get_pubkey_parameters(NULL,ctx->chain);
323                 }
324         if (sktmp != NULL) sk_X509_free(sktmp);
325         if (chain_ss != NULL) X509_free(chain_ss);
326         return ok;
327         }
328
329
330 /* Given a STACK_OF(X509) find the issuer of cert (if any)
331  */
332
333 static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x)
334 {
335         int i;
336         X509 *issuer;
337         for (i = 0; i < sk_X509_num(sk); i++)
338                 {
339                 issuer = sk_X509_value(sk, i);
340                 if (ctx->check_issued(ctx, x, issuer))
341                         return issuer;
342                 }
343         return NULL;
344 }
345
346 /* Given a possible certificate and issuer check them */
347
348 static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer)
349 {
350         int ret;
351         ret = X509_check_issued(issuer, x);
352         if (ret == X509_V_OK)
353                 return 1;
354         /* If we haven't asked for issuer errors don't set ctx */
355         if (!(ctx->param->flags & X509_V_FLAG_CB_ISSUER_CHECK))
356                 return 0;
357
358         ctx->error = ret;
359         ctx->current_cert = x;
360         ctx->current_issuer = issuer;
361         return ctx->verify_cb(0, ctx);
362         return 0;
363 }
364
365 /* Alternative lookup method: look from a STACK stored in other_ctx */
366
367 static int get_issuer_sk(X509 **issuer, X509_STORE_CTX *ctx, X509 *x)
368 {
369         *issuer = find_issuer(ctx, ctx->other_ctx, x);
370         if (*issuer)
371                 {
372                 CRYPTO_add(&(*issuer)->references,1,CRYPTO_LOCK_X509);
373                 return 1;
374                 }
375         else
376                 return 0;
377 }
378         
379
380 /* Check a certificate chains extensions for consistency
381  * with the supplied purpose
382  */
383
384 static int check_chain_extensions(X509_STORE_CTX *ctx)
385 {
386 #ifdef OPENSSL_NO_CHAIN_VERIFY
387         return 1;
388 #else
389         int i, ok=0, must_be_ca;
390         X509 *x;
391         int (*cb)(int ok,X509_STORE_CTX *ctx);
392         int proxy_path_length = 0;
393         cb=ctx->verify_cb;
394
395         /* must_be_ca can have 1 of 3 values:
396            -1: we accept both CA and non-CA certificates, to allow direct
397                use of self-signed certificates (which are marked as CA).
398            0:  we only accept non-CA certificates.  This is currently not
399                used, but the possibility is present for future extensions.
400            1:  we only accept CA certificates.  This is currently used for
401                all certificates in the chain except the leaf certificate.
402         */
403         must_be_ca = -1;
404         /* Check all untrusted certificates */
405         for (i = 0; i < ctx->last_untrusted; i++)
406                 {
407                 int ret;
408                 x = sk_X509_value(ctx->chain, i);
409                 if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL)
410                         && (x->ex_flags & EXFLAG_CRITICAL))
411                         {
412                         ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION;
413                         ctx->error_depth = i;
414                         ctx->current_cert = x;
415                         ok=cb(0,ctx);
416                         if (!ok) goto end;
417                         }
418                 ret = X509_check_ca(x);
419                 switch(must_be_ca)
420                         {
421                 case -1:
422                         if ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
423                                 && (ret != 1) && (ret != 0))
424                                 {
425                                 ret = 0;
426                                 ctx->error = X509_V_ERR_INVALID_CA;
427                                 }
428                         else
429                                 ret = 1;
430                         break;
431                 case 0:
432                         if (ret != 0)
433                                 {
434                                 ret = 0;
435                                 ctx->error = X509_V_ERR_INVALID_NON_CA;
436                                 }
437                         else
438                                 ret = 1;
439                         break;
440                 default:
441                         if ((ret == 0)
442                                 || ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
443                                         && (ret != 1)))
444                                 {
445                                 ret = 0;
446                                 ctx->error = X509_V_ERR_INVALID_CA;
447                                 }
448                         else
449                                 ret = 1;
450                         break;
451                         }
452                 if (ret == 0)
453                         {
454                         ctx->error_depth = i;
455                         ctx->current_cert = x;
456                         ok=cb(0,ctx);
457                         if (!ok) goto end;
458                         }
459                 if (ctx->param->purpose > 0)
460                         {
461                         ret = X509_check_purpose(x, ctx->param->purpose,
462                                 must_be_ca > 0);
463                         if ((ret == 0)
464                                 || ((ctx->param->flags & X509_V_FLAG_X509_STRICT)
465                                         && (ret != 1)))
466                                 {
467                                 ctx->error = X509_V_ERR_INVALID_PURPOSE;
468                                 ctx->error_depth = i;
469                                 ctx->current_cert = x;
470                                 ok=cb(0,ctx);
471                                 if (!ok) goto end;
472                                 }
473                         }
474                 /* Check pathlen */
475                 if ((i > 1) && (x->ex_pathlen != -1)
476                            && (i > (x->ex_pathlen + proxy_path_length + 1)))
477                         {
478                         ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED;
479                         ctx->error_depth = i;
480                         ctx->current_cert = x;
481                         ok=cb(0,ctx);
482                         if (!ok) goto end;
483                         }
484                 /* If this certificate is a proxy certificate, the next
485                    certificate must be another proxy certificate or a EE
486                    certificate.  If not, the next certificate must be a
487                    CA certificate.  */
488                 if (x->ex_flags & EXFLAG_PROXY)
489                         {
490                         if (x->ex_pcpathlen != -1 && i > x->ex_pcpathlen)
491                                 {
492                                 ctx->error =
493                                         X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED;
494                                 ctx->error_depth = i;
495                                 ctx->current_cert = x;
496                                 ok=cb(0,ctx);
497                                 if (!ok) goto end;
498                                 }
499                         proxy_path_length++;
500                         must_be_ca = 0;
501                         }
502                 else
503                         must_be_ca = 1;
504                 }
505         ok = 1;
506  end:
507         return ok;
508 #endif
509 }
510
511 static int check_trust(X509_STORE_CTX *ctx)
512 {
513 #ifdef OPENSSL_NO_CHAIN_VERIFY
514         return 1;
515 #else
516         int i, ok;
517         X509 *x;
518         int (*cb)(int ok,X509_STORE_CTX *ctx);
519         cb=ctx->verify_cb;
520 /* For now just check the last certificate in the chain */
521         i = sk_X509_num(ctx->chain) - 1;
522         x = sk_X509_value(ctx->chain, i);
523         ok = X509_check_trust(x, ctx->param->trust, 0);
524         if (ok == X509_TRUST_TRUSTED)
525                 return 1;
526         ctx->error_depth = i;
527         ctx->current_cert = x;
528         if (ok == X509_TRUST_REJECTED)
529                 ctx->error = X509_V_ERR_CERT_REJECTED;
530         else
531                 ctx->error = X509_V_ERR_CERT_UNTRUSTED;
532         ok = cb(0, ctx);
533         return ok;
534 #endif
535 }
536
537 static int check_revocation(X509_STORE_CTX *ctx)
538         {
539         int i, last, ok;
540         if (!(ctx->param->flags & X509_V_FLAG_CRL_CHECK))
541                 return 1;
542         if (ctx->param->flags & X509_V_FLAG_CRL_CHECK_ALL)
543                 last = sk_X509_num(ctx->chain) - 1;
544         else
545                 last = 0;
546         for(i = 0; i <= last; i++)
547                 {
548                 ctx->error_depth = i;
549                 ok = check_cert(ctx);
550                 if (!ok) return ok;
551                 }
552         return 1;
553         }
554
555 static int check_cert(X509_STORE_CTX *ctx)
556         {
557         X509_CRL *crl = NULL;
558         X509 *x;
559         int ok, cnum;
560         cnum = ctx->error_depth;
561         x = sk_X509_value(ctx->chain, cnum);
562         ctx->current_cert = x;
563         /* Try to retrieve relevant CRL */
564         ok = ctx->get_crl(ctx, &crl, x);
565         /* If error looking up CRL, nothing we can do except
566          * notify callback
567          */
568         if(!ok)
569                 {
570                 ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL;
571                 ok = ctx->verify_cb(0, ctx);
572                 goto err;
573                 }
574         ctx->current_crl = crl;
575         ok = ctx->check_crl(ctx, crl);
576         if (!ok) goto err;
577         ok = ctx->cert_crl(ctx, crl, x);
578         err:
579         ctx->current_crl = NULL;
580         X509_CRL_free(crl);
581         return ok;
582
583         }
584
585 /* Check CRL times against values in X509_STORE_CTX */
586
587 static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify)
588         {
589         time_t *ptime;
590         int i;
591         ctx->current_crl = crl;
592         if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME)
593                 ptime = &ctx->param->check_time;
594         else
595                 ptime = NULL;
596
597         i=X509_cmp_time(X509_CRL_get_lastUpdate(crl), ptime);
598         if (i == 0)
599                 {
600                 ctx->error=X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD;
601                 if (!notify || !ctx->verify_cb(0, ctx))
602                         return 0;
603                 }
604
605         if (i > 0)
606                 {
607                 ctx->error=X509_V_ERR_CRL_NOT_YET_VALID;
608                 if (!notify || !ctx->verify_cb(0, ctx))
609                         return 0;
610                 }
611
612         if(X509_CRL_get_nextUpdate(crl))
613                 {
614                 i=X509_cmp_time(X509_CRL_get_nextUpdate(crl), ptime);
615
616                 if (i == 0)
617                         {
618                         ctx->error=X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD;
619                         if (!notify || !ctx->verify_cb(0, ctx))
620                                 return 0;
621                         }
622
623                 if (i < 0)
624                         {
625                         ctx->error=X509_V_ERR_CRL_HAS_EXPIRED;
626                         if (!notify || !ctx->verify_cb(0, ctx))
627                                 return 0;
628                         }
629                 }
630
631         ctx->current_crl = NULL;
632
633         return 1;
634         }
635
636 /* Lookup CRLs from the supplied list. Look for matching isser name
637  * and validity. If we can't find a valid CRL return the last one
638  * with matching name. This gives more meaningful error codes. Otherwise
639  * we'd get a CRL not found error if a CRL existed with matching name but
640  * was invalid.
641  */
642
643 static int get_crl_sk(X509_STORE_CTX *ctx, X509_CRL **pcrl,
644                         X509_NAME *nm, STACK_OF(X509_CRL) *crls)
645         {
646         int i;
647         X509_CRL *crl, *best_crl = NULL;
648         for (i = 0; i < sk_X509_CRL_num(crls); i++)
649                 {
650                 crl = sk_X509_CRL_value(crls, i);
651                 if (X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)))
652                         continue;
653                 if (check_crl_time(ctx, crl, 0))
654                         {
655                         *pcrl = crl;
656                         CRYPTO_add(&crl->references, 1, CRYPTO_LOCK_X509);
657                         return 1;
658                         }
659                 best_crl = crl;
660                 }
661         if (best_crl)
662                 {
663                 *pcrl = best_crl;
664                 CRYPTO_add(&best_crl->references, 1, CRYPTO_LOCK_X509);
665                 }
666                 
667         return 0;
668         }
669
670 /* Retrieve CRL corresponding to certificate: currently just a
671  * subject lookup: maybe use AKID later...
672  */
673 static int get_crl(X509_STORE_CTX *ctx, X509_CRL **pcrl, X509 *x)
674         {
675         int ok;
676         X509_CRL *crl = NULL;
677         X509_OBJECT xobj;
678         X509_NAME *nm;
679         nm = X509_get_issuer_name(x);
680         ok = get_crl_sk(ctx, &crl, nm, ctx->crls);
681         if (ok)
682                 {
683                 *pcrl = crl;
684                 return 1;
685                 }
686
687         ok = X509_STORE_get_by_subject(ctx, X509_LU_CRL, nm, &xobj);
688
689         if (!ok)
690                 {
691                 /* If we got a near match from get_crl_sk use that */
692                 if (crl)
693                         {
694                         *pcrl = crl;
695                         return 1;
696                         }
697                 return 0;
698                 }
699
700         *pcrl = xobj.data.crl;
701         if (crl)
702                 X509_CRL_free(crl);
703         return 1;
704         }
705
706 /* Check CRL validity */
707 static int check_crl(X509_STORE_CTX *ctx, X509_CRL *crl)
708         {
709         X509 *issuer = NULL;
710         EVP_PKEY *ikey = NULL;
711         int ok = 0, chnum, cnum;
712         cnum = ctx->error_depth;
713         chnum = sk_X509_num(ctx->chain) - 1;
714         /* Find CRL issuer: if not last certificate then issuer
715          * is next certificate in chain.
716          */
717         if(cnum < chnum)
718                 issuer = sk_X509_value(ctx->chain, cnum + 1);
719         else
720                 {
721                 issuer = sk_X509_value(ctx->chain, chnum);
722                 /* If not self signed, can't check signature */
723                 if(!ctx->check_issued(ctx, issuer, issuer))
724                         {
725                         ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER;
726                         ok = ctx->verify_cb(0, ctx);
727                         if(!ok) goto err;
728                         }
729                 }
730
731         if(issuer)
732                 {
733                 /* Check for cRLSign bit if keyUsage present */
734                 if ((issuer->ex_flags & EXFLAG_KUSAGE) &&
735                         !(issuer->ex_kusage & KU_CRL_SIGN))
736                         {
737                         ctx->error = X509_V_ERR_KEYUSAGE_NO_CRL_SIGN;
738                         ok = ctx->verify_cb(0, ctx);
739                         if(!ok) goto err;
740                         }
741
742                 /* Attempt to get issuer certificate public key */
743                 ikey = X509_get_pubkey(issuer);
744
745                 if(!ikey)
746                         {
747                         ctx->error=X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
748                         ok = ctx->verify_cb(0, ctx);
749                         if (!ok) goto err;
750                         }
751                 else
752                         {
753                         /* Verify CRL signature */
754                         if(X509_CRL_verify(crl, ikey) <= 0)
755                                 {
756                                 ctx->error=X509_V_ERR_CRL_SIGNATURE_FAILURE;
757                                 ok = ctx->verify_cb(0, ctx);
758                                 if (!ok) goto err;
759                                 }
760                         }
761                 }
762
763         if (!check_crl_time(ctx, crl, 1))
764                 goto err;
765
766         ok = 1;
767
768         err:
769         EVP_PKEY_free(ikey);
770         return ok;
771         }
772
773 /* Check certificate against CRL */
774 static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x)
775         {
776         int idx, ok;
777         X509_REVOKED rtmp;
778         STACK_OF(X509_EXTENSION) *exts;
779         X509_EXTENSION *ext;
780         /* Look for serial number of certificate in CRL */
781         rtmp.serialNumber = X509_get_serialNumber(x);
782         /* Sort revoked into serial number order if not already sorted.
783          * Do this under a lock to avoid race condition.
784          */
785         if (!sk_X509_REVOKED_is_sorted(crl->crl->revoked))
786                 {
787                 CRYPTO_w_lock(CRYPTO_LOCK_X509_CRL);
788                 sk_X509_REVOKED_sort(crl->crl->revoked);
789                 CRYPTO_w_unlock(CRYPTO_LOCK_X509_CRL);
790                 }
791         idx = sk_X509_REVOKED_find(crl->crl->revoked, &rtmp);
792         /* If found assume revoked: want something cleverer than
793          * this to handle entry extensions in V2 CRLs.
794          */
795         if(idx >= 0)
796                 {
797                 ctx->error = X509_V_ERR_CERT_REVOKED;
798                 ok = ctx->verify_cb(0, ctx);
799                 if (!ok) return 0;
800                 }
801
802         if (ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL)
803                 return 1;
804
805         /* See if we have any critical CRL extensions: since we
806          * currently don't handle any CRL extensions the CRL must be
807          * rejected. 
808          * This code accesses the X509_CRL structure directly: applications
809          * shouldn't do this.
810          */
811
812         exts = crl->crl->extensions;
813
814         for (idx = 0; idx < sk_X509_EXTENSION_num(exts); idx++)
815                 {
816                 ext = sk_X509_EXTENSION_value(exts, idx);
817                 if (ext->critical > 0)
818                         {
819                         ctx->error =
820                                 X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION;
821                         ok = ctx->verify_cb(0, ctx);
822                         if(!ok) return 0;
823                         break;
824                         }
825                 }
826         return 1;
827         }
828
829 static int check_policy(X509_STORE_CTX *ctx)
830         {
831         int ret;
832         ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain,
833                                 ctx->param->policies, ctx->param->flags);
834         if (ret == 0)
835                 {
836                 X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE);
837                 return 0;
838                 }
839         /* Invalid or inconsistent extensions */
840         if (ret == -1)
841                 {
842                 /* Locate certificates with bad extensions and notify
843                  * callback.
844                  */
845                 X509 *x;
846                 int i;
847                 for (i = 1; i < sk_X509_num(ctx->chain); i++)
848                         {
849                         x = sk_X509_value(ctx->chain, i);
850                         if (!(x->ex_flags & EXFLAG_INVALID_POLICY))
851                                 continue;
852                         ctx->current_cert = x;
853                         ctx->error = X509_V_ERR_INVALID_POLICY_EXTENSION;
854                         ret = ctx->verify_cb(0, ctx);
855                         }
856                 return 1;
857                 }
858         if (ret == -2)
859                 {
860                 ctx->current_cert = NULL;
861                 ctx->error = X509_V_ERR_NO_EXPLICIT_POLICY;
862                 return ctx->verify_cb(0, ctx);
863                 }
864
865         if (ctx->param->flags & X509_V_FLAG_NOTIFY_POLICY)
866                 {
867                 ctx->current_cert = NULL;
868                 ctx->error = X509_V_OK;
869                 if (!ctx->verify_cb(2, ctx))
870                         return 0;
871                 }
872
873         return 1;
874         }
875
876 static int check_cert_time(X509_STORE_CTX *ctx, X509 *x)
877         {
878         time_t *ptime;
879         int i;
880
881         if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME)
882                 ptime = &ctx->param->check_time;
883         else
884                 ptime = NULL;
885
886         i=X509_cmp_time(X509_get_notBefore(x), ptime);
887         if (i == 0)
888                 {
889                 ctx->error=X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD;
890                 ctx->current_cert=x;
891                 if (!ctx->verify_cb(0, ctx))
892                         return 0;
893                 }
894
895         if (i > 0)
896                 {
897                 ctx->error=X509_V_ERR_CERT_NOT_YET_VALID;
898                 ctx->current_cert=x;
899                 if (!ctx->verify_cb(0, ctx))
900                         return 0;
901                 }
902
903         i=X509_cmp_time(X509_get_notAfter(x), ptime);
904         if (i == 0)
905                 {
906                 ctx->error=X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD;
907                 ctx->current_cert=x;
908                 if (!ctx->verify_cb(0, ctx))
909                         return 0;
910                 }
911
912         if (i < 0)
913                 {
914                 ctx->error=X509_V_ERR_CERT_HAS_EXPIRED;
915                 ctx->current_cert=x;
916                 if (!ctx->verify_cb(0, ctx))
917                         return 0;
918                 }
919
920         return 1;
921         }
922
923 static int internal_verify(X509_STORE_CTX *ctx)
924         {
925         int ok=0,n;
926         X509 *xs,*xi;
927         EVP_PKEY *pkey=NULL;
928         int (*cb)(int ok,X509_STORE_CTX *ctx);
929
930         cb=ctx->verify_cb;
931
932         n=sk_X509_num(ctx->chain);
933         ctx->error_depth=n-1;
934         n--;
935         xi=sk_X509_value(ctx->chain,n);
936
937         if (ctx->check_issued(ctx, xi, xi))
938                 xs=xi;
939         else
940                 {
941                 if (n <= 0)
942                         {
943                         ctx->error=X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
944                         ctx->current_cert=xi;
945                         ok=cb(0,ctx);
946                         goto end;
947                         }
948                 else
949                         {
950                         n--;
951                         ctx->error_depth=n;
952                         xs=sk_X509_value(ctx->chain,n);
953                         }
954                 }
955
956 /*      ctx->error=0;  not needed */
957         while (n >= 0)
958                 {
959                 ctx->error_depth=n;
960                 if (!xs->valid)
961                         {
962                         if ((pkey=X509_get_pubkey(xi)) == NULL)
963                                 {
964                                 ctx->error=X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY;
965                                 ctx->current_cert=xi;
966                                 ok=(*cb)(0,ctx);
967                                 if (!ok) goto end;
968                                 }
969                         else if (X509_verify(xs,pkey) <= 0)
970                                 /* XXX  For the final trusted self-signed cert,
971                                  * this is a waste of time.  That check should
972                                  * optional so that e.g. 'openssl x509' can be
973                                  * used to detect invalid self-signatures, but
974                                  * we don't verify again and again in SSL
975                                  * handshakes and the like once the cert has
976                                  * been declared trusted. */
977                                 {
978                                 ctx->error=X509_V_ERR_CERT_SIGNATURE_FAILURE;
979                                 ctx->current_cert=xs;
980                                 ok=(*cb)(0,ctx);
981                                 if (!ok)
982                                         {
983                                         EVP_PKEY_free(pkey);
984                                         goto end;
985                                         }
986                                 }
987                         EVP_PKEY_free(pkey);
988                         pkey=NULL;
989                         }
990
991                 xs->valid = 1;
992
993                 if (!check_cert_time(ctx, xs))
994                         goto end;
995
996                 /* The last error (if any) is still in the error value */
997                 ctx->current_issuer=xi;
998                 ctx->current_cert=xs;
999                 ok=(*cb)(1,ctx);
1000                 if (!ok) goto end;
1001
1002                 n--;
1003                 if (n >= 0)
1004                         {
1005                         xi=xs;
1006                         xs=sk_X509_value(ctx->chain,n);
1007                         }
1008                 }
1009         ok=1;
1010 end:
1011         return ok;
1012         }
1013
1014 int X509_cmp_current_time(ASN1_TIME *ctm)
1015 {
1016         return X509_cmp_time(ctm, NULL);
1017 }
1018
1019 int X509_cmp_time(ASN1_TIME *ctm, time_t *cmp_time)
1020         {
1021         char *str;
1022         ASN1_TIME atm;
1023         long offset;
1024         char buff1[24],buff2[24],*p;
1025         int i,j;
1026
1027         p=buff1;
1028         i=ctm->length;
1029         str=(char *)ctm->data;
1030         if (ctm->type == V_ASN1_UTCTIME)
1031                 {
1032                 if ((i < 11) || (i > 17)) return 0;
1033                 memcpy(p,str,10);
1034                 p+=10;
1035                 str+=10;
1036                 }
1037         else
1038                 {
1039                 if (i < 13) return 0;
1040                 memcpy(p,str,12);
1041                 p+=12;
1042                 str+=12;
1043                 }
1044
1045         if ((*str == 'Z') || (*str == '-') || (*str == '+'))
1046                 { *(p++)='0'; *(p++)='0'; }
1047         else
1048                 { 
1049                 *(p++)= *(str++);
1050                 *(p++)= *(str++);
1051                 /* Skip any fractional seconds... */
1052                 if (*str == '.')
1053                         {
1054                         str++;
1055                         while ((*str >= '0') && (*str <= '9')) str++;
1056                         }
1057                 
1058                 }
1059         *(p++)='Z';
1060         *(p++)='\0';
1061
1062         if (*str == 'Z')
1063                 offset=0;
1064         else
1065                 {
1066                 if ((*str != '+') && (str[5] != '-'))
1067                         return 0;
1068                 offset=((str[1]-'0')*10+(str[2]-'0'))*60;
1069                 offset+=(str[3]-'0')*10+(str[4]-'0');
1070                 if (*str == '-')
1071                         offset= -offset;
1072                 }
1073         atm.type=ctm->type;
1074         atm.length=sizeof(buff2);
1075         atm.data=(unsigned char *)buff2;
1076
1077         if (X509_time_adj(&atm,-offset*60, cmp_time) == NULL)
1078                 return 0;
1079
1080         if (ctm->type == V_ASN1_UTCTIME)
1081                 {
1082                 i=(buff1[0]-'0')*10+(buff1[1]-'0');
1083                 if (i < 50) i+=100; /* cf. RFC 2459 */
1084                 j=(buff2[0]-'0')*10+(buff2[1]-'0');
1085                 if (j < 50) j+=100;
1086
1087                 if (i < j) return -1;
1088                 if (i > j) return 1;
1089                 }
1090         i=strcmp(buff1,buff2);
1091         if (i == 0) /* wait a second then return younger :-) */
1092                 return -1;
1093         else
1094                 return i;
1095         }
1096
1097 ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj)
1098 {
1099         return X509_time_adj(s, adj, NULL);
1100 }
1101
1102 ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *in_tm)
1103         {
1104         time_t t;
1105         int type = -1;
1106
1107         if (in_tm) t = *in_tm;
1108         else time(&t);
1109
1110         t+=adj;
1111         if (s) type = s->type;
1112         if (type == V_ASN1_UTCTIME) return ASN1_UTCTIME_set(s,t);
1113         if (type == V_ASN1_GENERALIZEDTIME) return ASN1_GENERALIZEDTIME_set(s, t);
1114         return ASN1_TIME_set(s, t);
1115         }
1116
1117 int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain)
1118         {
1119         EVP_PKEY *ktmp=NULL,*ktmp2;
1120         int i,j;
1121
1122         if ((pkey != NULL) && !EVP_PKEY_missing_parameters(pkey)) return 1;
1123
1124         for (i=0; i<sk_X509_num(chain); i++)
1125                 {
1126                 ktmp=X509_get_pubkey(sk_X509_value(chain,i));
1127                 if (ktmp == NULL)
1128                         {
1129                         X509err(X509_F_X509_GET_PUBKEY_PARAMETERS,X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY);
1130                         return 0;
1131                         }
1132                 if (!EVP_PKEY_missing_parameters(ktmp))
1133                         break;
1134                 else
1135                         {
1136                         EVP_PKEY_free(ktmp);
1137                         ktmp=NULL;
1138                         }
1139                 }
1140         if (ktmp == NULL)
1141                 {
1142                 X509err(X509_F_X509_GET_PUBKEY_PARAMETERS,X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN);
1143                 return 0;
1144                 }
1145
1146         /* first, populate the other certs */
1147         for (j=i-1; j >= 0; j--)
1148                 {
1149                 ktmp2=X509_get_pubkey(sk_X509_value(chain,j));
1150                 EVP_PKEY_copy_parameters(ktmp2,ktmp);
1151                 EVP_PKEY_free(ktmp2);
1152                 }
1153         
1154         if (pkey != NULL) EVP_PKEY_copy_parameters(pkey,ktmp);
1155         EVP_PKEY_free(ktmp);
1156         return 1;
1157         }
1158
1159 int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
1160              CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
1161         {
1162         /* This function is (usually) called only once, by
1163          * SSL_get_ex_data_X509_STORE_CTX_idx (ssl/ssl_cert.c). */
1164         return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE_CTX, argl, argp,
1165                         new_func, dup_func, free_func);
1166         }
1167
1168 int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data)
1169         {
1170         return CRYPTO_set_ex_data(&ctx->ex_data,idx,data);
1171         }
1172
1173 void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx)
1174         {
1175         return CRYPTO_get_ex_data(&ctx->ex_data,idx);
1176         }
1177
1178 int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx)
1179         {
1180         return ctx->error;
1181         }
1182
1183 void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int err)
1184         {
1185         ctx->error=err;
1186         }
1187
1188 int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx)
1189         {
1190         return ctx->error_depth;
1191         }
1192
1193 X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx)
1194         {
1195         return ctx->current_cert;
1196         }
1197
1198 STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx)
1199         {
1200         return ctx->chain;
1201         }
1202
1203 STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx)
1204         {
1205         int i;
1206         X509 *x;
1207         STACK_OF(X509) *chain;
1208         if (!ctx->chain || !(chain = sk_X509_dup(ctx->chain))) return NULL;
1209         for (i = 0; i < sk_X509_num(chain); i++)
1210                 {
1211                 x = sk_X509_value(chain, i);
1212                 CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509);
1213                 }
1214         return chain;
1215         }
1216
1217 void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *x)
1218         {
1219         ctx->cert=x;
1220         }
1221
1222 void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
1223         {
1224         ctx->untrusted=sk;
1225         }
1226
1227 void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, STACK_OF(X509_CRL) *sk)
1228         {
1229         ctx->crls=sk;
1230         }
1231
1232 int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose)
1233         {
1234         return X509_STORE_CTX_purpose_inherit(ctx, 0, purpose, 0);
1235         }
1236
1237 int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust)
1238         {
1239         return X509_STORE_CTX_purpose_inherit(ctx, 0, 0, trust);
1240         }
1241
1242 /* This function is used to set the X509_STORE_CTX purpose and trust
1243  * values. This is intended to be used when another structure has its
1244  * own trust and purpose values which (if set) will be inherited by
1245  * the ctx. If they aren't set then we will usually have a default
1246  * purpose in mind which should then be used to set the trust value.
1247  * An example of this is SSL use: an SSL structure will have its own
1248  * purpose and trust settings which the application can set: if they
1249  * aren't set then we use the default of SSL client/server.
1250  */
1251
1252 int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
1253                                 int purpose, int trust)
1254 {
1255         int idx;
1256         /* If purpose not set use default */
1257         if (!purpose) purpose = def_purpose;
1258         /* If we have a purpose then check it is valid */
1259         if (purpose)
1260                 {
1261                 X509_PURPOSE *ptmp;
1262                 idx = X509_PURPOSE_get_by_id(purpose);
1263                 if (idx == -1)
1264                         {
1265                         X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
1266                                                 X509_R_UNKNOWN_PURPOSE_ID);
1267                         return 0;
1268                         }
1269                 ptmp = X509_PURPOSE_get0(idx);
1270                 if (ptmp->trust == X509_TRUST_DEFAULT)
1271                         {
1272                         idx = X509_PURPOSE_get_by_id(def_purpose);
1273                         if (idx == -1)
1274                                 {
1275                                 X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
1276                                                 X509_R_UNKNOWN_PURPOSE_ID);
1277                                 return 0;
1278                                 }
1279                         ptmp = X509_PURPOSE_get0(idx);
1280                         }
1281                 /* If trust not set then get from purpose default */
1282                 if (!trust) trust = ptmp->trust;
1283                 }
1284         if (trust)
1285                 {
1286                 idx = X509_TRUST_get_by_id(trust);
1287                 if (idx == -1)
1288                         {
1289                         X509err(X509_F_X509_STORE_CTX_PURPOSE_INHERIT,
1290                                                 X509_R_UNKNOWN_TRUST_ID);
1291                         return 0;
1292                         }
1293                 }
1294
1295         if (purpose && !ctx->param->purpose) ctx->param->purpose = purpose;
1296         if (trust && !ctx->param->trust) ctx->param->trust = trust;
1297         return 1;
1298 }
1299
1300 X509_STORE_CTX *X509_STORE_CTX_new(void)
1301 {
1302         X509_STORE_CTX *ctx;
1303         ctx = (X509_STORE_CTX *)OPENSSL_malloc(sizeof(X509_STORE_CTX));
1304         if (!ctx)
1305                 {
1306                 X509err(X509_F_X509_STORE_CTX_NEW,ERR_R_MALLOC_FAILURE);
1307                 return NULL;
1308                 }
1309         memset(ctx, 0, sizeof(X509_STORE_CTX));
1310         return ctx;
1311 }
1312
1313 void X509_STORE_CTX_free(X509_STORE_CTX *ctx)
1314 {
1315         X509_STORE_CTX_cleanup(ctx);
1316         OPENSSL_free(ctx);
1317 }
1318
1319 int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509,
1320              STACK_OF(X509) *chain)
1321         {
1322         int ret = 1;
1323         ctx->ctx=store;
1324         ctx->current_method=0;
1325         ctx->cert=x509;
1326         ctx->untrusted=chain;
1327         ctx->crls = NULL;
1328         ctx->last_untrusted=0;
1329         ctx->other_ctx=NULL;
1330         ctx->valid=0;
1331         ctx->chain=NULL;
1332         ctx->error=0;
1333         ctx->explicit_policy=0;
1334         ctx->error_depth=0;
1335         ctx->current_cert=NULL;
1336         ctx->current_issuer=NULL;
1337         ctx->tree = NULL;
1338
1339         ctx->param = X509_VERIFY_PARAM_new();
1340
1341         if (!ctx->param)
1342                 {
1343                 X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
1344                 return 0;
1345                 }
1346
1347         /* Inherit callbacks and flags from X509_STORE if not set
1348          * use defaults.
1349          */
1350
1351
1352         if (store)
1353                 ret = X509_VERIFY_PARAM_inherit(ctx->param, store->param);
1354         else
1355                 ctx->param->flags |= X509_VP_FLAG_DEFAULT|X509_VP_FLAG_ONCE;
1356
1357         if (store)
1358                 {
1359                 ctx->verify_cb = store->verify_cb;
1360                 ctx->cleanup = store->cleanup;
1361                 }
1362         else
1363                 ctx->cleanup = 0;
1364
1365         if (ret)
1366                 ret = X509_VERIFY_PARAM_inherit(ctx->param,
1367                                         X509_VERIFY_PARAM_lookup("default"));
1368
1369         if (ret == 0)
1370                 {
1371                 X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
1372                 return 0;
1373                 }
1374
1375         if (store && store->check_issued)
1376                 ctx->check_issued = store->check_issued;
1377         else
1378                 ctx->check_issued = check_issued;
1379
1380         if (store && store->get_issuer)
1381                 ctx->get_issuer = store->get_issuer;
1382         else
1383                 ctx->get_issuer = X509_STORE_CTX_get1_issuer;
1384
1385         if (store && store->verify_cb)
1386                 ctx->verify_cb = store->verify_cb;
1387         else
1388                 ctx->verify_cb = null_callback;
1389
1390         if (store && store->verify)
1391                 ctx->verify = store->verify;
1392         else
1393                 ctx->verify = internal_verify;
1394
1395         if (store && store->check_revocation)
1396                 ctx->check_revocation = store->check_revocation;
1397         else
1398                 ctx->check_revocation = check_revocation;
1399
1400         if (store && store->get_crl)
1401                 ctx->get_crl = store->get_crl;
1402         else
1403                 ctx->get_crl = get_crl;
1404
1405         if (store && store->check_crl)
1406                 ctx->check_crl = store->check_crl;
1407         else
1408                 ctx->check_crl = check_crl;
1409
1410         if (store && store->cert_crl)
1411                 ctx->cert_crl = store->cert_crl;
1412         else
1413                 ctx->cert_crl = cert_crl;
1414
1415         ctx->check_policy = check_policy;
1416
1417
1418         /* This memset() can't make any sense anyway, so it's removed. As
1419          * X509_STORE_CTX_cleanup does a proper "free" on the ex_data, we put a
1420          * corresponding "new" here and remove this bogus initialisation. */
1421         /* memset(&(ctx->ex_data),0,sizeof(CRYPTO_EX_DATA)); */
1422         if(!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE_CTX, ctx,
1423                                 &(ctx->ex_data)))
1424                 {
1425                 OPENSSL_free(ctx);
1426                 X509err(X509_F_X509_STORE_CTX_INIT,ERR_R_MALLOC_FAILURE);
1427                 return 0;
1428                 }
1429         return 1;
1430         }
1431
1432 /* Set alternative lookup method: just a STACK of trusted certificates.
1433  * This avoids X509_STORE nastiness where it isn't needed.
1434  */
1435
1436 void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
1437 {
1438         ctx->other_ctx = sk;
1439         ctx->get_issuer = get_issuer_sk;
1440 }
1441
1442 void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx)
1443         {
1444         if (ctx->cleanup) ctx->cleanup(ctx);
1445         X509_VERIFY_PARAM_free(ctx->param);
1446         if (ctx->tree)
1447                 X509_policy_tree_free(ctx->tree);
1448         if (ctx->chain != NULL)
1449                 {
1450                 sk_X509_pop_free(ctx->chain,X509_free);
1451                 ctx->chain=NULL;
1452                 }
1453         CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE_CTX, ctx, &(ctx->ex_data));
1454         memset(&ctx->ex_data,0,sizeof(CRYPTO_EX_DATA));
1455         }
1456
1457 void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth)
1458         {
1459         X509_VERIFY_PARAM_set_depth(ctx->param, depth);
1460         }
1461
1462 void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags)
1463         {
1464         X509_VERIFY_PARAM_set_flags(ctx->param, flags);
1465         }
1466
1467 void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, time_t t)
1468         {
1469         X509_VERIFY_PARAM_set_time(ctx->param, t);
1470         }
1471
1472 void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx,
1473                                   int (*verify_cb)(int, X509_STORE_CTX *))
1474         {
1475         ctx->verify_cb=verify_cb;
1476         }
1477
1478 X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx)
1479         {
1480         return ctx->tree;
1481         }
1482
1483 int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx)
1484         {
1485         return ctx->explicit_policy;
1486         }
1487
1488 int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name)
1489         {
1490         const X509_VERIFY_PARAM *param;
1491         param = X509_VERIFY_PARAM_lookup(name);
1492         if (!param)
1493                 return 0;
1494         return X509_VERIFY_PARAM_inherit(ctx->param, param);
1495         }
1496
1497 X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx)
1498         {
1499         return ctx->param;
1500         }
1501
1502 void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param)
1503         {
1504         if (ctx->param)
1505                 X509_VERIFY_PARAM_free(ctx->param);
1506         ctx->param = param;
1507         }
1508
1509 IMPLEMENT_STACK_OF(X509)
1510 IMPLEMENT_ASN1_SET_OF(X509)
1511
1512 IMPLEMENT_STACK_OF(X509_NAME)
1513
1514 IMPLEMENT_STACK_OF(X509_ATTRIBUTE)
1515 IMPLEMENT_ASN1_SET_OF(X509_ATTRIBUTE)