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