LCOV - code coverage report
Current view: top level - third_party/openssl/crypto/x509 - x509_vfy.c (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 289 1029 28.1 %
Date: 2015-10-10 Functions: 21 70 30.0 %

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

Generated by: LCOV version 1.10